pelsta napisał(a)
Ale przed rysowaniem możesz przecież zmienić rozmiar obszaru (InflateRect) czy położenie obszaru (OffsetRect)
O widzisz, a tego jeszcze nie robiłem :)
Czyli najlepszym sposobem jest stworzenie nowej zmiennej w której będzie się przechowywać zmodyfikowanyRect
z parametru;
Nie miałem czasu do tej pory siąść nad programem więc jeszcze nie testowałem, ale jak wrócę z cmentarza to sprawdzę wszystkie podane przez Was kody; Dzięki chłopaki;
EDIT: No, jestem już; Muszę powiedzieć, że jak pisałem ten temat to chyba już za późno było, by cokolwiek urodzić; Teraz posiedziałem dosłownie chwilkę i udało się zrobić prosty, jeszcze zbyt wolny algorym ale już jestem na dobrej drodze; Zrobiłem to łączenie - kod przedstawiam poniżej (malowanie samego tła):
with TCustomListBox(Control).Canvas do
begin
{ CHECK ITEM SELECTED STATE }
case odSelected in State of
{ SELECTED }
True: begin
{ BACKGROUND }
Pen.Color := clBlack;
Brush.Color := clMenuHighlight;
Rectangle(Rect);
Pen.Color := clMenuHighlight;
{ CHECK UPPER ITEM EXISTS & SELECTED STATE }
if Index in [1 .. TCustomListBox(Control).Items.Count - 1] then
if TCustomListBox(Control).Selected[Index - 1] then
{ DELETE ITEMS UPPER COMMOM LINE }
Rectangle(Rect.Left + 1, Rect.Top - 1, Rect.Right - 1, Rect.Top + 1);
{ CHECK LOWER ITEM EXISTS & SELECTED STATE }
if Index in [0 .. TCustomListBox(Control).Items.Count - 2] then
if TCustomListBox(Control).Selected[Index + 1] then
{ DELETE ITEMS LOWER COMMON LINE }
Rectangle(Rect.Left + 1, Rect.Bottom - 1, Rect.Right - 1, Rect.Bottom + 1);
end;
{ UNSELECTED }
False: begin
{ BACKGROUND }
Pen.Color := clWhite;
Brush.Color := clWhite;
Rectangle(Rect);
Pen.Color := clBlack;
{ CHECK UPPER ITEM EXISTS & SELECTED STATE }
if Index in [1 .. TCustomListBox(Control).Items.Count - 1] then
if TCustomListBox(Control).Selected[Index - 1] then
{ ADD ITEMS UPPER COMMON LINE}
begin
MoveTo(Rect.Left, Rect.Top - 1);
LineTo(Rect.Right, Rect.Top - 1);
end;
{ CHECK LOWER ITEM EXISTS & SELECTED STATE }
if Index in [0 .. TCustomListBox(Control).Items.Count - 2] then
if TCustomListBox(Control).Selected[Index + 1] then
{ ADD ITEMS LOWER COMMON LINE }
begin
MoveTo(Rect.Left, Rect.Bottom);
LineTo(Rect.Right, Rect.Bottom);
end;
end;
end;
{ DELETE OLD FOCUS RECT }
if odFocused in State then
begin
Pen.Color := Pen.Color xor $FFFFFF;
DrawFocusRect(Rect);
end;
end;
Na razie KISS & DRY w nim nie obowiązuje :) Efekt wykorzystania kodu:
Na pierwszy rzut oka działa, klikając na poszczególne itemy pięknie się łączą, obsługa klawiatury też jest w porządku (same strzałki a także zaznaczając kilka pozycji z shift'em); Wszystko by było dobrze, gdyby nie to, że jak się wciśnie LPM na jednym itemie i przesuwa w górę lub w dół zaznaczając kilka kolejnych - znowu rysowane są linie łączące... Ale dopiero od tego o 2 pozycje wyżej lub niżej tego, nad którym wcisnęło się przycisk;
Żeby to zrozumieć, przedstawiam zrzut programu, na którym widać wadę; Lista ma sześć pozycji - wcisnąłem LPM nad ostatnim i zaznaczając wszystkie przesuwając kursor w górę puściłem LPM nad pierwszym na liście:
Wie ktoś dlaczego tak się dzieje? Ten jeden wyżej malowany jest dobrze, ale kolejne już nie; To tak jakby wykonywała się metoda malująca dla nich, ale bez warunku sprawdzającego to, czy usuwać lub dodawać górną czy dolną cześć ramki...