Avatar billede Max Novice
30. maj 2002 - 01:07 Der 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...

Mvh.
/Mnc
Avatar billede hermandsen Juniormester
30. maj 2002 - 01:12 #1
For at ændre tekst-farven er det bare at sætte den til noget andet i property'en Font->Color

Baggrunden skal bare sættes med property Color...
Avatar billede hermandsen Juniormester
30. maj 2002 - 01:16 #2
Altså:

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListBox1.Color := clBlack;
  ListBox1.Font.Color := clWhite;
end;
Avatar billede Max Novice
30. maj 2002 - 01:18 #3
Jeps.. Det er "markøren" der giver mig grå hår...
Avatar billede hermandsen Juniormester
30. maj 2002 - 01:18 #4
Ellers er jeg ret sikker på at du skal kigge på OnDrawItem... Jeg har aldrig selv leget så meget med det, men prøv dig lidt frem... :)
Avatar billede Max Novice
30. maj 2002 - 01:20 #5
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..
Avatar billede hermandsen Juniormester
30. maj 2002 - 01:30 #6
Hehe... Tænkte også det det ville være for let til 100 point! ;)

Prøv at kigge i eksemplet der er for OnDrawItem for en TListBox... Måske det ka' hjælpe dig lidt af vejen...
Avatar billede Max Novice
30. maj 2002 - 01:30 #7
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..
Avatar billede hermandsen Juniormester
30. maj 2002 - 02:19 #8
Det her virker:

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;

//hermandsen
Avatar billede Max Novice
30. maj 2002 - 02:31 #9
Æhmn, er det bare mig, eller er det ikke meningen den skulle blive grøn? Proppes bare i OnDrawItem event'en på min ListBox1.. Min er blå..
Avatar billede hermandsen Juniormester
30. maj 2002 - 02:37 #10
What?!?

Arh... Sorry...

Sæt lige ListBox1.Style til lbOwnerDrawFixed... ;)
Avatar billede Max Novice
30. maj 2002 - 02:44 #11
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.. ;)
Avatar billede hermandsen Juniormester
30. maj 2002 - 02:52 #12
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;
Avatar billede Max Novice
30. maj 2002 - 02:58 #13
Ok, mange tak. Her kommer de endelig.. ;)
Avatar billede hermandsen Juniormester
30. maj 2002 - 03:04 #14
Hehe... Jamen selv tak da... God nat! ;)
Avatar billede Max Novice
30. maj 2002 - 03:06 #15
'Natnat..
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