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 Stringgrid Veränderung auf Zelleninhalt prüfen (https://www.delphipraxis.net/34558-stringgrid-veraenderung-auf-zelleninhalt-pruefen.html)

fboesel 24. Nov 2004 16:32


Stringgrid Veränderung auf Zelleninhalt prüfen
 
Hallo!

ich habe ein Stringgrid.

Ich möchte gerne beim Verlassen der Zelle prüfen, ob sich der Zelleninhalt geändert hat.
Ich kann zwar feststellen, was in der Zelle (vor der Änderung - OnGridGetEditText) drinnenstand,
aber nicht was jetzt neu ist. (GridselectCell geht nur bedingt, da möglicherweise keine neue Zelle angesprungen wird, sondern ev. ein anderes Steuerelement den Focus erhält)

Ich denke es gibt hierfür wahrscheinlich eine einfache Lösung ....

Wäre nett, wenn ich eine Antwort bekommen würde!

schöne Grüsse

fboesel

shmia 24. Nov 2004 17:00

Re: Stringgrid Veränderung auf Zelleninhalt prüfen
 
TStringGrid.OnSetEditText ?!
Das Event feuert nach einer Änderung.

fboesel 24. Nov 2004 17:25

Re: Stringgrid Veränderung auf Zelleninhalt prüfen
 
Hi,

also wenn ich hier den Inhalt abfrage, bekomme ich den Zelleninhalt übermittelt.

procedure Txxx.GridGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: String);
begin
inhalt:=value;
end;

(get - nicht set)

gruss
fboesel

IngoD7 25. Nov 2004 10:34

Re: Stringgrid Veränderung auf Zelleninhalt prüfen
 
Zitat:

Zitat von fboesel
Ich kann zwar feststellen, was in der Zelle (vor der Änderung - OnGridGetEditText) drinnenstand,
aber nicht was jetzt neu ist.

Kannst du doch. Die Antwort hattest du schon bekommen: OnSetEditText.
Mit jedem Tastendruck der Eingabe enthält Value hier den aktuellen Inhalt der Zelle.

Dein Problem ist höchstens, zu erkennen, wann die editierte Zelle endgültig verlassen worden ist.

fboesel 25. Nov 2004 13:41

Re: Stringgrid Veränderung auf Zelleninhalt prüfen
 
Danke IngoD7,

ist richtig, so weit war ich schon.
Das Problem hast Du auch richtig erkannt - ich müßte schon wissen, wann die Zelle verlassen wird.
Grids sind noch nicht meine Stärke.

IngoD7 25. Nov 2004 15:38

Re: Stringgrid Veränderung auf Zelleninhalt prüfen
 
OnDrawCell (Neuzeichnen einer Zelle) wird jedesmal bei Betreten und Verlassen einer Zelle aufgerufen.
In ACol und ARow sind darin die Koordinaten der betreffenden Zelle.

Damit müsstest du notfalls was anfangen können.

Aber Achtung:
OnDrawCell wird bei Wechsel von Zelle X zu Y somit zwei mal aufgerufen.
Aber nicht in der Reihenfolge
"alte Zelle"-->"neue Zelle",
sondern
"Zelle mit kleineren Koordinaten"-->"Zelle mit höheren Koordinaten".

Ist X also die Zelle(1,1) und Y die Zelle(2/3) so wird OnDrawCell immer in der Reihenfolge X-->Y aufgerufen, egal ob man von X nach Y oder umgekehrt von Y nach X wechselt!

Verlässt der Fokus das Grid, wird OnDrawCell nur einmal für die letzte Zelle aufgerufen.

Weitere Gefahr: OnDrawCell wird nicht nur beim Ein- oder Austritt einer Zelle aufgerufen, sondern immer, wenn eine Zelle (aus welchen Gründen auch immer) neu gezeichnet werden muss.

Hm ... je länger ich dies schreibe, umso unsicherer werde ich mir, ob es nicht doch irgendwas einfacheres geben müsste. :?

Aber egal - war interessant, da mal etwas zu forschen. :-D

shmia 29. Nov 2004 09:11

Re: Stringgrid Veränderung auf Zelleninhalt prüfen
 
Zitat:

Zitat von IngoD7
Dein Problem ist höchstens, zu erkennen, wann die editierte Zelle endgültig verlassen worden ist.

Entweder wird OnExit gefeuert (anderes Control wurde fokusiert) oder OnClick wird gefeuert (Eine andere Zelle wurde angeklickt oder über Tastatur angewählt).

fboesel 3. Dez 2004 15:08

Re: Stringgrid Veränderung auf Zelleninhalt prüfen
 
Ich geb mir die Antwort jetzt selbst ... vielleicht interessiert es ja jemanden ...
... nach längeren Prüfen und Recherieren bin ich folgende Lösung gekommen, möglichweise
gehts auch einfacher ... aber was solls ...


a) ich habe hilfsweise 2 editfelder eingerichtet. (kann ich beim Programmieren besser kontrollieren)
voredit.text & nachedit.text

Diese sind standardmäßig mit "checkOk" vorbesetzt.
Delphi-Quellcode:
procedure TFormx.GridSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
  Canselect:=prufeEingabe;         // prüfroutine ob Eingabe auch ok ist
  if trim(voredit.text)<>trim(nachedit.text) then
  begin
    if canselect=true then
        Zellespeichern(grid.col,grid.row);
  end;
  grid.EditorMode:=false;    // der ist wichtig, weil es einen Unterschied macht,
                              // ob die Zelle verlassen wird bevor <enter> gedrückt wird.
  ....
end;

procedure TFormx.zelleSpeichern(acol,arow:Integer);
begin
   Case acol of
      1: Begin
          ....
         End;
      2: Begin
         ....
         end;
          ....
      end;
   voredit.text:='CheckOk';
   nachedit.text:='CheckOk';
end;

procedure TFormx.GridExit(Sender: TObject);
begin
  if (trim(voredit.text)<>trim(nachedit.text)) then
  begin
    if prufeeingabe=false then
    begin
      grid.SetFocus;
      exit;
    end
    else
      Zellespeichern(grid.col,grid.Row);
  end;
end;

procedure TFormx.GridGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: String);
begin
    if trim(voredit.text)='CheckOk' then
     voredit.text:=value;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 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-2025 by Thomas Breitkreuz