Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Projekt Migration nach XE2; Mainform nicht mehr assigned ??
JoelH - Do 02.02.12 15:16
Titel: Projekt Migration nach XE2; Mainform nicht mehr assigned ??
Ich habe hier diverse Projekte die ich bisher mit Delphi 2007 bearbeitet habe. Einige davon wurden schon mit D4 oder D7 erstellt und immer wieder weitermigriert. Jetzt stand die Umstellung nach XE2 an und hier macht mir der Code plötzlich seltsame Probleme, allerdings nur unter Windows7 und XP Servicepack 1 , während es unter XP SP3 tadelos läuft und auf Win7 Rechner auf denen XE2 installiert ist funktionierts auch :(
Das Problem dabei ist, dass ich im onPaint Event der Mainform folgenden Code aufrufe:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TMain.Waitforform; var b : boolean; begin b := false; repeat if Assigned(Application.MainForm) then begin loadmdis; b := true;
end;
until b;
end; |
(Nicht daran stören warum ich das so machen, das ist aus meinen Versuchen den Fehler zu finden so entstanden. Ursprünglich war der Code einfach nur schlicht
loadmdis; )
Bei den "Problemplattformen" ist dabei, rätselhafterweise, die Mainform nicht assigned und ich habe keine Idee warum nicht. Sprich, er landet hier in einer Endlosschleife. Die Procedure loadmdis, die die mdiChilds öffnet wird nie erreicht.
Ein Workaround ist, dass ich in das onPaint einen Timer lege. Dieser startet dann die Routine zum öffnen der MdiChilds und dann funktionierts auch.
Dieser Effekt taucht allerdings nur bei Projekten auf die ursprünglich mit Delphiversionen 4 oder 7 erstellt wurden. Ein Projekt welches ursprünglich mit Delphi 2007 erstellt wurde zeigt dieses Phänomen nicht, dort ist die Mainform auch schon im onPaint Event assigned. Was mich etwas ratlos zurück lässt, da ich einfach keine Unterschiede finden kann :(
Hat jemand eine Idee an was es liegen könnte?
jaenicke - Fr 03.02.12 04:58
Also bei mir ist Application.MainForm in OnPaint zugewiesen, was eigentlich auch nicht anders sein kann. Das muss an der Konstruktion deiner Anwendung liegen.
Ich frage mich aber eher was OnPaint mit dem Laden von MDI-Kindfenstern zu tun hat!?
JoelH - Fr 03.02.12 08:36
jaenicke hat folgendes geschrieben : |
Ich frage mich aber eher was OnPaint mit dem Laden von MDI-Kindfenstern zu tun hat!? |
ich initialisiere einmalig beim Erststart die Datenbank etc. lade die Rechte des Users und erstelle aufgrund der Rechtestruktur die MDIChilds die der User nutzen darf. Und wie gesagt, bei den "Nichtproblemplattformen" ist bei mir die Mainform auch zugewiesen. Das ist es ja was ich nciht verstehe.
Könnte es sein, das am Projektfile liegt oder der dfm?
PS: Sorry für die PN, ich hatte mich beim Zitatbutton verklickt ;-)
jaenicke - Fr 03.02.12 08:46
Aber das hat doch nichts mit dem Neuzeichnen des Formulars, also OnPaint, zu tun. So etwas kannst du in OnCreate oder in OnShow machen. Bei OnShow ist Application.MainForm schon zugewiesen, in OnCreate nicht. Die Referenz auf Self hast du aber ja auch schon in OnCreate.
OnShow wird immer aufgerufen, wenn du das Fenster mit Show anzeigst (oder es automatisch beim Start angezeigt wird). Wenn es immer sichtbar bleibt, wird es also nur einmal aufgerufen.
JoelH - Fr 03.02.12 09:58
jaenicke hat folgendes geschrieben : |
Aber das hat doch nichts mit dem Neuzeichnen des Formulars, also OnPaint, zu tun.
|
Natürlich nicht. Das ist eine gewachsene Struktur, die ganze Routine wird auch nur beim aller ersten Zeichenen bearbeitet. Da hängt noch sehr viel mehr Code dran, das ist nur ein Ausschnitt.
jaenicke hat folgendes geschrieben : |
So etwas kannst du in OnCreate oder in OnShow machen. Bei OnShow ist Application.MainForm schon zugewiesen, in OnCreate nicht. Die Referenz auf Self hast du aber ja auch schon in OnCreate.
|
Nö. Wenn ich es ins onShow setzte lande ich in einer Endlosschleife. Assinged(Application.Mainform) ist immer false.
jaenicke - Fr 03.02.12 10:59
JoelH hat folgendes geschrieben : |
| Nö. Wenn ich es ins onShow setzte lande ich in einer Endlosschleife. Assinged(Application.Mainform) ist immer false. |
Wie sieht denn dazu die Projektdatei an der Stelle aus, an der die Formulare erzeugt werden?
Das ist so definitiv kein Standardverhalten. Da muss also irgendein Code des Projekts dazwischenfunken.
JoelH - Mi 08.02.12 15:21
hab leider nix gefunden. Allerdings einen kleinen Workaround gebastelt. Ich hab einfach eine TApplicationEvents-Komponente draufgehauen und den Code aus meinem onPaint in das onIdle der TApplicationEvents geschoben. Funktioniert wieder ohne Probleme. Trotzdem ist es sehr sehr seltsam.
Sinspin - Do 09.02.12 10:10
Cool, OnPaint und Timer habe ich in meinen ersten Delphi Programmen genutzt, nach vielen Jahren nur DOS und Pascal Programmierung. Seit dem halte ich mich von Timern fern soweit es geht.
OnFormCreate wurde früher zu einem anderen Zeitpunkt aufgerufen. Den kann man nun (glaub seit D7) umschalten indem man auf dem Formular "OldCreateOrder" True/False stellt.
Auch wenn deine Schleife aus meiner Sicht totaler Murks ist, wenn du ein Application.Processmessages in deine Schleife packst werden zumindest von der Anwendung weiter Ereignisse verarbeitet. Eventuell lößt das dein Problem.
jaenicke - Do 09.02.12 10:49
Woran es liegt, lässt sich ohne ein wenig Quelltext nicht sagen, deshalb hatte ich ja zumindest nach dem Teil der Projektdatei gefragt. Da bleibt eben nur übrig selbst zu debuggen, hier etwas Code zu posten (z.B. ein Testprojekt erstellen oder alles an Code nach und nach entfernen und dabei entweder den Fehler finden oder das verbleibende leere Projekt posten) oder halt mit der dreckigen Lösung zu leben. :nixweiss:
JoelH - Do 09.02.12 13:48
Sinspin hat folgendes geschrieben : |
OnFormCreate wurde früher zu einem anderen Zeitpunkt aufgerufen. Den kann man nun (glaub seit D7) umschalten indem man auf dem Formular "OldCreateOrder" True/False stellt.
|
Hab ich auch bereits probiert, hatte auch nicht geholfen.
Ich schau mal ob ich das Problem separiert nachstellen kann. Dann gibts auch überschaubaren Quellcode.
JoelH - Do 15.03.12 12:27
So, ich habe das Problem isoliert bekommen.
Es liegt offensichtlich an der Komponente TPanel.
Ich habe zwei Beispielprojekte angehängt, sie sind völlig simpel allerdings funktioniert nur eins erwartungsgemäß. Funktioniert bedeutet, dass Application.Mainform bereits im onPaint-Event assigned ist. Beim Projekt mit dem Button auf der Mainform funktionierte die mit Rad-Studio-XE2-Update4 erzeugte Exe-Datei auf allen getesteten Rechnern. Die Exe-Datei mit dem Panel auf der Form funktioniert nicht auf allen Systemen.
Getestet auf
Win-XP SP1 => Projekt läuft nicht
Win-XP SP2 => Projekt läuft
Win 7 mit Delphi/RadStudio Installation => Projekt läuft
Win 7 ohne D/Rad Installation => Projekt läuft nicht
Wie bereits geschildert ist das Projekt (Also die Mainform) ursprünglich mit D7 (kann auch D4 oder D2007 gewesen sein) erzeugt worden.
Hat jemand eine Idee?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!