Avatar billede x-masman Nybegynder
23. september 2003 - 23:32 Der er 26 kommentarer og
2 løsninger

Marker en celle eller et item i en listbox

Hej

Simpelt spm.
Har siddet lidt og rodet rundt, men kan simpelt hen ikke finde det.

I TStringGrid:
Hvordan markere jeg den celle der er [k,r]

I TListBox:
Hvordan markere jeg item med index i?
Avatar billede Slettet bruger
24. september 2003 - 07:23 #1
I en Listbox markere du en item med ItemIndex f.eks.

Listbox1.ItemIndex := 1;
Avatar billede x-masman Nybegynder
24. september 2003 - 09:03 #2
også er det item med index i markeret på skærmen eller hvad?

Ved du hvordan det gøres i StringGrid?
Avatar billede Slettet bruger
24. september 2003 - 09:39 #3
Ved ik om det virker, men du kan prøve:

http://www.swissdelphicenter.ch/torry/showcode.php?id=349
Avatar billede x-masman Nybegynder
24. september 2003 - 10:19 #4
Jeg prøver når jeg kommer hjem.

Jeg ved godt at man ikke må reklamere for spm, men nu når du plejer at svare på delphi spm, så .... Kender du noget til det her:

http://www.eksperten.dk/spm/404828
Avatar billede Slettet bruger
24. september 2003 - 11:38 #5
Nej, desværre... Har kun Delphi 7 Personal (Uden Database komponenter), så har ik haft mulighed for at "lege" med databaser.
Avatar billede pigbear Nybegynder
24. september 2003 - 15:26 #6
du finder det markerede element ved i listbox1click at skrive:

showmessage('du klikkede på '+listbox1.items.strings[listbox1.itemindex]);
Avatar billede x-masman Nybegynder
24. september 2003 - 16:12 #7
ja. Men nu er det fordi at jeg kender et index og vil have det markeret. Det er altså ikke brugeren, der skal markere.
Avatar billede athlon-pascal Juniormester
24. september 2003 - 16:50 #8
StringGrid1.Col := 7;
StringGrid1.Row := 3;

Så vil celle(7, 3) (nulbaseret, husk det) være markeret.
Du kan også bruge dem omvendt:

ShowMessage(IntToStr(StringGrid1.Col), IntToStr(StringGrid1.Row));
Avatar billede athlon-pascal Juniormester
24. september 2003 - 16:50 #9
Det var naturligvis et svar :-)
Avatar billede athlon-pascal Juniormester
24. september 2003 - 16:51 #10
Rettelse:
Ikke

ShowMessage(IntToStr(StringGrid1.Col), IntToStr(StringGrid1.Row));

men

ShowMessage(IntToStr(StringGrid1.Col) + ' x ' + IntToStr(StringGrid1.Row));
Avatar billede x-masman Nybegynder
24. september 2003 - 19:42 #11
Athlon er det så sådan at brugeren kan se den er markeret?
Avatar billede athlon-pascal Juniormester
24. september 2003 - 19:55 #12
I stringgridens Options sætter du goDrawFocusSelected til true, så kan man :-)
Avatar billede x-masman Nybegynder
24. september 2003 - 22:09 #13
Den kender ikke goDrawFocusSelected. Jeg bruger delphi 4.
Avatar billede Slettet bruger
24. september 2003 - 22:11 #14
Den er i Object Inspectoren, hvis du klikker på + ud for Options :-)
Avatar billede x-masman Nybegynder
24. september 2003 - 22:49 #15
ha ha. Jeg kan alligevel ikke se det fordi der er farver i griden så selected bliver overmalet. Kan jeg ikke sætte en ramme omkring istedet? Det samme gælder i øvrigt listen.
Avatar billede Slettet bruger
25. september 2003 - 09:38 #16
Tror man kan lave det med canvas.. måske:

procedure TStringGrid1DrawCell(....);
begin
if (StringGrid1.Row = ARow) and (StringGrid1.Col = ACol) then
begin
  StringGrid1.Canvas.Pen.Color := clRed;
  StringGrid1.Canvas.Rectangle(Rect);
end;
end;
Avatar billede Slettet bruger
25. september 2003 - 14:41 #17
Ellers kan du jo bare farve den markede celle med en anden farve sådan:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (ACol = StringGrid1.Col) and (ARow = StringGrid1.Row) then
  begin
    StringGrid1.Canvas.Brush.Color := clRed;
    StringGrid1.Canvas.Rectangle(Rect);
    StringGrid1.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, StringGrid1.Cells[ACol, ARow]);
  end;
