Der folgende Code zeigt, wie man
Installieren eines globalen Exception-Handler
Fokus einer bestimmten Zelle in einem DBTabelle, z.B. diejenige, die beim Auftreten einer Ausnahme aktuell war. Siehe FocusGridCell
Setzen Sie die erforderliche Eigenschaft von TField auf True, was Ken White Ihnen vorgeschlagen hat.
Wie Sie sehen können, TForm1 die OnException
speichert die aktuelle Raster Zeile und Spalte in die Variablen ERow und ECOL so können Sie später zu ihnen zurückkehren.
FocusGridCell
können Sie den Fokus auf die Rasterzelle mit den gespeicherten Werten ERow und ECol zurückgeben, nachdem der Fokus vom Raster entfernt wurde, z. von der Application.MessageBox
in Ihrem OnDataChange-Handler.
Hoffentlich sollte das alles sein, was Sie tun müssen, was Sie tun möchten.
Btw, es ist generell eine schlecht Idee Pop-up-Nachrichten zu verwenden Sachen in TDataSet Event-Handler angezeigt werden: es ist besser, sich eine benutzerdefinierte Nachricht an die App-Nachrichtenwarteschlange zu schreiben und das Pop-up in der zu tun Handler der benutzerdefinierten Nachricht, so dass das Popup-Ereignis nach das Dataset-Ereignis abgeschlossen ist.
Code:
TForm1 = class(TForm)
[...]
protected
ERow,
ECol : Integer;
procedure OnException(Sender : TObject; E : Exception);
procedure FocusGridCell(ACol, ARow: Integer);
public
end;
[...]
type
TMyDBGrid = class(TDBGrid);
procedure TForm1.FormCreate(Sender: TObject);
begin
ERow := -1;
ECol := -1;
Application.OnException := OnException;
end;
procedure TForm1.OnException(Sender: TObject; E: Exception);
begin
ERow := TMyDBGrid(DBGrid1).Row;
ECol := TMyDBGrid(DBGrid1).Col;
// the following shows a non-intrusive way to display status info without
// interfering with what's focused on the form, etc
Caption := Format('Row: %d, Col: %d', [ERow, ECol]);
end;
procedure TForm1.FocusGridCell(ACol, ARow : Integer);
begin
// Unless the grid's dgAlwaysShowSelection is True, the following
// call to DBGrid1.SetFocus is necessary, otherwise
// the call to SetFocus has no visible effect.
if not (dgAlwaysShowSelection in DBGrid1.Options) then
DBGrid1.SetFocus;
TMyDBGrid(DBGrid1).FocusCell(ACol, ARow, True);
end;
a) Ist das Datachanged Ereignis durch den Benutzer an Ort und Stelle ausgelöst wird die Bearbeitung im Netz tun? b) Was meinst du mit der "aktuellen" Zelle - der Zelle, die direkt fokussiert wurde, bevor du den Fehler bekommst oder was? – MartynA
a) Es gibt ein Ereignis 'OnDataChanged' in meiner Datenquelle ... b) die aktuelle Zelle: ist die Zelle wenn ich falsche Daten einfüge – userPro
b) Beispiel: wenn ich auf die nächste Zelle mit der Maus klicke .. ich bekomme error: die alte zelle kann kein format sein .. – userPro