[gelöst] Stringgrid Editor

Für Fragen von Einsteigern und Programmieranfängern...

[gelöst] Stringgrid Editor

Beitragvon DAP » 23. Jul 2017, 14:17 [gelöst] Stringgrid Editor

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 25. Jul 2017, 21:57, insgesamt 1-mal geändert.
DAP
 
Beiträge: 55
Registriert: 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Michl » 23. Jul 2017, 15:41 Re: Stringgrid Editor

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; 
Michl
 
Beiträge: 2169
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon DAP » 23. Jul 2017, 21:00 Re: Stringgrid Editor

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.
DAP
 
Beiträge: 55
Registriert: 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Michl » 23. Jul 2017, 21:33 Re: Stringgrid Editor

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?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2169
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon wp_xyz » 23. Jul 2017, 21:53 Re: Stringgrid Editor

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;
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon Michl » 23. Jul 2017, 22:21 Re: Stringgrid Editor

@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; 
Michl
 
Beiträge: 2169
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon DAP » 23. Jul 2017, 22:47 Re: Stringgrid Editor

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.
DAP
 
Beiträge: 55
Registriert: 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 23. Jul 2017, 22:59 Re: Stringgrid Editor

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;
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon DAP » 24. Jul 2017, 06:26 Re: Stringgrid Editor

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
DAP
 
Beiträge: 55
Registriert: 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 24. Jul 2017, 08:19 Re: Stringgrid Editor

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.
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon DAP » 24. Jul 2017, 17:49 Re: Stringgrid Editor

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.
DAP
 
Beiträge: 55
Registriert: 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 24. Jul 2017, 18:09 Re: Stringgrid Editor

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).
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon DAP » 24. Jul 2017, 19:22 Re: Stringgrid Editor

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
DAP
 
Beiträge: 55
Registriert: 15. Jan 2011, 00:14
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried