Kolorowanie zaznaczonego wiersza w ListBox

0

znalazłem kod który koloruje mi wiersze w listboxsie:

 var
   myColor: TColor;
   myBrush: TBrush;
begin
   myBrush := TBrush.Create;
   with (Control as TListBox).Canvas do
   begin

myColor := clYellow;

     myBrush.Style := bsSolid;
     myBrush.Color := myColor;
     Windows.FillRect(handle, Rect, myBrush.Handle) ;
     Brush.Style := bsClear;
     TextOut(Rect.Left, Rect.Top,
             (Control as TListBox).Items[Index]) ;

ale koloruje mi on wszystko co wpiszę do listboxa. jak zrobić żeby kolorowało tylko po naciśnięciu buttona, lub po podwójnym kliknięciu myszką?

2

Trzeba przy każdym wierszu zapamiętać pokolorowany czy nie, najprościej: pokolorowano - ListBox1.Items.Objects[Index]:=ListBox1; nie pokolorowano - ListBox1.Items.Objects[Index]:=nil; czy pokolorowano - if ListBox1.Items.Objects[Index]<>nil then

0

nie bardzo rozumiem, chodziło mi o to jak wywołać akcję -> kliknięcie buttonem/myszką gdy zaznaczony jest element listboxa(wiersz), a ten element po kliknięciu/naciśnięciu buttona zmieni kolor na żądany.

2

Nie wiem jak kolorujesz te Itemy. Ale przecież typ TOwnerDrawState zdarzenia OnDrawItem mozna porównać z odSelected. Jeżeli dobrze zrozumiałem co chcesz osiągnąć.

1

@zeberko - jeśli chcesz kolorować tylko zaznaczony item to zrób jak napisał @olesio - sprawdź czy enum odSelected znajduje się w parametrze State;

Jeśli każda linia ma być specjalnie malowana, to skorzystaj z podpowiedzi @_13th_Dragon i informacje o kolorze czy innych stylach tego itema możesz przechować we właściwości Items.Objects i pobierać je podczas malowania itema, aby stosownie ustalić kolory;

Jeżeli natomiast chcesz usunąć ramkę focusa, wystarczy wykorzystać metodę DrawFocusRect kanwy ListBoxa;


Przykładowy kod malujący itemy:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  with TListBox(Control).Canvas do
  begin
    if odSelected in State then
    begin
      // item is selected
      Pen.Color := clMenuHighlight;
      Brush.Color := clMenuHighlight;
      Font.Color := clWhite;
    end
    else
    begin
      // item is not selected
      Pen.Color := clWhite;
      Brush.Color := clWhite;
      Font.Color := clBlack;
    end;

    // background
    Rectangle(Rect);
    // text
    TextOut(Rect.Left + 4, Rect.Top + 3, TListBox(Control).Items[Index]);

    // focus frame
    if odFocused in State then
    begin
      Pen.Color := Pen.Color xor $FFFFFF;
      DrawFocusRect(Rect);
    end;
  end;
end;

To kod na wypadek, gdybyś znów chciał wpleść funkcje WinAPI do zdarzenia z VCL; Klasa TCanvas posiada sporo metod, którymi możesz bez problemu wypełniać dane obszary, wypisywać tekst, malować grafiki i tak dalej.

0

@furious programming: wiesz doskonale, że nie podawał bym czegoś, czego sam nie sprawdziłem. Zanim odpisałem na ten wątek spojrzałem do Helpa od Delphi 7.

1 użytkowników online, w tym zalogowanych: 0, gości: 1