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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 user profile iconUGrohne: Code-Tags durch Delphi-Tags ersetzt