OnMeasureItem i Items.Objects

OnMeasureItem i Items.Objects
Johny_Morfina
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 448
0

robię sobie listbox, w którym będę wyświetlał rożne obiekty.
obiekty maja właściwość text, która może zawierać wielolinijkowy tekst (niesamowite!)

robię tak:

Kopiuj
 
procedure TfrmNewRozmowa.btnSendTekstClick(Sender: TObject);
begin
  Listbox1.items.addobject(obiekt.nazwa,obiekt); 
  showmessage('jakis komunikat');
end;

procedure TfrmNewRozmowa.Listbox1MeasureItem(Control: TWinControl; Index: Integer; var Height: Integer);
var obiekt: TMojObiekt
begin
  // dlaczego tu jeszcze nie ma obiektu??????
  // tzn Listbox1.Items.Objects[index] = NIL.
  if Listbox1.Items.Objects[index] is TMojObiekt then begin
    obiekt := TMojObiekt(Listbox1.Items.Objects[index]);
    height := (obiekt.text.Count+1) * WysokoscLinijkiTekstu;
  end;
end;

Niestety Listbox1MeasureItem jest wywoływane w trakcie addobject jeszcze przed wstawieniem obiektu do Listbox1.Items.Objects....
Jak zatem mam wyznaczyć sobie wysokość itema jeśli jeszcze nie mam obiektu??? zakładam, że taki obiekt może mieć np rozmiar czcionki, co będzie miało istotny wpływ na wysokość...

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
2
Kopiuj
procedure TfrmNewRozmowa.btnSendTekstClick(Sender: TObject);
begin
  Listbox1.Tag:=(obiekt.text.Count+1) * WysokoscLinijkiTekstu; // lub jakaś zmienna w klasie
  Listbox1.items.addobject(obiekt.nazwa,obiekt); 
end;
 
procedure TfrmNewRozmowa.Listbox1MeasureItem(Control: TWinControl; Index: Integer; var Height: Integer);
begin
  height := Listbox1.Tag; // lub jakaś zmienna w klasie
end;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.