Hallo,
das ist das Problem mit dem "Editor" des Views, der währende der Eingabe alles andere sperrt.
Und beim Drücken von "Enter" ist dieser noch aktiv.
1. Die Kunst ist jetzt, den Editor "sauber" zu beenden und dann die gewünschte Aktion auszuführen.
2. Dafür wird nach "EditValueChanged" eine Message abgesetzt.
3. Die Message wird im Hauptfenster verarbeitet.
4. Der Editor schliesst sich vor der Message (zum Glück).
5. Den zusätzlichen Wert würde ich mit "BeforePost" im DataSet holen.
Damit steht er gleich an der richtigen Stelle. Sauberer wäre
eine Verarbeitung auf der Datenbank z.B. per Trigger (meine Empfehlung).
6. Der Wert "ForceRefresh" sollte im DataSet aktiviert sein, damit alle
Spalten neu ausgelesen werden.
Ich verwende folgenden Code im Hauptfenster des Projekts:
Delphi-Quellcode:
...
public
procedure ApplicationMessage
( var Msg : TMsg ;
var Handled : Boolean) ;
...
const
WM_GRIDPOSTMESSAGE = WM_USER + 10000 ;
...
procedure TStart_Form.FormCreate(Sender: TObject);
begin
{ Messages abfangen }
Application.OnMessage := ApplicationMessage ;
end ;
...
procedure TStart_Form.ApplicationMessage
( var Msg : TMsg ;
var Handled : Boolean) ;
var
iDataSet : TDataSet ;
begin
{ Grid }
if Msg.message = WM_GRIDPOSTMESSAGE then
begin
iDataSet := TcxGridDBTableView(Msg.wParam).DataController.DataSet ;
if iDataSet.State in [dsInsert,dsEdit] then
begin
iDataSet.Post ;
// gGlobalIBConnection.Transaction.CommitRetaining ;
end ;
end ;
end ;
...
Code im GridView:
Delphi-Quellcode:
procedure TGlobal_EditFields_Form.GridDBViewEditValueChanged(
Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
begin
PostMessage(
Handle, WM_GRIDPOSTMESSAGE, Integer(Sender), 0) ;
end ;
Hinweis:
Wenn der "neue" Wert nicht in der Datenmenge benötigt wird, dann kann
der Wert z.B. via "ImageComboBox" angezeigt werden. Dafür muss
diese Spalte als "Unbound" deklariert werden.
Alternativ geht evtl. auch OnGetText.
Viele Grüsse
Tom