Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

StringGrid in Delphi (Version 4)

DieterPeter / 1 Antworten / Baumansicht Nickles

Hallo Board-Leser,

ich möchte in einem String-Grid auch Bitmaps in Zellen anzeigen lassen, habe aber keine Ahnung, wie's geht. Kann mir jemand helfen?

bei Antwort benachrichtigen
Boller DieterPeter „StringGrid in Delphi (Version 4)“
Optionen

Listboxen mit Bitmaps und mehrzeiligem Text
Delphi 1-2
Immer wieder erforderlich und nirgends richtig beschrieben ist das Verfahren, in List- und ComboBox-Feldern sowohl Text als auch Bitmaps darzustellen. Noch dazu, wenn der Text in mehreren Zeilen dargestellt werden soll. Abhilfe schafft die Fähigkeit dieser Listenelemente, mittels des Ereignisses OnOwnerDraw, die einzelnen Zeilen selbst darzustellen. Um das Projekt an einem Beispiel nachzuvollziehen, erstellen Sie drei Image-Komponenten und laden hier unterschiedliche Bilder über die Picture-Eigenschaft. Legen Sie dazu noch eine leere ListBox sowie eine ComboBox-Komponente auf Ihr Formular. Setzen Sie bei beiden Listenelementen die Eigenschaft "Style" auf "lbOwnerDrawFixed" respektive "csOwnerDrawFixed". Füllen Sie dann beide Komponenten im OnCreate-Ereignis des Formulars mit den Bitmaps und passendem Text:

ListBox1.Items.AddObject('Erstes Bitmap', Image1.Picture.Bitmap);
ListBox1.Items.AddObject('Zweites Bitmap', Image2.Picture.Bitmap);
ListBox1.Items.AddObject('Dies ist'#13'das dritte Bitmap ', Image3.Picture.Bitmap);
Anschließend erstellen Sie die Behandlungsroutine des OnDrawItem-Ereignisses:

procedure TForm1.ListBox1DrawItem(Control: TWinControl;
Index: Integer;Rect: TRect; State: TOwnerDrawState);
var Bitmap: TBitmap;
OutChar: PChar;
TS: TStrings;
CV: TCanvas;
begin
If Control is TCustomListBox Then Begin
TS := TCustomListBox(Control).Items;
CV := TCustomListBox(Control).Canvas;
End Else If Control is TCustomComboBox Then Begin
TS := TCustomComboBox(Control).Items;
CV := TCustomComboBox(Control).Canvas;
End;
OutChar := StrAlloc(length(TS.Strings[Index]) + 1);
StrPCopy(OutChar, TS.Strings[Index]);
with CV do begin
FillRect(Rect);
if TS.Objects[Index] nil then begin
Bitmap := TS.Objects[Index] as TBitmap;
BrushCopy(Bounds(Rect.Left + 2, Rect.Top + 2,
Bitmap.Width, Bitmap.Height), Bitmap,
Bounds(0, 0, Bitmap.Width, Bitmap.Height),
Bitmap.Canvas.Pixels[0,Bitmap.Height]);
end;
Rect.Left := Rect.Left + Bitmap.Width + 4;
Rect.Bottom := Rect.Top + Bitmap.Height + 4;
DrawText(Handle, OutChar, StrLen(OutChar), Rect, dt_WordBreak);
StrDispose(OutChar);
end;
end;
Anmerkung: Diese Routine ist so flexibel gehalten, daß Sie sie für beliebige Combo- und ListBox-Komponenten verwenden können, sogar solche mit Datenbank-Anschluß. Wollen Sie die Größe der einzelnen Zeilen des Listenfeldes verändern, so setzen Sie die Eigenschaft ItemHeight. Soll diese variabel sein, so setzen Sie die Eigenschaft Style auf csOwnerDrawVariable respektive lbOwnerDrawVariable. Im Ereignis OnMeasureItem werden Sie dann bei jedem Element aufgefordert, dessen Höhe - mit Hilfe des Referenzparameters Height - anzugeben.

bei Antwort benachrichtigen