![]() |
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 |
Re: Stringgrid Veränderung auf Zelleninhalt prüfen
TStringGrid.OnSetEditText ?!
Das Event feuert nach einer Änderung. |
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 |
Re: Stringgrid Veränderung auf Zelleninhalt prüfen
Zitat:
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. |
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. |
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 |
Re: Stringgrid Veränderung auf Zelleninhalt prüfen
Zitat:
|
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