Entwickler-Ecke

Sonstiges (Delphi) - HILFE - Prog läuft nur unter XP, aber nicht unter ME, 98 etc


Phraser - Fr 19.07.02 21:46
Titel: HILFE - Prog läuft nur unter XP, aber nicht unter ME, 98 etc
Hallo Leute!

Ich habe in den letzten vier Wochen ein Programm erstellt (unter XP mit Delphi 5, Name: Tour de France 2002), das auch letztendlich einwandfrei funktionierte.
Die exe-Datei konnt ich auf meinem PC und auf einem PC mit XP Home einwandfrei ausführen.

Alle anderen Betriebssysteme scheinen aber Probleme damit zu haben (ME, Win 98 etc.).

Nach ca. 5 sek. Ladezeit wird angezeigt diese anwendung wird aufgrund eines ungültigen vorgang geschlossen.Details:
TOUR DE FRANCE 2002 verursachte einen Ausnahmefehler

eedfadeH in modul unbekannt bei 0000:00000000
Register:
EAX=00000000 CS=0000 EIP=00000000 EFLGS=00000000
EBX=00000000 SS=0000 ESP=00000000 EBP =00000000
ECX=00000000 DS=0000 ESI=00000000 FS =0000
EDX=00000000 ES=0000 EDI=00000000 GS =0000
Bytes bei CS:EIP
Stapelwerte: etc. etc.

Nachdem ich Details beende kommt eine neue Meldung:
Exception EReadError in Modul TOUR DE FRANCE 2002.EXE bei 00010CE.Fehler beim lesen von ComboBox 4 oder 17.Items.Strings:Eine Win 32-API-Funktion ist fehlgeschlagen.


Das Programm läßt sich also nicht starten. Woran liegt das?
Vielleicht deswegen, weil ich unter XP programmierte, die exe aber nicht abwärtskompatibel ist? Was ist, wenn ich auf einem Win98 Rechner die exe nochmal ganz neu erzeuge?

