Autor |
Beitrag |
McEarth
Hält's aus hier
Beiträge: 5
|
Verfasst: Fr 23.05.03 22:48
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:
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
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: Fr 23.05.03 22: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?
_________________ Hasta La Victoria Siempre
|
|
McEarth 
Hält's aus hier
Beiträge: 5
|
Verfasst: Fr 23.05.03 23: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
      
Beiträge: 557
Win XP Prof, Win XP Home,Win Server 2003,Win 98SE,Win 2000,Win NT4,Win 3.11,Suse Linux 7.3 Prof,Suse Linux 8.0 Prof
D2k5 Prof, D7 Prof, D5 Standard, D3 Prof, K3 Prof
|
Verfasst: Sa 24.05.03 10: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 
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 24.05.03 10:39
Hallo,
das heisst, es würde u.U. helfen, wenn ich zwischen die einzelnen Formularerzeugungsaufrufe einen Sleepaufruf setzen würde, etwa so:
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 
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 24.05.03 12: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
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Sa 24.05.03 12: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
      
Beiträge: 557
Win XP Prof, Win XP Home,Win Server 2003,Win 98SE,Win 2000,Win NT4,Win 3.11,Suse Linux 7.3 Prof,Suse Linux 8.0 Prof
D2k5 Prof, D7 Prof, D5 Standard, D3 Prof, K3 Prof
|
Verfasst: Sa 24.05.03 15: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 
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 24.05.03 22: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
|
|
|