end;
Avatar billede x-masman Nybegynder
25. september 2003 - 14:44 #18
Ja, men det ønsker jeg ikke, så jeg prøver lige det med rammen
Avatar billede athlon-pascal Juniormester
25. september 2003 - 14:54 #19
Prøv at kigge på State: TGridDrawState,
if (ACol = StringGrid1.Col) and (ARow = StringGrid1.Row) then
kan erstattes med noget simplere :-)
Avatar billede athlon-pascal Juniormester
25. september 2003 - 14:55 #20
I øvrigt kan StringGrid1.Canvas.DrawFocusRect; anbefales når rammen skal tegnes :-)
Avatar billede Slettet bruger
25. september 2003 - 16:16 #21
Kan se den procedure jeg lavede længere oppe ikke virker, men med athlons.. DrawFocusRect under StringGrid1.Canvas.Rectangle(Rect); virker den vist som den skal :-)
Avatar billede x-masman Nybegynder
26. september 2003 - 11:41 #22
Ok. Nu virker det sgu. Tak for hjælpen. Men rammen er rimelig utydelig. Er der nogen måde, hvorpå man kan gøre rammen tyk og fed?
Avatar billede Slettet bruger
26. september 2003 - 15:37 #23
Det her skulle gøre den dobbelt så tyk:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (ACol = StringGrid1.Col) and (ARow = StringGrid1.Row) then
  begin
    StringGrid1.Canvas.Pen.Color := clRed;
    StringGrid1.Canvas.Pen.Width := 2;
    StringGrid1.Canvas.Rectangle(Rect.Left+1,Rect.Top+1,Rect.Right,Rect.Bottom);
    StringGrid1.Canvas.DrawFocusRect(Rect);
  end;
end;
Avatar billede x-masman Nybegynder
26. september 2003 - 20:34 #24
Hej. Smider lige nogle flere point, da problemet ikke var så simpelt som først antaget. hejhej det kan jeg ikke rigtig få til at fungere. Hvis jeg i min TStringGrid1DrawCell har jeg:

Canvas.Brush.color := BGColor;
      Canvas.Font.Color := FColor;
    end;
      Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[acol, arow]);
      Canvas.FrameRect(Rect);
      if (TidGrid.row = Arow) and (tidGrid.col = Acol) then
      begin
        TidGrid.Canvas.Pen.Color := clBlack;
        TidGrid.Canvas.Pen.Width := 5;
        TidGrid.Canvas.DrawFocusRect(Rect);
      end;

Men rammen bliver ikke mere markant. ?!?!?
Avatar billede Slettet bruger
26. september 2003 - 21:25 #25
Prøv det her:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
R:TRect;
begin
  with StringGrid1 do
  begin
  Canvas.Brush.color := clRed;
  Canvas.Font.Color := clBlack;
  Canvas.FillRect(Rect);
  if (Row = ARow) and (Col = ACol) then
  begin
    Canvas.Pen.Color := clBlack;
    Canvas.Pen.Width := 5;
    Canvas.Rectangle(Rect.Left+2,Rect.Top+2,Rect.Right-2,Rect.Bottom-2);
    Canvas.DrawFocusRect(Rect);
  end;
  R := Rect;
  Inc(R.Left,5);
  Inc(R.Top,5);
  Dec(R.Right,5);
  Dec(R.Bottom,5);
  Canvas.TextRect(R, R.Left, R.Top, Cells[acol, arow]);
  end;
end;
Avatar billede Slettet bruger
01. oktober 2003 - 14:59 #26
Sker der mere??
Avatar billede x-masman Nybegynder
01. oktober 2003 - 17:06 #27
Ja. Undskyld jeg ikke har svaret, men jeg har simpelt hen ikke haft tid til at komme videre med projektet, hvilket betyder at jeg ikke har afprøvet det. Jeg skal nok svare så snart jeg får tid til at afprøve det.
Avatar billede x-masman Nybegynder
22. oktober 2003 - 23:19 #28
Så fik jeg endelig tid til at kigge på det. Jeg brugte næsten din løsning hejhej, men jeg brugte framerect istedet for textrect.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester