DBGrid Multiline ?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.

DBGrid Multiline ?

Beitragvon DL3AD » 3. Aug 2017, 14:09 DBGrid Multiline ?

Hallo,

gibt es eine Möglichkeit das DBGrid als Multiline zu konfigurieren ?
D.h. Eine Datenbankzeile in mehrere Zeilen eines DBGrid unterzubringen um horzontalen Platz zu sparen ?

Gruß Frank
DL3AD
 
Beiträge: 269
Registriert: 13. Sep 2013, 11:07
Wohnort: Rügen
OS, Lazarus, FPC: Win7 (L 1.6.4 FPC 3.0.2) und Debian 8 (L 1.6.4 FPC 3.0.2) | 
CPU-Target: 32Bit
Nach oben

Beitragvon wp_xyz » 3. Aug 2017, 21:52 Re: DBGrid Multiline ?

Das geht ganz einfach, wenn man im Ereignis OnPrepareCanvas den Canvas auf mehrzeilige Textausgabe umstellt:

Code: Alles auswählen
procedure TForm1.DBGrid1PrepareCanvas(sender: TObject; DataCol: Integer;
  Column: TColumn; AState: TGridDrawState);
var
  ts: TTextStyle;
begin
  ts := DBGrid1.Canvas.TextStyle;
  ts.SingleLine := SpinEdit1.Value = 1;    // Mit dem SpinEdit kann man die Anzahl der Textzeilen einstellen.
  ts.Wordbreak := SpinEdit1.Value > 1;
  DBGrid1.Canvas.TextStyle := ts;
end;

Man muss noch darauf achten, dass die Zeilenhöhe angepasst wird. In meinem Beispiel stellt man die Zeilenhöhe mit einem SpinEdit ein, die DefaultRowheight wird aus der Höhe einer Zeile und der Anzahl der Zeilen berechnet (plus den im Grid standardmäßigen Rand von 2x constCellPadding). Leider wird dabei auch die Höhe der Titelzeile verändert, was in der Regel unschön ist. Um das zu verhindern, speichere ich im FormCreate-Ereignis die Anfangs-DefaultrowHeight ab, und setze später nach dem Ändern des SpinEdit die Höhe der Titelzeile auf diesen Wert zurück. Da beim DBGrid die Höhen der Titelzeilen nicht public sind (warum eigentlich?), muss man sich durch einen Typecast ins Grid hacken.

Code: Alles auswählen
type
  TMyDBGrid = class(TDBGrid);
  // Wenn man eine Typumwandlung des Grid auf TMyDBGrid durchführt, hat man Zugriff auf die protected Eigenschaften
 
var
  h: Integer;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  h := DBGrid1.DefaultRowHeight
end;
 
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
  DBGrid1.DefaultRowHeight := DBGrid1.Canvas.TextHeight('A') * SpinEdit1.Value + 2*constCellPadding;;
  TMyDBGrid(DBGrid1).RowHeights[0] := h;
end;
wp_xyz
 
Beiträge: 2041
Registriert: 8. Apr 2011, 08:01

• Themenende •

Zurück zu Datenbanken



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried