Entwickler-Ecke
Sonstiges (Delphi) - Delphi7-Anwendung läuft nur unter WindowsXP
McEarth - Fr 23.05.03 21:48
Titel: Delphi7-Anwendung läuft nur unter WindowsXP
Hallo,
ich habe mit Delphi7 eine kleine Anwendung geschrieben, um Schulnoten zu verwalten. Die hierzu nötigen Frames werden in der Projektdatei automatisch generiert.
Leider funktioniert das nur mit WinXP Home einwandfrei. Win2000, WinNT und Win98 bringen jeweils die Fehlermeldung EReadError, dass ein String aus einer integrierten ComboBox nicht gelesen werden kann. Das Programm beendet sich anschließend mit einer Speicherschutzverletzung.
Hat vielleicht schon mal jemand ähnliche Erfahrungen gemacht oder weiß irgendwer, ob WinXP sich doch intern so stark von Win2000 unterscheidet, dass das Programm in dem einen Fall funktioniert, in dem anderen aber nicht?
Der genutzte Quellcode sieht im groben so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| begin
// Startbildschirm erzeugen
frmSplash := TfrmSplash.Create(nil); frmSplash.Show; frmSplash.Update;
// Hauptformular erzeugen und Fortschrittsanzeige aktualisieren
Application.Initialize; Application.Title := 'Zensuren'; Application.CreateForm(TfrmMain, frmMain);
Application.CreateForm(TframeKlassendatenbank, frameKlassendatenbank); frameKlassendatenbank.Parent := frmMain; frameKlassendatenbank.Width := frmMain.ClientWidth; frameKlassendatenbank.Top := frmMain.pnlSymbol.Height; frameKlassendatenbank.Left := 0; frameKlassendatenbank.Hide;
Application.CreateForm(TframeNotendatenbank, frameNotendatenbank); frameNotendatenbank.Parent := frmMain; frameNotendatenbank.Width := frmMain.ClientWidth; frameNotendatenbank.Top := frmMain.pnlSymbol.Height; frameNotendatenbank.Left := 0; frameNotendatenbank.Hide;
// Startbildschirm entfernen und Speicher freigeben
frmSplash.Close; frmSplash.Release;
// Hauptformular aufrufen
Application.Run;
end. |
Für jeden guten Ratschlag bin ich dankbar.
Sascha
Terra23 - Fr 23.05.03 21:56
Also ich kann dir nur sagen, ich erstelle meine Programme auch mit Delphi 7 und die laufen bisher fehlerfrei in allen Plattformen (Windows wohlgemerkt). Hast du vielleicht bestimmte Rechte (Admin oder so), daß sich XP nicht beschwert, die du unter 2000 etc. erst setzen mußt?
McEarth - Fr 23.05.03 22:14
Hallo,
an den Anmelderechten kann es nicht liegen.
Sowohl bei einer Anmeldung als Admin, als auch als "normaler" Nutzer unter WinXP und Win2000 treten die gleichen Phänomene auf.
Es hat auch keinen Erfolg gebracht, dass ich jeweils einen neuen Benutzer (1x Admin, 1x Nutzer) angelegt habe.
Sascha
FriFra - Sa 24.05.03 09:00
Also ich habe die Erfahrung gemacht, dass Schutzverletzungen am Anfang der Ausführung von Programmen meist auftreten, wenn man versucht auf Andere Forms zuzugreifen, obwohl diese noch nicht vollständig initialisiert wurden. Genau dort liegt auch der Unterschied bei den verschiedenen OS, da durch unterschiedliche Performance die Initialisierung unterschiedlich lange dauert.
Meist hilft es bei "gleichzeitiger" Erstellung mehrerer Forms am Anfang den Zugriff durch einen kurzen Timer (500 ms) zu bremsen um der Applikation Zeit zu geben alle Forms zu erzeugen.
McEarth - Sa 24.05.03 09:39
Hallo,
das heisst, es würde u.U. helfen, wenn ich zwischen die einzelnen Formularerzeugungsaufrufe einen Sleepaufruf setzen würde, etwa so:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| begin
// Startbildschirm erzeugen
frmSplash := TfrmSplash.Create(nil); frmSplash.Show; frmSplash.Update;
// Hauptformular erzeugen und Fortschrittsanzeige aktualisieren
Application.Initialize; Application.Title := 'Zensuren'; Application.CreateForm(TfrmMain, frmMain);
Sleep(500);
Application.CreateForm(TframeKlassendatenbank, frameKlassendatenbank); frameKlassendatenbank.Parent := frmMain; frameKlassendatenbank.Width := frmMain.ClientWidth; frameKlassendatenbank.Top := frmMain.pnlSymbol.Height; frameKlassendatenbank.Left := 0; frameKlassendatenbank.Hide;
Sleep(500);
Application.CreateForm(TframeNotendatenbank, frameNotendatenbank); frameNotendatenbank.Parent := frmMain; frameNotendatenbank.Width := frmMain.ClientWidth; frameNotendatenbank.Top := frmMain.pnlSymbol.Height; frameNotendatenbank.Left := 0; frameNotendatenbank.Hide;
// Startbildschirm entfernen und Speicher freigeben
frmSplash.Close; frmSplash.Release;
// Hauptformular aufrufen
Application.Run;
end. |
Werde ich sofort probiere.
Danke
Sascha
McEarth - Sa 24.05.03 11:52
Hallo,
das Einfügen der Sleep-Anweisung hat auch keinen Erfolg gebracht.
Das Programm läuft weiterhin nur unter WinXP.
Weis sont jemand vielleicht einen Rat?
Sascha
Klabautermann - Sa 24.05.03 11:56
Hallo,
wenn du magst, kannst du mir deine Quelltexte ja mal zumailen, dann kann ich auf meinem W2k System im Debugger laufen lassen.
Gruß
Klabautermann
FriFra - Sa 24.05.03 14:40
Versuche es doch mal mit einem Timer...
1. erzeuge alle Formulare
2. starte den Timer
3. OnTimer führst Du dann den restlichen Code aus
P.S. die Sleep Anweisung kann Dir hier nicht weiterhelfen, da diese ja die gesamte Applikation anhällt und du nach dem Sleep genau soweit bist wie vorher...
McEarth - Sa 24.05.03 21:33
Hallo,
die Lösung ist gefunden. Ich hatte eine Methode überschrieben, die auf verschiedene Systemeinstellungen zugreift. Da diese anscheinend erst bei WinXP gültig sind, lief das Programm auch nur unter diesem System.
Der fehlerhafte Code mal zum Überblick:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| ... procedure cbTastendruck(Sender: TObject; var Key: Word; Shift: TShiftState); procedure EffekteAktualisieren(Sender: TObject); private public protected procedure CreateParams(var Params: TCreateParams); override; end;
var frmMain : TfrmMain;
implementation
{$R *.dfm}
...
procedure TfrmMain.CreateParams(var Params: TCreateParams); const CS_DROPSHADOW = $00020000; begin inherited; Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW; end; |
Danke für die Ratschläge.
Sascha
Moderiert von
UGrohne: Code-Tags durch Delphi-Tags ersetzt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!