30. maj 2002 - 01:07Der er
14 kommentarer og 1 løsning
Endnu en svær.. Listboxe denne gang..
Hej igen.
Denne gang springer vi på Listbox'en. Måske er det ikke svaret, men det jeg er ude efter er en listbox hvor baggrundsfarven er fx. sort, teksten er hvid, og - her kommer det svære - den bjælke (eller hvad man kalder den) der viser hvilket element på listen der er markeret skal være grøn - eller hvilken som helst anden farve end standardfarven, som er fastsat af Windows.
Kunne ikke lige bedømme hvor høj sværhedsgraden er på spørgsmålet, så der er 100 points til et godt svar. Hvis den er for let (eller svær), er jeg også åben overfor andre forslag til hvordan man får en listbox til at se lidt smart ud på en form som ikke har Windows' standardfarver...
Undskyld, jeg burde måske nævne at jeg har lavet noget af det, men jeg var lige lidt for doven til at kopiere koden herind. Det er kun den svære del (!) jeg er ude efter... Sorry hermandsen, tak alligevel..
Problemet er, at jeg kigger i hjælpen i Delphi, men når de begynder at snakke om Wincontrol wrappers, etc. går min hjerne i baglås. Jeg er næsten kommet igennem min (efterhånden anselige) stak Delphibøger, men ingen af dem beskriver noget så specielt som dette..
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with Control as TListbox do begin //Slet gammel tegning Canvas.FillRect (Rect); //Skriv teksten for dem der ikke er valgt Canvas.TextOut(Rect.Left, Rect.Top, Listbox1.Items[Index]);
//hvis vi skal tegne et valgt element if (odFocused in State) and (odSelected in State) then begin //Først sætter vi farven på canvas'en Canvas.Brush.Color := clGreen; Canvas.Pen.Color := clGreen; //Så tegner vi den firkant som skal afgrænse teksten i din ListBox Canvas.Rectangle(Rect); //Til sidst skriver vi teksten Canvas.TextOut(Rect.Left, Rect.Top, Listbox1.Items[Index]); end; end; end;
Ah, nice! :) Ok, Lige 2 spørgsmål inden jeg shipper pointsene, hvis du er frisk.. lbOwnerDrawFixed lbOwnerDrawVariable.. Hvad er forskellen? Den skal være variabel, hvis jeg vil stoppe bitmaps i min listbox også? ..og fontfarven på den markerede linie? Kan den ændres? Jeg mener.. Selvfølgelig, men hvordan? (Det første er sådan set bare - mere eller mindre et ja/nej sprgsml.) Ok, jeg venter bare lige på dit svar, så kommer pointsene flyvende. Hvis du ikke gider svare er det ok.. Klokken er mange.. Bare send et tomt svar, så kommer de alligevel.. ;)
Jeg ved faktisk ikke helt hvad forskellen er... Slå det op i hjælpen! ;)
Det var et lille eksempel jeg fandt på nettet, og så videre udviklede jeg det bare! Prøv at gå ind på google og søg på "ListBox1DrawItem" det får du faktisk RET mange gode sider af! ;)
Nå, men det var det med text-farven... Det eneste jeg egentlig har ændret er der hvor vi ser på om den er valgt, og så sætter jeg Canvas.Font.Color... ;)
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with Control as TListbox do begin //Slet gammel tegning Canvas.FillRect (Rect); //Skriv teksten for dem der ikke er valgt Canvas.TextOut(Rect.Left, Rect.Top, Listbox1.Items[Index]);
//hvis vi skal tegne et valgt element if (odFocused in State) and (odSelected in State) then begin //Først sætter vi farven på canvas'en Canvas.Brush.Color := clGreen; Canvas.Pen.Color := clGreen; //Så tegner vi den firkant som skal afgrænse teksten i din ListBox Canvas.Rectangle(Rect); //Så sætter vi farven på den tekst der er markeret Canvas.Font.Color := clRed; //Til sidst skriver vi teksten Canvas.TextOut(Rect.Left, Rect.Top, Listbox1.Items[Index]); end; end; end;
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.