[gelöst] Stringgrid Editor

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

[gelöst] Stringgrid Editor

Beitrag von DAP »

Hallo,

ich habe ein Stringgrid und möchte, dass erst bei einem Doppelklick die Bearbeitung der Zelle
möglich ist. Hier mal mein minimaler Ansatz:

Code: Alles auswählen

 
procedure TForm1.StringGrid1DblClick(Sender: TObject);
var
  Grid : TStringGrid;
begin
  Grid := Sender as TStringGrid;
 
  IF (not Grid.EditorMode) then
  begin
    Grid.Options := Grid.Options + [goEditing];
    Grid.Editor.show;
  end;
 
end;
 
 


So scheint es jedenfalls nicht zu gehen, warum nicht?

Als nächstes stellt sich für mich die Frage, bei welchem Event kann ich
nach Abschluss der Zellbearbeitung [goEditing] wieder ausschalten?
Zuletzt geändert von DAP am Di 25. Jul 2017, 22:57, insgesamt 1-mal geändert.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Stringgrid Editor

Beitrag von Michl »

Bei mir geht sowas (goEditing in GridOptions gesetzt). Damit wird nur mit einem Doppelklick die Zelle zum Editieren bereit gemacht:

Code: Alles auswählen

type
 
  { THackStringGrid }
 
  THackStringGrid = class(TStringGrid)
  public
    procedure SelectEditor; override;
  end;
...
  TForm1 = class(TForm)
...
  private
    FAllowEditing: Boolean;
  end;
 
...
 
procedure THackStringGrid.SelectEditor;
begin
  inherited SelectEditor;
end;
 
procedure TForm1.StringGrid1DblClick(Sender: TObject);
begin
  FAllowEditing := True;
  THackStringGrid(StringGrid1).Selecteditor;
end;
 
procedure TForm1.StringGrid1AfterSelection(Sender: TObject; aCol, aRow: Integer);
begin
  FAllowEditing := False;
end;
 
procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer;
  var Editor: TWinControl);
begin
  if not FAllowEditing then
    Editor := nil;
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Stringgrid Editor

Beitrag von DAP »

Michl hat geschrieben:Bei mir geht sowas

...



vielen Dank erstmal für die Mühe, den Ansatz finde ich sehr gut,
aber bei mir wird die Zelle auch nach einem Einfachklick zur Bearbeitung aktiviert.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Stringgrid Editor

Beitrag von Michl »

DAP hat geschrieben:aber bei mir wird die Zelle auch nach einem Einfachklick zur Bearbeitung aktiviert.
Merkwürdig, hier nicht (32bit Lazarus Trunk 1.9, Windows 7). Beispiel anbei. Welches OS und welche Lazarusversion nutzt du?
Dateianhänge
Test Stringgrid.zip
(1.96 KiB) 86-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: Stringgrid Editor

Beitrag von wp_xyz »

Hier ist eine Lösung, die auf deinen ursprünglichen Ansatz zurückgeht: Normalerweise ist goEditing nicht gesetzt. Beim Doppelklick, oder wenn F2 gedrückt ist (was man auch oft findet), wird goEditing aktiviert. Beim Ende des Editierens, im Ereignis OnEditingDone, wird goEditing wieder gelöscht.

Code: Alles auswählen

uses
  LCLType;
 
procedure TForm1.StringGrid1DblClick(Sender: TObject);
begin
  StringGrid1.Options := StringGrid1.Options + [goEditing];
end;
 
procedure TForm1.StringGrid1EditingDone(Sender: TObject);
begin
  StringGrid1.Options := StringGrid1.Options - [goEditing];
end;
 
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_F2 then
    StringGrid1.Options := StringGrid1.Options + [goEditing];
end;

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Stringgrid Editor

Beitrag von Michl »

@wp: Warum so einfach, wenn es auch mit Verbiegungen geht :mrgreen:

Nein, so ist das natürlich viel schöner!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Stringgrid Editor

Beitrag von DAP »

Michl hat geschrieben: Welches OS und welche Lazarusversion nutzt du?


Ich habe Wind 10, Lazarus 64 bit, Version 1.6.4. und schon beim Laden deines Projektes mit StringGrid1AfterSelection probleme.

wp_xyz hat geschrieben:Hier ist eine Lösung, die auf deinen ursprünglichen Ansatz zurückgeht ...


bei dieser Variante benötige ich nach dem Setzen von goediting eine weiteren Click um den Editor zu aktivieren.

Ich benötige dann noch die Möglichkeit den Editor zu aktivieren.

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

Re: Stringgrid Editor

Beitrag von wp_xyz »

Du kannst gleich zu tippen beginnen, auch ohne Cursor. Gut, aber wenn du den Cursor sehen willst, was auf jeden Fall besser ist, musst du noch EditorMode des Grid auf true setzen:

Code: Alles auswählen

uses
  LCLType;
 
