TStringgridDrawCell mit Endlosschleife

Rund um die LCL und andere Komponenten
Antworten
Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

TStringgridDrawCell mit Endlosschleife

Beitrag von Luckner »

Hallo,
ich lese aus einer Datenbank, unter Anderen, auch ein Memo-Feld aus und möchte ich diese Daten in einem TStringgrid darstellen:

Code: Alles auswählen

    while not DataModuleDokumente1.ZQueryPositionenTemp.Eof do
    begin
       StringGridPositionen.Cells[0, DataModuleDokumente1.ZQueryPositionenTemp.RecordCount]:= IntToStr(DataModuleDokumente1.ZQueryPositionenTemp.RecordCount);
       StringGridPositionen.Cells[1, DataModuleDokumente1.ZQueryPositionenTemp.RecNo]:= DataModuleDokumente1.ZQueryPositionenTempANZAHL.asString;
       StringGridPositionen.Cells[2, DataModuleDokumente1.ZQueryPositionenTemp.RecNo]:= DataModuleDokumente1.ZQueryPositionenTempARTIKELNR.asString;
       StringGridPositionen.Cells[3, DataModuleDokumente1.ZQueryPositionenTemp.RecNo]:= DataModuleDokumente1.ZQueryPositionenTempBESCHREIBUNG.AsString;
       meinstring := DataModuleDokumente1.ZQueryPositionenTempBESCHREIBUNG.AsString;

       DataModuleDokumente1.ZQueryPositionenTemp.Next;
    end; 
Damit der Inhalt des Memos auch in diesem Grid dargestellt wird benutze in noch folgende Routinen:

Code: Alles auswählen

procedure TFrameDokumente.StringGridPositionenPrepareCanvas(Sender: TObject; aCol, aRow: Integer; aState: TGridDrawState);
var
  Ts: TTextStyle;
begin
  if aCol = 3 then //In dieser Spalte wird das Memo dargestellt
  begin
    Ts := StringGridPositionen.Canvas.TextStyle;
    Ts.SingleLine := false;
    Ts.Wordbreak := true;
    StringGridPositionen.Canvas.TextStyle := Ts;
  end;
end;
und

Code: Alles auswählen

procedure TFrameDokumente.StringGridPositionenDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState);
begin
  DrawText(self.Canvas.Handle, PChar(meinstring), length(meinstring), aRect, DT_CalcRect or DT_WordBreak or DT_NoClip);
  StringGridPositionen.RowHeights[1]:=aRect.Bottom;
end;
Die Darstellung funktioniert auch soweit, bis auf den Punkt, dass rechts ein Scrollbalken in diesem TStringgrid erscheint und durch das Flackern gibt es eine Hinweis auf eine Endloseschleife. Programm läßt sich nur durch den Tastmanager beenden. Weiß Jemand warum?

Gruß, Luckner

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: TStringgridDrawCell mit Endlosschleife

Beitrag von wp_xyz »

Nein, du kannst in OnDrawCell nicht die Zeilenhöhe verändern, da dies eine erneute Zeichenoperation anstößt. Du musst stattdessen bereits in der Schleife, in der die Datenbank-Records ausgelesen werden, die Zeilenhöhe messen und die RowHeight entsprechend setzen. Allerdings hast du dort im allgemeinen keinen gültigen Canvas, ich würde raten, ein temporäres Bitmap mit paar Pixeln Größe zu erzeugen und dessen Canvas zu verwenden, um die Texthöhe zu bestimmen. Aber: Manche Memos können extrem lang sein, so dass deine Zeile höher wird als der Bildschirm - ich würde eine maximale Zeilenhöhe definieren und den Text entsprechend abschneiden. Und - disclaimer - die Darstellung eines Memos für jeden Record kann das Programm verlangsamen - deine Verantwortung...

Ach ja noch: Würdest du ein DBGrid verwenden, könntest du das Memo ohne weiteren Code anzeigen, wenn du die Option dgDisplayMemoText einschaltest.

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: TStringgridDrawCell mit Endlosschleife

Beitrag von Luckner »

Hallo wp_xyz,

habe das StringGrid gelöscht und ein DBGrid eingesetzt. Das Memo wir mir schon angezeigt, leider nur als eine lange Zeile. Habe versucht es mit einigen Beispielen aus der Wolke, aber funktioniert alles nicht so. Könnte man, möglicherweise ein TMemo in ein Stringgrid einbauen? Habe auch ein TNiceGrid gefunden, aber noch nicht ausprobiert. Möglicherweise gibt es noch einige mehr Grids, die ein Memo mehrzeilig darstellen können.

Gruß, Luckner

Antworten