Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
Delphi XE2 Professional
|
AW: Problem mit Darstellung einer CombBox in StringGrid mit "csOwnerDrawFixed"
9. Jun 2013, 11:31
Viel mach ich da nicht:
Delphi-Quellcode:
procedure TMainForm.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
//Wenn es sich nicht um die 3. Spalte und Zeilen ab der Ersten handelt, dann
//die Procedure beenden
If (ACol <> 3) or (ARow < 1) then
exit;
//
Zuege_zeichnen(StringGrid.Canvas, Rect, StringGrid.Cells[ACol, ARow]);
end;
und hier Zuege_zeichnen:
Delphi-Quellcode:
procedure TMainForm.Zuege_zeichnen(const Canvas: TCanvas; const Rect: TRect;
const S: String);
const
const_Abstand = 2;
var
i : Integer;
mit_Zug : Boolean;
Bitmap_Zug : TBitmap;
Rect_Zug : array[1..3] of TRect;
Rect_Bitmap: TRect;
StringList : TStringList;
begin
//Bitmap erzeugen
Bitmap_Zug := TBitmap.Create;
//StringList erzeugen
StringList := TStringList.Create;
//StringList beschreiben
StringList.Delimiter := ',';
StringList.StrictDelimiter := true;
StringList.DelimitedText := S;
try
//Bitmap laden
Bitmap_Zug.LoadFromResourceName(HInstance, 'ZZA_RES');
//Bitmap-Rect definieren
Rect_Bitmap := Bounds(0, 0, Bitmap_Zug.Width, Bitmap_Zug.Height);
//
Canvas.FillRect(Rect);
//Umrandung leeren
Canvas.Pen.Style := psClear;
//Pinsel leeren
Canvas.Brush.Style := bsClear;
If StringList.Count >= 1 then
begin
//Zug links berechnen und anzeigen
i := (Rect.Width - (2 * const_Abstand) - (3 * Bitmap_Zug.Width)) div 2;
Rect_Zug[1].Left := Rect.Left + i;
Rect_Zug[1].Top := Rect.Top + (Rect.Height - Rect_Bitmap.Height) div 2;
Rect_Zug[1].Width := Rect_Bitmap.Width;
Rect_Zug[1].Height := Rect_Bitmap.Height;
//Zug-links: prüfen ob angezeigt werden soll
mit_Zug := StrToBoolDef(StringList.Strings[0], false);
If mit_Zug then
Canvas.BrushCopy(Rect_Zug[1], Bitmap_Zug, Rect_Bitmap, clWhite);
end;
If StringList.Count >= 2 then
begin
//Zug mitte berechnen und anzeigen
Rect_Zug[2].Left := Rect_Zug[1].Right + const_Abstand;
Rect_Zug[2].Top := Rect_Zug[1].Top;
Rect_Zug[2].Width := Rect_Bitmap.Width;
Rect_Zug[2].Height := Rect_Bitmap.Height;
//Zug-mitte: prüfen ob angezeigt werden soll
mit_Zug := StrToBoolDef(StringList.Strings[1], false);
If mit_Zug then
Canvas.BrushCopy(Rect_Zug[2], Bitmap_Zug, Rect_Bitmap, clWhite);
end;
If StringList.Count >= 3 then
begin
//Zug rechts berechnen und anzeigen
Rect_Zug[3].Left := Rect_Zug[2].Right + const_Abstand;
Rect_Zug[3].Top := Rect_Zug[1].Top;
Rect_Zug[3].Width := Rect_Bitmap.Width;
Rect_Zug[3].Height := Rect_Bitmap.Height;
//Zug-rechts: prüfen ob angezeigt werden soll
mit_Zug := StrToBoolDef(StringList.Strings[2], false);
If mit_Zug then
Canvas.BrushCopy(Rect_Zug[3], Bitmap_Zug, Rect_Bitmap, clWhite);
end;
finally
//StringList löschen und freigeben
FreeAndNil(StringList);
//Bitmap löschen und freigeben
FreeAndNil(Bitmap_Zug);
end;
end;
Die letzte Procedure nutze ich auch für eine Combobox, daher ist diese allgemein gehalten
(deswegen wird Canvas übergeben)
mfg
Helmi
>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
|
|
Zitat
|