procedure TForm1.StringGrid1DblClick(Sender: TObject);
begin
  StringGrid1.Options := StringGrid1.Options + [goEditing];
  StringGrid1.EditorMode := true;
end;
 
procedure TForm1.StringGrid1EditingDone(Sender: TObject);
begin
//  StringGrid1.EditorMode := false;  // Nur der Vollständigkeit halber aufgeführt, ist anscheinend nicht nötig
  StringGrid1.Options := StringGrid1.Options - [goEditing];
end;
 
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_F2 then begin
    StringGrid1.Options := StringGrid1.Options + [goEditing];
    StringGrid1.EditorMode := true;
  end;
end;

DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Stringgrid Editor

Beitrag von DAP »

wp_xyz hat geschrieben:Du kannst gleich zu tippen beginnen, auch ohne Cursor. Gut, aber wenn du den Cursor sehen willst, was auf jeden Fall besser ist, musst du noch EditorMode des Grid auf true setzen:

Code: Alles auswählen

uses
  LCLType;
 
procedure TForm1.StringGrid1DblClick(Sender: TObject);
begin
  StringGrid1.Options := StringGrid1.Options + [goEditing];
  StringGrid1.EditorMode := true;
end;
 
 


Das hatte ich so auch schon versucht, aber da bekomme ich unterschiedliches verhalten.
Ich musste trotzdem teilweise StringGrid1.Editor.show verwenden, um den Cursor anzuzeigen
(welches wiederum manchmal zum Absturzfehler führte).

Unterschiede treten auf beim Versetzten der aktiven Zelle per Maus bzw. per Pfeiltasten und
ob bereits Werte in der Zelle stehen oder nicht.

Aber ich freue mich, dass wir das Problem immer mehr einkeisen, vielen Danke für Eure Hilfe

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

Re: Stringgrid Editor

Beitrag von wp_xyz »

Bitte um präzise Beschreibung, was du machst und wie sich das "unterschiedliche Verhalten" äußert. Für mich ist kein Unterschied zum Standard-Verhalten des Grid, nur halt dass der Editormodus erst nach Doppelklick begonnen wird.

DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Stringgrid Editor

Beitrag von DAP »

wp_xyz hat geschrieben:Bitte um präzise Beschreibung, was du machst und wie sich das "unterschiedliche Verhalten" äußert. Für mich ist kein Unterschied zum Standard-Verhalten des Grid, nur halt dass der Editormodus erst nach Doppelklick begonnen wird.


Gerne:

Beim ersten Doppelklick wird die Bearbeitung eingeschaltet, aber kein Cursor gezeigt. Das wäre nicht so schlimm, da man ja auch ohne weiteren klick eine Zahl eingeben kann. Wenn man aber bereits eine Zahl eingegeben hat, die Zelle verlassen hat, mit der Maus oder per Tastatur wieder zu der Zelle springt und anschließend mit doppelklick die Bearbeitung startet, muss man nochmals klicken, um die Zahl zu bearbeiten.

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

Re: Stringgrid Editor

Beitrag von wp_xyz »

Verstehe. Weiter oben steht, dass du Laz 1.6.4 verwendet (ich habe Laz trunk) - und wenn ich zu dieser Version wechsle, sehe ich das beschriebene Verhalten auch. Ich habe mein Testprogramm auch mit Laz 1.8RC3 verwendet, da ist alles in Ordnung. Daher denke ich, du solltest in dieses Problem keine Arbeit stecken, das ist inzwischen bei Lazarus behoben, und wenn in ein paar Wochen die Release-Version 1.8 rauskommt, ist der Fehler weg (oder du probierst jetzt schon den Release Candidate 3 aus).

DAP
Beiträge: 55
Registriert: Sa 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Stringgrid Editor

Beitrag von DAP »

wp_xyz hat geschrieben:Verstehe. Weiter oben steht, dass du Laz 1.6.4 verwendet (ich habe Laz trunk) - und wenn ich zu dieser Version wechsle, sehe ich das beschriebene Verhalten auch. Ich habe mein Testprogramm auch mit Laz 1.8RC3 verwendet, da ist alles in Ordnung. Daher denke ich, du solltest in dieses Problem keine Arbeit stecken, das ist inzwischen bei Lazarus behoben, und wenn in ein paar Wochen die Release-Version 1.8 rauskommt, ist der Fehler weg (oder du probierst jetzt schon den Release Candidate 3 aus).


In der Tat jetzt klappt es, wie gewollt.
Mir fällt aber gerade auf, dass ich durch diesen Ansatz die Möglichkeit der direkten Eingabe von Werten nicht mehr habe.
Müsste man dann alle möglichen Zeichen in dem keydown event abfangen oder gibt es einen anderen kniff?

Edit:
Ist eigentlich nicht mehr so wichtig, ich kann ja dank wp_xyz jetzt F2 drücken, um ohne Mausklick die Bearbeitung zu Starten

Antworten