| Autor |
Beitrag |
JoelH
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: Do 02.02.12 15:16
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?
_________________ mfg. Joel
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: 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 
_________________ mfg. Joel
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: Fr 03.02.12 09:58
_________________ mfg. Joel
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: 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.
_________________ mfg. Joel
|
|
Sinspin
      
Beiträge: 1336
Erhaltene Danke: 119
Win 10
RIO, CE, Lazarus
|
Verfasst: 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.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. 
|
|
JoelH 
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: 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.
_________________ mfg. Joel
|
|
JoelH 
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: 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?
Einloggen, um Attachments anzusehen!
_________________ mfg. Joel
|
|