Einzelnen Beitrag anzeigen

Thomas Horstmann

Registriert seit: 25. Apr 2007
Ort: NRW
87 Beiträge
 
Delphi 12 Athens
 
#4

Re: DevExpress cxGridView Daten auslesen

  Alt 20. Apr 2009, 13:39
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
  Mit Zitat antworten Zitat