Entwickler-Ecke

Sonstiges (Delphi) - Stack-Overflow beim Erzeugen einer CheckBox


UGrohne - Mi 18.12.02 14:19
Titel: Stack-Overflow beim Erzeugen einer CheckBox
Was ist in diesem Code der grundlegende Fehler? Ich seh ihn nicht, steh wohl aufm Schlauch


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:
type TProgramm = record
     name:String;
     CheckBox:TCheckBox;
     Text:TLabel;
     XMLFile:TXMLDocument;
     XMLInternet:TXMLDocument;
     end;

var programs:array of TProgramm
begin
for i:=0 to Length(programs)-1 do
    with programs[i] do begin
         xmlinetstream:=TMemoryStream.Create;
         XMLInternet:=TXMLDocument.Create(Self);
         IdHTTP.Get(serverform.LabeledEdit1.Text+programs[i].name+'.xml',xmlinetstream);
         xmlinetstream.LoadFromStream(xmlinetstream);
         if update(i) then begin
            CheckBox:=TCheckBox.Create(Self);
            Parent:=Panel3;
            Left:=136;Top:=70+i*25;
            Caption:=programs[i].name;
            end;
         xmlinetstream.Free;
    end;


Die anderen unwichtigen Sachen hab ich weggelassen

Beim Erzeugen der CheckBox bekomm ich immer einen Stack OVerflow, sobald die Prozedur beendet ist, aber warum?

Gruß


smiegel - Mi 18.12.02 14:46

Hallo,

wann und wo wird Dein array of TProgramm initializiert?

Falsch:

Quelltext
1:
  for i:=0 to Length(programs)-1 do                    

besser so:

Quelltext
1:
  for i:=0 to High(programs) do                    


Tino - Mi 18.12.02 15:10

dann am besten sofort:

Quelltext
1:
 for i:= Low (programs) to High (programs) do                    

Gruß
TINO


UGrohne - Mi 18.12.02 16:36

Das Array wird eigentlich nirgends initialisiert, brauch ich ja doch auch net, oder ?
Das mit dem High isn netter Tipp, aber es hilft ja generell net weiter. Sobald ich die CheckBox erzeuge bringt er den Stapelüberlauf.

Davor wird das Label erzeugt und angezeigt, das funktioniert auch sehr gut. Ich weiß net, worans liegt. :-(


Tino - Mi 18.12.02 16:45

UGrohne hat folgendes geschrieben:
Das Array wird eigentlich nirgends initialisiert, brauch ich ja doch auch net, oder ?

Dann wird der Code in der FOR-NEXT-Schleife doch garnicht bearbeitet!

Gruß
TINO


UGrohne - Mi 18.12.02 17:17

Ach das meinst Du, ok.

Ne, das Array stellt eine Liste von Programmen dar, die vorher aus der Registry gelesen werden. Danach wird das array gefüllt mit den Programmnamen und XML-Dokumenten mit Versionsinformationen aus dem Verzeichnis des Programms.

Mit diesem Code sollen jetzt die Infos ausm Internet geholt werden und die XML-Daten auch in das array reinkommen. Dann soll mit der Funktion update überprüft werden, ob das Programm upgedatet werden soll oder nicht und wenn ja, soll eine CheckBox erzeugt werden, die dem Anwender diese Möglichkeit eröffnet.

So, und jetzt wisst ihr auch, dass es um ein Update-Programm geht *g*


smiegel - Mi 18.12.02 18:35

Hallo,

warum muss ein dynamisches Array nicht initialisieren werden und warum soll dann die For-Next-Schleife nicht gehen?


UGrohne - Mi 18.12.02 19:04

Ich habs auch erst beim 2. Lesen verstanden: Es ging darum, dass das dynamische Array ja eine Größe haben muss, und das meintest Du mit Initialisieren. Denn sonst wären ja keine Elemente drin und dann würde die For-Next-Schleife nicht funktionieren, da die Länge des Arrays ja 0 wäre. So hab ichs jetzt verstanden


UGrohne - Mi 18.12.02 19:24

Keiner hats gesehn, ich habs endlich entdeckt: Dieses with ... hat mich total durcheinander gebracht. Hab ja bei Parent, left, top usw nicht die Eigenschaft von der CheckBox verändert sondern vom formular selbst. Habs bemerkt, als ich Parent auskommentiert hab, da hats getan, nur hats dann das fenster verschoben.

Also jetzt funktionierts, trotzdem vielen Dank an alle. *g*

Dumm darf man sein, man sollte sich nur nicht erwischen lassen

Gruß