Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Ereignis wenn Eingabe in einem StringGrid beendet, wie? (https://www.delphipraxis.net/70419-ereignis-wenn-eingabe-einem-stringgrid-beendet-wie.html)

Takeshi 30. Mai 2006 01:37


Ereignis wenn Eingabe in einem StringGrid beendet, wie?
 
Hallo!
Habe dazu leider nichts in im Forum oder irgendner FAQ gefunden.

Ich gebe das Ergebnis eines MySQL Querys in einem StringGrid aus. Man kann die Zellen bearbeiten. Wenn das erfolgt möchte ich gerne Die Änderung mittels Query in die Datenbank eingeben und das StringGrid dann aktualisieren.
OnSetEditText ist ja schon ganz gut aber es wird ja auch jedes Mal ausgeführt während der Benutzer noch etwas in der Zelle eintippt. Ich möchte aber gerne erst das Query starten wenn der Benutzer fertig ist mit seiner Eingabe.
Jemand eine Idee, schlaue Anmerkung oder Alternative dazu?

Danke schonmal, Christoph

Hansa 30. Mai 2006 02:21

Re: Ereignis wenn Eingabe in einem StringGrid beendet, wie?
 
Zitat:

Zitat von Takeshi
Ich möchte aber gerne erst das Query starten wenn der Benutzer fertig ist mit seiner Eingabe...Jemand eine Idee, schlaue Anmerkung oder Alternative dazu?

Da gibts einiges. 8) Vermutlich soll das so was wie Excel, mit "richtiger" DB werden ? :shock: Ich sags Dir gleich : das wird nicht einfach ! Du mußt das Grid zellenweise behandeln. Z.B. so :

Delphi-Quellcode:
procedure Tfrm.sgKeyPress(Sender: TObject; var Key: Char);
begin
  inherited;
  with Sender as TStringGrid do begin
    if Col = EingCol then begin
      case key of
        #13 : begin
...
Bei mir war noch gefordert, einiges an diversem optischen Schnickschnack einzubauen. In Abhängigkeit von verschiedenen Zell-Werten einzelne Zellen zu sperren. Je nach Spalte auch Funktionstasten zuzulassen usw. Prinzipiell gibt es dazu 2 grundsätzliche Möglichkeiten : du schreibst die gewünschten Eigenschaften in die Zelle selbst und wertest das dann aus. D.h. "1" : Eingabe erlaubt und "0" : keine Eingabe. Erfordert intensive Nutzung von OnDrawCell, denn die 1/0 soll man ja nicht sehen. Daß OnSelectCell und OnKeypress verwendet werden müssen, dürfte wohl klar sein. Sind viele verschiedene Eigenschaften gefordert läuft das in Richtung Bitmuster. Eine Alternative wäre noch die Eigenschaft "Objects" des Stringgrids. So wurde das hier letztenendes auch gemacht. Jede Zelle hat einen eigenen Record, in dem die gewünschten Eigenschaften drinstehen.

marabu 30. Mai 2006 06:50

Re: Ereignis wenn Eingabe in einem StringGrid beendet, wie?
 
Hallo Christoph,

hier noch eine Alternative:

Delphi-Quellcode:
procedure TDemoForm.StringGridSetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
begin
  with Sender as TStringGrid do
    if EditorMode
      then Caption := 'still editing ...'
      else Caption := Format('%d / %d : "%s"', [ACol, ARow, Value]);
end;
Grüße vom marabu

Takeshi 30. Mai 2006 11:49

Re: Ereignis wenn Eingabe in einem StringGrid beendet, wie?
 
thx @ Hansa. Sind sicherlich ne Menge interessante Hinweise ;-)
thx @ marabu. Mit
Delphi-Quellcode:
if not TStringGrid(Sender).EditorMode
im SetEditText Ereignis hab ich ja zunächst eigentlich genau das was ich wollte. Prima :-)

Takeshi 30. Mai 2006 15:10

Re: Ereignis wenn Eingabe in einem StringGrid beendet, wie?
 
Sollte man noch erwähnen:
Wenn der Benutzer während der Eingabe eine andere Zelle markiert dann wird ja kein SetEditText ausgelöst.
Eine Lösung wäre das selektieren einer anderen Zelle zu unterbinden während der Benutzer noch den Wert verändert:
Delphi-Quellcode:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
if TStringGrid(Sender).EditorMode then
  CanSelect:=false;
Dann muss der Benutzer erst Enter drücken, die Eingabe damit beenden und mit
Delphi-Quellcode:
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
begin
if not TStringGrid(Sender).EditorMode then
  ShowMessage(Format('%d / %d : "%s"', [ACol, ARow, Value]));
end;
kann man dann darauf reagieren.
Ich hoffe das klappt jetzt auch endlich^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz