Zwischenzeilen in TStringGrid fixieren

Rund um die LCL und andere Komponenten
Antworten
Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Zwischenzeilen in TStringGrid fixieren

Beitrag von Kay »

Hallo,

ich hätte eine Frage zu TStringGrid:
Mit FixedRows lässt sich ja die Anzahl der Zeilen vom oberen Rand festlegen, die nicht mit zum Bearbeitungsbereich gehören sollen.

Kann man eigentlich auch Zeilen dazwischen fixieren, die dann bei der Bearbeitung übersprungen werden?

Ich bräuchte das für folgendes Szenario:
Ich habe ein Gitter mit 20 Zeilen und 2 Spalten. In der ersten Spalte stehen Angaben, die zur Eingabe bestimmer Werte auffordern, z.B. "Titel:" oder "Veröffentlichung:". In der zweiten Spalte sollen dann die zugehörigen Werte eingetragen werden.
Natürlich könnte ich auch für jede Angabe ein paar aus TLbel und TEdit auf das Formular legen, aber ein TStringGrid ist in diesem Anwendungsfall wesentlich kompakter, vor allem weil die Angaben logisch zusammengehören.
Nun möchte ich aber mehrere Zwischenüberschriften einfügen, z.B. für die ersten 5 Angaben eine Überschrift, für die nächsten 5 eine zweite Überschrift und für die letzten 10 eine dritte Überschrift. Das heißt, ich müsste dann also die Zeilen Row=0, Row=6 und Row=12 fixieren. Diese sollen nur zur Anzeige und nicht zur Bearbeitung dienen.

Geht das oder müsste ich dann mehrere separate Komponenten definieren?

Vielen Dank

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

Re: Zwischenzeilen in TStringGrid fixieren

Beitrag von wp_xyz »

Du könntest die Zellen, die als Überschriften dienen sollen, "read-only" machen. Schau das wiki zu den Grids an, da findest du einiges über die Zellen-Editoren (http://wiki.lazarus.freepascal.org/Grid ... ll_Editors). Speziell in diesem Fall würdest du mit folgendem Code das Bearbeiten der Zelle Col=2/Row=2 verbieten:

Code: Alles auswählen

 
procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer;
  var Editor: TWinControl);
begin
  if (ACol = 2) and (ARow = 2) then
    Editor := StringGrid1.EditorByStyle(cbsNone);
end;
 

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Zwischenzeilen in TStringGrid fixieren

Beitrag von m.fuchs »

Nicht von Haus aus. Du kannst aber das selber was dran drehen. Zum Beispiel so:

Code: Alles auswählen

procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer; var Editor: TWinControl);
begin
  if aRow = 5 then
    Editor := nil;
end;
 
procedure TForm1.StringGrid1PrepareCanvas(sender: TObject; aCol, aRow: Integer; aState: TGridDrawState);
begin
  if aRow = 5 then
    StringGrid1.Canvas.Brush.Color := StringGrid1.FixedColor;
end; 
Ist jetzt noch nicht perfekt, aber ein guter Ausgangspunkt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten