2016-09-02 14 views
-3

Ich habe ein dbgrid. Ich möchte einen Fokus auf die aktuelle CELL setzen, wenn ich Fehler auf datachanged Ereignis in meiner DataSource bekomme.Delphi DBGrid Set Fokus auf aktuelle Zelle

Mein Code im OndataChanged Ereignis ist:

if (Field.Text = '') then 
begin     

     Application.MessageBox('ERROR','',MB_ICONWARNING); 
     Field.Tag:= Field.DataSet.RecNo; 
     Abort; 
end 

Wie kann ich das tun?

+1

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

+0

a) Es gibt ein Ereignis 'OnDataChanged' in meiner Datenquelle ... b) die aktuelle Zelle: ist die Zelle wenn ich falsche Daten einfüge – userPro

+0

b) Beispiel: wenn ich auf die nächste Zelle mit der Maus klicke .. ich bekomme error: die alte zelle kann kein format sein .. – userPro

Antwort

1

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; 
+0

Ich bekomme 'TMyDBGrid (DBGrid1) .FocusCell (ACol, ARow, True); 'undeclared identifier FocusCell – userPro

+1

@userPro: Welche Delphi-Version verwenden Sie? – MartynA

+0

"undeclared identifier FocusCell" Stellen Sie sicher, dass Ihr Gerät sowohl Grids als auch DBGrids verwendet. Es sollte automatisch funktionieren. 'FocusCell' ist eine Protected-Scope-Methode von TCustomGrid und die' TMyDBGrid'-Deklaration in meinem Code sollte dem Compiler den Zugriff darauf in Ihrer Unit ermöglichen. – MartynA