Bitte helft mir, es ist sehr sehr dringend!! Ich lerne Delphi erst seit wenigen Monaten, also bitte verständlich erklären, DANKE! :(


Delete - Sa 20.07.02 07:54
Titel: Re: HILFE - Prog läuft nur unter XP, aber nicht unter ME, 98
Phraser hat folgendes geschrieben:
Vielleicht deswegen, weil ich unter XP programmierte, die exe aber nicht abwärtskompatibel ist?

Wenn du nicht gerade spezielle NT-Systemfunktionen benutzt, dann ist so ein Programm auch unter anderen Windows-Versionen lauffähig.

Zitat:
Was ist, wenn ich auf einem Win98 Rechner die exe nochmal ganz neu erzeuge?

Ausprobieren.

Zitat:
... Fehler beim lesen von ComboBox 4 oder 17.Items.Strings

Hier wäre ein Ansatzpunkt. Schau mal in dein Programm, an welchen Stellen du was mit einer Combobox machst.


Phraser - Sa 20.07.02 12:09

Das Problem liegt darin, dass ich mehrere Formulare beim Programmstart automatisch erzeugen lasse


Quelltext
1:
Application.CreateForm(...,...);                    


Solange das unter 32 sind, klappt es noch. Da es aber einige mehr sind, gibt es diese Fehlermeldung.
Wie kann ich das umgehen??

BITTE HELFT MIR, ICH MUSS DAS HEUTE NOCH FERTIG MACHEN !!!


Klabautermann - Sa 20.07.02 12:28

Hallo,

liegt es wirklich an der Anzahl der Forms oder an dem 32ten Form. Verwendest du in dem irgentwelche NT-Typischen Befehle (vieleicht Netzwerk Befehle).

Gruß
Klabautermann

PS: So viele Formulare beim Programmstart zu erzeugen ist sehr unschön. Wenn du wieder Luft hast solltest du dich mal mit dem Dynamischen erzeugen auseinandersetzen.


Phraser - Sa 20.07.02 12:40

Nein, solche Befehle habe ich garantiert nicht.

Kann ich denn zum Programmstart nur ein paar Formulare erzeugen und dann später im Verlauf die nächsten erzeugen und die zu Beginn erzeugten wieder schließen (oder so in der Art?)?

Wie erzeugt man denn normalerweise so viele Formulare? das kann doch nicht sein, dass nicht mehr als 32 Fomrulare erzeugt werden können...


Tino - Sa 20.07.02 12:59

In den Projektoptionen kannst Du festlegen welche Formulare automatisch erstellt werden sollen. Ich mach das immer so das nur das Hauptformular automatisch erstellt werden und die restlichen eben nicht.

Wenn ich dann ein Form brauche dann erstelle ich das, zeige es an, verarbeite die Eingaben und lösche es aus dem Speicher:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Var
  Form: tForm2;
Begin
  Form := tForm2.Create (Application.MainForm);
  { ... }
  Form.ShowModal;
  { ... }
  Form.Free;
End;

Gruß
TINO


matze - Sa 20.07.02 14:56

kannst du mal nen downloadlink posten, dann kann ich mir mal das fertige prog angucken !!! Zwecks kompatibilität !!!


Klabautermann - Sa 20.07.02 15:29

Phraser hat folgendes geschrieben:
Kann ich denn zum Programmstart nur ein paar Formulare erzeugen und dann später im Verlauf die nächsten erzeugen und die zu Beginn erzeugten wieder schließen (oder so in der Art?)?

Ja, man kann und solte, wie das geht hat Tino ja beschrieben. Das ganze hat den Vorteil, dass du nur für die Formulare resourcen belegst, die du in diesem Moment verwendest. Außerdem kannst du so auch beliebig viele Formulare des gleich Typs erzeugen, wass z.B. dann Praktisch ist wenn du deinen Benutzer erlauben willst mehrere Texte Paralel zu editieren. Eine begrenzung auf 32 Formulare konnte ich nicht feststellen, daher gehe ich davon aus, dass dein Programm auf dem Win98 Rechner tatsächlich alle Resourcen frisst und es deshalb nicht läuft.

Gruß
Klabautermann


Phraser - Sa 20.07.02 17:34

Danke schonmal, das hat mir teilweise weitergeholfen.

Wenn ich jeodch form wieder freigegeben habe, kann ich Komponenten auf dem Formular, das sich in Form befand, keine Werte mehr zuweisen.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
  form: tteam2;
  i:integer;
begin
  Form := tteam2.Create (Application.MainForm);
  form.showmodal;
  form.free;
for i := 0 to 9 do
    begin
    team2.Teamstarke.cells[0,i] := combobox1.items[i];
    team2.Teamstarke.cells[1,i] := inttostr( ... );
    end;
end;


Mit dieser Prozedur wollte ich von einem Formular ins nächste wechseln und auf dem nächsten Formular einem Stringgrid Werte zuweisen.

Wie bekomme ich das hin?


Klabautermann - Sa 20.07.02 20:42

Phraser hat folgendes geschrieben:
Wenn ich jeodch form wieder freigegeben habe, kann ich Komponenten auf dem Formular, das sich in Form befand, keine Werte mehr zuweisen.

Selbstverständlich nicht. Diese Komponenten "gehören" dem Form und somit entfern das Form sie aus dem Speicher, sobald es sich selber zerstört. Du musst das Free also ensprechend später aufrufen:



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
  form: tteam2;
  i:integer;
begin
  Form := tteam2.Create (Application.MainForm);
  form.showmodal;
for i := 0 to 9 do
    begin
    team2.Teamstarke.cells[0,i] := combobox1.items[i];
    team2.Teamstarke.cells[1,i] := inttostr( ... );
    end;
  form.free;
end;


Gruß
Klabautermann


Savage - Sa 20.07.02 22:18

Gehen nicht eigentlich die Daten in einen Stringgrid wieder verloren, wenn man dessen Form einfach wieder freigibt?

Daraus würde sich ja ergeben, dass wenn man die Daten noch verwenden will man diese Form auch "offen" lassen muss.

Zitat:
Mit dieser Prozedur wollte ich von einem Formular ins nächste wechseln und auf dem nächsten Formular einem Stringgrid Werte zuweisen.


Wenn du also alle Form's verwenden müsstest, stehst du wieder vorm gleichen Problem seit dem du brauchst nur einige von deinen über 32. :?

Zitat:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
 
var 
  form: tteam2; 
  i:integer; 
begin 
  Form := tteam2.Create (Application.MainForm); 
  form.showmodal; 
  form.free; 
for i := 0 to 9 do 
    begin 
    team2.Teamstarke.cells[0,i] := combobox1.items[i]; 
    team2.Teamstarke.cells[1,i] := inttostr( ... ); 
    end; 
end;



Du müsstest dann das Form.free nicht in deiner Procedure (zum schreiben oder lesen) aufrufen sondern erst dann, wenn du genau weist, dass du diese Form und dessen Inhalte im laufendem Programm nicht mehr benötigst und auch die Deklarierung der Form's müsstest du Global machen.

Bitte korrigiert mich, wenn falsch lag

mfg
Savage


Klabautermann - So 21.07.02 14:01

Ja,
die Daten gehen verloren wen das Form wieder Freigegeben wird.
Mann sollte immer versuchen die Daten in dem Formular sofort zu verarbeiten, so das es problemlos geschlossen werden kann. Ist das nicht moglich, sollte das Formular die Daten an ein verarbeitendes Objekt übergeben, so das es danach wieder geschlossen werden kann.
Auch wenn man Dinde wie ein StrinGrig hervoracgend verwenden Kann um Daten zu Speichern solte man eine andere Struktur, wie z.B. ein zwei Dimensionales Array vorzihen, da es wesentlich weniger Resourcen verbracht. Visuelle Komponenten sollte man nur da verwender wo die Visualisierung auch gebracht wird.

Gruß
Klabautermann