Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TcxGrid - ERR: hat kein übergeordnetes Fenster (https://www.delphipraxis.net/174911-tcxgrid-err-hat-kein-uebergeordnetes-fenster.html)

Hausmarke 17. Mai 2013 15:00


TcxGrid - ERR: hat kein übergeordnetes Fenster
 
Hallo Jungs,

folgender sachverhalt.
ich habe ein MDI fenster und generiere im OnCreate dessen ein Datenmodul:

Application.CreateForm(TData, Data);


Über das Menü im MDI fenster generiere ich ein zweites Fenster

Application.CreateForm(TMain, Main);

soweit so gut.
im Main formular habe ich ein cxGrid was auf das OnEditDblClick Event das Grid enabled:=false setzt.
im Zuge dessen kommt dann der fehler:
Element hat kein übergeordnetes Fenster

Der Debugger stoppt in der Unit Forms bei der function ValidParentForm.
Das kuriose, manchmal funktioniert es, und manchmal nicht... und ich hab keinen blassen schimmer wo ich ansetzen soll/kann.

Ich hoffe ganz stark das mir jemand von euch nen heißen tipp geben kann.

besten dank im voraus

Furtbichler 18. Mai 2013 09:21

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
Was möchtest Du denn bezwecken? Welches OnEditDblClick meinst Du?

Hausmarke 21. Mai 2013 07:32

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
über das grid wird eine Datenmenge aus einer Datenbank gehändelt.
Ich möchte bei einem doppelklick den aktuellen datensatz bearbeiten und gleichzeitig das grid sperren bzw. auf readonly o.ä. setzen, damit nicht versehendlich ein anderer Datensatz und damit eine andere zu bearbeitende ID gewählt wird. Dies würde ansonsten zu einem Fehler beim speichern führen.

das OnEditDblClick ist ein Event des cxGridMasterView der cxGrid komponente.

ich habe cxGrid.Enabled:=false ausgeklammert und der fehler kommt immer noch.
die fragezeichen werden immer mehr :?::?::?:

einzige idee wäre: könnte es evtl. damit zu tun haben wie ich die child formulare erzeuge?
aktuell geschieht dies via
application.create(Tform1, form1);
application.run;
...

allerdings werden die formulare erzeugt und funktionieren auch...bis zu diesem doppelklick.

baumina 21. Mai 2013 07:40

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
Ich glaube nicht dass es an den Formularen liegt, eher irgendein Element auf dem Formular, wie z.B. das Editfeld der Grid o.ä. (ich kenn die Grid nicht). Also irgendeine Komponente hat keinen Parent und weiß somit nicht zu welchem Formular sie gehört.

Hausmarke 21. Mai 2013 09:29

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
aber dürfte eine fehlende Parent-Eigenschaft nicht schon bei dem erzeugen der form und der diversen komponenten zu einem fehler führen?
das programm läuft soweit durch bis zu diesem doppelklick, danach werden ein paar edits, comboboxen und buttons aktiviert bzw. deaktiviert.

ich konnte es weiter eingrenzen:
wenn ich den Fokus auf eine Combobox setze, kommt der fehler,
genauso kommt der fehler auch, wenn ich versuche das grid auf enabled:=false zu setzen.

das HasParent der Combobox gibt true zurück. Wie kann ich mir die bezeichnung des Parent ausgeben lassen?

DeddyH 21. Mai 2013 09:31

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
Parent.Name sollte doch gehen.

baumina 21. Mai 2013 09:34

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
Delphi-Quellcode:
Combobox.Parent.Name

Hausmarke 21. Mai 2013 09:45

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
die parents scheinen okay zu sein.
die combobox liegt in einem panel, was korrekt ausgeben wird, und das grid liegt auf dem MainFrm, was ebenfalls korrekt über .parent.name ausgegeben wird.

Kann dies in irgendeinem zusammenhang damit stehen, das es eine MDI Anwendung wird?

ich verstehe eben nicht warum das problem erst auftritt, wenn ich den fokus auf ein element setze.
dabei ist es egal auf welches element ich den focus setze, der fehler kommt immer.

baumina 21. Mai 2013 10:15

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
Vielleicht hilft das ja weiter:

Application.CreateForm(TData, Data) wird so nur im Projekt-Quelltext vor Application.Run benutzt.
Wenn man zur Laufzeit ein Formular erstellt, benutzt man Data := TData.Create(Application).

Hausmarke 21. Mai 2013 10:55

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
des rätsels lösung:
das problem war, das ich das OnEditDblClick Event benutzt habe, was das Grid in den Editmodus setzt. Jedoch ist das anschließende wechseln des Fokus auf ein anderes element bzw. das Enabled:=false setzen des grids sozusagen die gegenaktion. Wodurch dieser fehler entstand.

lösung:
das richtige event für meinen zweck nutzen:
OnDblClick


ich danke allen die sich mit mir zusammen den kopf zerbrochen haben.
Vielen Dank


danke noch für den tipp bezüglich der Formular erzeugung.

Perlsau 21. Mai 2013 11:39

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
Zitat:

Zitat von Hausmarke (Beitrag 1215907)
lösung: das richtige event für meinen zweck nutzen: OnDblClick

Und was hat das jetzt mit der Fehlermeldung des fehlenden Parent zu tun? Wie sollte das zusammenhängen?

Hausmarke 21. Mai 2013 12:24

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
fundiert kann ich das nicht beantworten.

aber die gleiche funktion unter zuhilfenahme des onDblClick Events anstatt des OnEditDblClick events funktoniert nun tadellos.
schaut man sich die events genauer an, stellt man fest, das die OnEdit Variante zwei parameter übergibt:

AItem specifies the grid item whose value is being edited.
AEdit specifies the cell editor.

Das Grid wird wie gesagt in den "edit" modus gesetzt, und ohne die eingabe zu bestätigen oder abzubrechen, hatte ich den fokus auf ein anderes element gesetzt.

Wo jedoch der genaue zusammenhang zum parent fehler kommt, kann ich dir nicht sagen, dafür bin ich auch zu frisch im Thema "Delphi".

Aber dieses problem ist leicht rekonstruierbar.
cxGrid -> OnEditDblClick -> focus auf ein anders element setzen -> Fehler

Perlsau 21. Mai 2013 14:50

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
Zitat:

Zitat von Hausmarke (Beitrag 1215924)
Wo jedoch der genaue zusammenhang zum parent fehler kommt, kann ich dir nicht sagen, dafür bin ich auch zu frisch im Thema "Delphi".

Wenn der Fehler kommt, daß kein Parent zugewiesen ist, dann hast du irgendwo auf deinem Form eine Komponente, der kein Parent zugewiesen wurde. Die ist jetzt vermutlich immer noch da. Das würde ich an deiner Stelle auf jeden Fall einmal überprüfen.

Zitat:

Zitat von Hausmarke (Beitrag 1215924)
Aber dieses problem ist leicht rekonstruierbar.
cxGrid -> OnEditDblClick -> focus auf ein anders element setzen -> Fehler

Nein, ich kann das nicht nachvollziehen, weilich kein cxGrid habe. Aber ich kenne den Parent-Fehler, der bei mir vorzugsweise dann auftritt, wenn ich zur Laufzeit eine Komponente erzeuge und zuvor im Code vergessen habe, einen Parent zuzuweisen.

Bebe 21. Mai 2013 16:04

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
Hallo,

bei OnDblClick reagiert das gesamte cxGrid, obwohl du nicht auf einem Feld geklickt hast. Du möchtest aber doch einen Datensatz anklicken, wo sich ein Detailformular zum Bearbeiten öffnet.

Ich würde dir raten OnCellDblClick zu verwenden. Das reagiert nur wenn du auf einen Datensatz klickst. Außerdem würde ich das cxGrid grundsätzlich sperren, d. h. bei OptionData des DBTabelviews die Eigenschaften Deleting, Editing und Inserting auf False setzen (Appending ist standardmäßig False). Vorausgesetzt du willst im Grid sowieso keine Daten bearbeiten.

Das Detailformular würde ich im Event OnCellDblClick erzeugen und mit Showmodal anzeigen (danach natürlich Free(n)). Dann kann man nur noch das zuletzt geöffnete Formular bearbeiten und das Grid nicht anklicken, somit auch keinen Datensatz wechseln.

So z. B.
Delphi-Quellcode:
   frmDetail := TfrmDetail.Create(self);
    try
       case frmDetail.ShowModal of
        mrOk : begin
          .... MachWas;
        end;
        mrCancel : begin
          .... MachNüscht;
        end;
       end;
    finally
       frmDetail.Free;
    end;
Ich hoffe ich konnte ein wenig helfen.

Gruß
Matthias

<edit> Fehler beseitigt.

Furtbichler 21. Mai 2013 19:39

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
Ich würde übrigens anders vorgehen:

Dein Formular hat zwei Bearbeitungsmodi: 'Scrollen' und 'Bearbeiten'.

Das Grid ändert nun sein Verhalten abhängig vom Bearbeitungsmodus und eben nicht direkt durch das Event, das den Moduswechsel durchführt.

Weiterhin gibt es -nur als Denkanstoß- noch mindestens drei weitere Möglichkeiten
1. Öffne einen modalen Dialog, um die Änderungen am Record vorzunehmen. Gleichzeitig ist dein Grid eh gesperrt, eben weil der separate Dialog modal ist.

2. Du kannst du Daten auch direkt im Grid ändern.
3. Du musst das Grid nicht sperren, wenn ein Datensatz verändert wird. Du solltest aber geeignet reagieren, wenn der Fokus auf einen anderen Datensatz gesetzt wird. Du könntest z.B. prüfen, ob der Datensatz verändert wurde und per Messagebox fragen, ob die Daten gespeichert, verworfen, oder der Fokuswechsel verworfen werden soll.

Hausmarke 29. Mai 2013 07:25

AW: TcxGrid - ERR: hat kein übergeordnetes Fenster
 
sorry das ich hier erst so spät noch mal rein schaue.

besten dank für eure Lösungsvorschläge.

@ Furtbichler:
Zitat:

1. Öffne einen modalen Dialog, um die Änderungen am Record vorzunehmen. Gleichzeitig ist dein Grid eh gesperrt, eben weil der separate Dialog modal ist.

2. Du kannst du Daten auch direkt im Grid ändern.
3. Du musst das Grid nicht sperren, wenn ein Datensatz verändert wird. Du solltest aber geeignet reagieren, wenn der Fokus auf einen anderen Datensatz gesetzt wird. Du könntest z.B. prüfen, ob der Datensatz verändert wurde und per Messagebox fragen, ob die Daten gespeichert, verworfen, oder der Fokuswechsel verworfen werden soll.
klasse ideen, nr 3 schwebte mir auch schon als lösungsansatz vor. Da ich die Daten nicht im Grid sondern in den dazugehörigen DBEdits ändere, konnte man eben auch im Grid hin und her wechseln und und es haben sich die dazu gehörigen Felder aktualisiert.
Mein problem war, das ich dachte das sich die ID des zu bearbeitenden Datensatzes ändert, sobald man zwischen mehreren Zeilen wechselt. Allerdings werden die Daten ja direkt in die "DB" geschrieben, sobald man etwas in den dazu gehörigen DBEdits geändert hat. Durch ein Commit der Transaktionskomponente wurde das dann endgültig gespeichert.

und da hatte ich einen fehler eingebaut.
Im grunde war es die korrekte konfiguration des grids und der dazu gehörigen komponenten. Ich muss dazu sagen, das ich im thema datasets etc. noch relativer neuling bin, und eher via trial and error die neuen dinge mir erschließe. In dem fall wurde mir von nem kollegen geholfen, der da mal drüber geschaut hat.

in diesem sinne, noch mal vielen dank an alle


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 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