Einzelnen Beitrag anzeigen

Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Problem mit Darstellung einer CombBox in StringGrid mit "csOwnerDrawFixed"

  Alt 9. Jun 2013, 10: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! <<
  Mit Zitat antworten Zitat