Autor Beitrag
McEarth
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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:

ausblenden volle Höhe 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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:

ausblenden 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