Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Programm hängt sich beim Start auf (https://www.delphipraxis.net/180226-programm-haengt-sich-beim-start-auf.html)

TForm1 2. Mai 2014 17:35

Programm hängt sich beim Start auf
 
Hallo zusammen,
ich habe schon wieder ein Problem, das ich bislang noch nicht lösen konnte:
Beim Start wird beim Erzeugen einer Zentralen Verwaltungsklasse einmal ein Objekt zum Managen diverser typisierter Dateien sowie in einer For-Schleife eine Liste mit Objekten einer Steuerungsklasse gefüllt und dieser klein ein Indexwert zugewiesen. Jede Steuerungsklasse soll jetzt jeweils ihre Informationen aus der Dateiverwaltungsklasse nehmen, die auf die Dateien zugriff hat. Der Rückgabewert dieser Funktion ist ein Array, aus welcher sich die Steuerungsklasse mithilfe des Indexes ihre Werte nehmen kann(ich weiß, das ist nicht besonders effizient, besser wäre es nur den gewünschten Datensatz sich geben zu lassen, aber bislang funktioniert das problemlos, vielleicht werde ich es auch noch umprogrammieren). Wenn allerdings noch nichts in der Datei steht, wird ein leeres Array übergeben, dies wird geprüft und dann sollen Standardwerte in die Datei geschrieben werden.
Problem ist jetzt folgendes: Dadurch, dass mehrere Objekte der Steuerungsklasse erzeugt werden, ist das Array beim Create des 2. Objektes mit einem Datenpaket bereits gefüllt, deswegen gilt
Delphi-Quellcode:
high(Array)<0
nicht mehr. Dies habe ich versucht durch ein
Delphi-Quellcode:
high(Array)<Index
zu lösen. Diese Änderung bewirkt allerdings, dass sich das Programm bereits beim Start aufhängt (Unter Mac: Das Docksymbol hüpft aufgeregt ohne dass sich was tut) und das ohne jegliche Fehlermeldung. Die Prozessorauslastung geht dabei auf ca.90% hoch.
Hier mal der Code:
Delphi-Quellcode:
var ZwischenSpeicherDatensatz: TMyRecord
begin
BufferArray:= DateiVerwaltung.DateiLaden;
   if high(BufferArray)<Index then //Hier ist Das Problem
   begin
     ZwischenSpecherDatensatz.Var1:= ... {Hier entsprechende Zuweisungen}
   
     DateiVerwaltung.DateiAktualisieren(Index, ZwischenSpeicherDatensatz);
     Exit;
   end;
   //Die Felder werden aus dem BufferArray gefüllt
   FVar1:=BufferArray[Index].Var1
   {Hier weitere Zuweisungen}
end;
Hier der entsprechenden Funktionen zur Dateispeicherung/Laden:
Delphi-Quellcode:
procedure TDateiVerwaltung.DateiAktualisieren(Index: integer; Datensatz: TMyRecord);
begin
  try
  seek(FFile, Index);
  write(FFile, Datensatz);
  except
    showmessage('Problem beim speichern der Datei');
  end;
end;
//und
function TDateiVerwaltung.DateiLaden: TMyArray; //Dynamisches Array
var DatenArray: TMyArray;
    Datensatz: TMyRecord;
    Index, FileIndex: integer;
begin
  try
  FileIndex:= System.FileSize(FFile)-1;
  if FileIndex < 0 then exit; //Falls die Datei noch leer ist, wird nichts zurückgegeben. (Dies muss beim Aufruf berücksichtigt werden)
  Index:= 0;
  repeat
    seek(FFile, Index);
    read(FFile, Datensatz);
    SetLength(DatenArray, Index+1);
    //Daten werden ins Array geschrieben
    DatenArray[Index].Var1:= Datensatz.Var1;
    {weitere Zuweisungen}
  until eof(FFile);

  result:= DatenArray;
  except
  showmessage('Problem beim Laden der Datei');
  end;
end;
Wenn ich mit dem Debugger drüber gehe, springt er genau bei der markierten Zeile heraus, bei
Delphi-Quellcode:
high(Array)<0
gibt es kein Problem.
Sämtliche Objekte sind alle korrekt instanziert, da ist nirgenwo ein Fehlzugriff auf ein (noch) nicht vorhandenes Objekt.

Schönes Wochenende

Uwe Raabe 2. Mai 2014 20:16

AW: Programm hängt sich beim Start auf
 
Delphi-Quellcode:
    SetLength(TempLokArray, Index+1);
    //Daten werden ins Array geschrieben
    Array[Index].Var1:= Datensatz.Var1;
Du verwendest da zwei verschiedene Arrays. Willst du das wirklich?

Übrigens: Man verwendet nicht einfach den Variablennamen Array!

himitsu 2. Mai 2014 20:43

AW: Programm hängt sich beim Start auf
 
Kann man im FPC auch eine Bereichsprüfung aktivieren?
http://docwiki.embarcadero.com/RADSt...erpr%C3%BCfung

Wenn ja, dann solltest du das dringend mal machen.

TForm1 2. Mai 2014 21:12

AW: Programm hängt sich beim Start auf
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1257762)
Delphi-Quellcode:
    SetLength(TempLokArray, Index+1);
    //Daten werden ins Array geschrieben
    Array[Index].Var1:= Datensatz.Var1;
Du verwendest da zwei verschiedene Arrays. Willst du das wirklich?

Übrigens: Man verwendet nicht einfach den Variablennamen Array!

:shock: Oh, das ist natürlich ein Schreibfehler, den Code aus meinem Programm habe ich nachträglich noch verändert:roll:. Und dass man nicht Array als Variablenbezeichnung verwenden sollte, ist mir auch klar, sonst wäre mein Problem erst gar nicht aufgetreten und ich würde mich noch mit merkwürdigen Compilermeldungen rumärgern :lol:.
Wird natürlich sofort korrigiert.

Das mit dem Bereichscheck habe ich jetzt mal oberflächlich schnell probiert, bei dem Fall
Delphi-Quellcode:
high(BufferArray)<0
kommen zwar Fehlermeldungen, die ich im einzelnen jetzt nicht analysiert habe, das muss ich dann noch mal ganz in Ruhe morgen machen; Aber im anderen Fall
Delphi-Quellcode:
high(BufferArray)<Index
wie gewohnt keine Fehlermeldung, nur hüpfendes Icon. Wie gesagt, ich werde mich morgen damit noch mal in Ruhe auseinandersetzen.

[EDIT] Ich weiß jetzt doch, warum bei der Bereichsprüfung im 1. Fall ein Fehler auftritt. Während der 1. Durchlauf noch "richtig" durchläuft, steht im Zweiten ja schon etwas in der Datei drin, deswegen gilt nicht mehr high(BufferArray)<0 und das Programm springt gleich in den Text zum auslesen der Daten und will auf Bufferarray[1] zugreifen, geht nicht, da Bufferarray ja nur ein Objekt beinhaltet. Das nur so am Rande.

himitsu 3. Mai 2014 04:35

AW: Programm hängt sich beim Start auf
 
Zitat:

Zitat von TForm1 (Beitrag 1257764)
den Code aus meinem Programm habe ich nachträglich noch verändert:roll:.

Wäre es da nicht einfacher/besser den "eigentlichen" Code zu posten? :roll:

Zitat:

Zitat von TForm1 (Beitrag 1257764)
Aber im anderen Fall ... keine Fehlermeldung

Es geht dabei nicht unbedingt auf Meldungen des Compilers, sondern darum, osb man bei
Delphi-Quellcode:
TempLokArray[Index].
auf ein "richtiges" Element zugegriffen wird und dir nicht sowas wie einen Buffer-Overflow einfängst und dabei womöglich noch ürgendwas Anderes überschreibst oder auf einen nichtexistierenden Speicherbereich triffst.

Zitat:

Zitat von TForm1 (Beitrag 1257764)
und will auf Bufferarray[1] zugreifen, geht nicht, da Bufferarray ja nur ein Objekt beinhaltet. Das nur so am Rande.

Jupp, genau dafür sind diese zusätzlichen Prüfungen, wo zur Laufzeit nun eine entsprechende Exception ausgelöst werden sollte.

TForm1 3. Mai 2014 08:44

AW: Programm hängt sich beim Start auf
 
Zitat:

Zitat von himitsu (Beitrag 1257769)
Wäre es da nicht einfacher/besser den "eigentlichen" Code zu posten? :roll:

Der veränderte Code unterscheidet sich nicht vom eigentlichen Code bis auf die Variablenbezeichnungen und die Zuweisungen aus den Records. Ich wollte Euch einfach nicht mit unnötigem Copypaste- Code zumüllen.
Zitat:

Zitat von himitsu (Beitrag 1257769)
Es geht dabei nicht unbedingt auf Meldungen des Compilers, sondern darum, osb man bei
Delphi-Quellcode:
TempLokArray[Index].
auf ein "richtiges" Element zugegriffen wird und dir nicht sowas wie einen Buffer-Overflow einfängst und dabei womöglich noch ürgendwas Anderes überschreibst oder auf einen nichtexistierenden Speicherbereich triffst.

Mit Fehlermeldung meinte ich auch keine Compilermeldungen sondern Exceptions, aber wie gesagt, es passiert nichts.
Wenn ich mit dem Debugger Zeile für Zeile durchgehe tritt der Fehler genau bei
Delphi-Quellcode:
if high(BufferArray)<Index then
auf.
Ich vermute auch, dass der Fehler evt. bei der Datei liegen könnte, denn exakt dasselbe hatte ich schon mal, da war durch Fehlbedienung diese Datei zerschossen, bzw. nicht richtig befüllt/ geleert worden. Ein löschen der Datei hatte damals den Fehler behoben.

himitsu 3. Mai 2014 09:08

AW: Programm hängt sich beim Start auf
 
Zitat:

Zitat von TForm1 (Beitrag 1257775)
Wenn ich mit dem Debugger Zeile für Zeile durchgehe tritt der Fehler genau bei
Delphi-Quellcode:
if high(BufferArray)<Index then
auf.

Welcher Fehler denn genau?

In dieser gezeigten Code-Zeile kann eigentlich nichts falsch sein und es kann da auch keine Exception auftreten, außer
- BufferArray und Index sind Felder eines Objektes und das Objekt ist nicht initialisiert/vorhanden.
- z.B. durch Buffer-Overflow wurde das Array zerschossen, oder das Parent-Objekt, in welchem die Variable drin steckt.


Wenn man mit F8/F9 in die Exception reinrennt, dann springt der Debugger gern mal die nächste Zeile (Nja, die Rücksprungadresse aus'm Stacktrace zeigt ja auch auf diese Zeile), aber der Fehler ist eigentlich schon etwas weiter vorne, oder in einem untergeordneten Funktionsaufruf.

TForm1 3. Mai 2014 09:40

AW: Programm hängt sich beim Start auf
 
Zitat:

Zitat von himitsu (Beitrag 1257777)
Welcher Fehler denn genau?

Wenn ich mit dem Debugger durchgehe, und von Zeile
Delphi-Quellcode:
BufferArray:= DateiVerwaltung.DateiLaden;
weiter zu
Delphi-Quellcode:
if high(BufferArray)<Index then
gehen will, verschwindet der Cursor, wie wenn man CTRL-R drücken würde (ich weiß nicht welcher Befehl das in Delphi ist). Danach kommt, wie gesagt, nichts und das Programm startet nicht bzw. bleibt hängen beim Start. Deswegen weiß ich auch nicht, was genau dann passiert. Ich kann mal den Code posten, wo die Steuerungsklasse instanziert wird:
Delphi-Quellcode:
procedure TVerwaltung.InfosLesen; //Die Verwaltungsklasse liest für sich aus einer 2. Datei Infos aus und packt sie in ein Array, da liegt auch nicht das Problem
var DatIndex, Index: integer;
     InfoDatensatz: TInfos;
begin
  Index:= System.FileSize(InfoDatei)-1;
  if Index<0 then exit
  else begin
       DatIndex := 0;
       repeat
            seek(InfoDatei, DatIndex);
            read(InfoDatei, InfoDatensatz);
            SetLength(Infoarray, DatIndex+1);
            //infos werden ausgelesen
            InfoArray[DatIndex].Var1:=InfoDatensatz.Var1;
            {usw}
            Steuerungsklasse:= TSteuerungsklasse.Create(DatIndex, StrToInt(InfoArray[DatIndex].Var1));//Zwei Parameter werden übergeben
            SteuerungsObjektList.Add(Steuerungsklasse);

            DatIndex:=DatIndex+1;
       until eof(InfoDatei);
  end;
end;
so wird praktisch für jeden Infoarrayeintrag parallel ein Listeneintrag mit dem Steuerungsobjekt gemacht.
Hier noch die Create- Methode der Steuerungsklasse:
Delphi-Quellcode:
inherited Create;
   Index:= aIndex; //übegeben durch Parameter
   FVar1:= aVar1;
   {weitere Standardwerte werden initialisiert}
   //Dann wird die Oben genannte Methode aufgerufen
   DatenLaden;

himitsu 3. Mai 2014 10:19

AW: Programm hängt sich beim Start auf
 
Zitat:

wie wenn man CTRL-R drücken würde (ich weiß nicht welcher Befehl das in Delphi ist).
hmmmmm. :gruebel:

Ctrl+R ist dort Suchen+Ersetzen. (Replease)
Meinst du sowas wie Reset? (Programm abbrechen)




Lokale Variable "Index" in InfoLesen
und nochmal ein gleichnamiges Feld "Index" in der Klasse?
Oder ist das "Index" der Crate.Methode was Anderes?

Auf was steht Infoarray, wenn mit Exit das InfoLesen verlassen wird?

- Array immer leer, wenn nichts gelesen wurde
- Read verschiebt die Position zum nächsten Eintrag, also braucht man es auch nur einmal am Anfang zu positionieren
- eine kopfseitig geprüfte Schleife funktioniert auch mit leeren Mengen
Delphi-Quellcode:
       SetLength(InfoArray, 0);
       seek(InfoDatei, 0);
       DatIndex := 0;
       while not eof(InfoDatei) do begin
            read(InfoDatei, InfoDatensatz);
            SetLength(InfoArray, DatIndex+1);
            //infos werden ausgelesen
            InfoArray[DatIndex].Var1:=InfoDatensatz.Var1;
            {usw}
            Steuerungsklasse:= TSteuerungsklasse.Create(DatIndex, StrToInt(InfoArray[DatIndex].Var1));//Zwei Parameter werden übergeben
            SteuerungsObjektList.Add(Steuerungsklasse);
            Inc(DatIndex);
       end;
- Arraygröße vorher bestimmen
Delphi-Quellcode:
       SetLength(InfoArray, System.FileSize(InfoDatei));
       seek(InfoDatei, 0);
       DatIndex := 0;
       while not eof(InfoDatei) do begin
            read(InfoDatei, InfoDatensatz);
            //infos werden ausgelesen
            InfoArray[DatIndex].Var1:=InfoDatensatz.Var1;
            {usw}
            Steuerungsklasse:= TSteuerungsklasse.Create(DatIndex, StrToInt(InfoArray[DatIndex].Var1));//Zwei Parameter werden übergeben
            SteuerungsObjektList.Add(Steuerungsklasse);
            Inc(DatIndex);
       end;
Und ich hoffe mal, InfoArray enthält keine bösen Zeigertypen oder kompilerabhängige Typen, welche sich gern mal verändern, z.B. bei Umstellung auf Unicode oder 64 Bit.

TForm1 3. Mai 2014 12:48

AW: Programm hängt sich beim Start auf
 
Ctrl-R ist blödsinn, :oops: ich meine natürlich Cmd-R. Das ist bei mir "Start". In meinem Fall jetzt sind in der InfoDatei 4 Einträge, also wird die Schleife 4 mal durchlaufen und das Array mit 4 Einträgen gefüllt. Wenn Nichts in der InfoDatei drin steht, bricht der Ladevorgang ab. Somit ist auch Array nichts.
Zitat:

Zitat von himitsu (Beitrag 1257782)
Delphi-Quellcode:
       SetLength(InfoArray, System.FileSize(InfoDatei));
       seek(InfoDatei, 0);
       DatIndex := 0;
       while not eof(InfoDatei) do begin
            read(InfoDatei, InfoDatensatz);
            //infos werden ausgelesen
            InfoArray[DatIndex].Var1:=InfoDatensatz.Var1;
            {usw}
            Steuerungsklasse:= TSteuerungsklasse.Create(DatIndex, StrToInt(InfoArray[DatIndex].Var1));//Zwei Parameter werden übergeben
            SteuerungsObjektList.Add(Steuerungsklasse);
            Inc(DatIndex);
       end;
Und ich hoffe mal, InfoArray enthält keine bösen Zeigertypen oder kompilerabhängige Typen, welche sich gern mal verändern, z.B. bei Umstellung auf Unicode oder 64 Bit.

So ist es natürlich eleganter, werde ich bei mir vielleicht auch noch so ändern. Zeigertypen enthält das Array nicht, nur harmlose Records mit Integer- und String- Werten (und auch noch ein Array, aber das dürfte kein Problem sein?!). Das Laden des InfoArrays ist auch nicht das Problem, das funktioniert soweit.

himitsu 3. Mai 2014 12:54

AW: Programm hängt sich beim Start auf
 
String?
Gerade das ist ein böser Zeigertyp, da der intern nur aus einem Zeiger besteht, welcher auf die eigentlichen Stringdaten zeigt.

Und was für ein Array?



Nur der
Delphi-Quellcode:
ShortString
und die kurzen Strings mit Längenangabe
Delphi-Quellcode:
String[123]
(nicht mit Zeichenindex, sondern als Typ) ist da anders, da Dieser intern ein statisches
Delphi-Quellcode:
Array[1..123] of AnsiChar
ist (mit einem Längen-Byte am Anfang).

Lange Strings (AnsiString, WideString, UTF8String, UnicodeString usw.), dynamische Arrays (die, welche man mit SetLength bearbeiten kann) und Variants darfst du hier nicht verwenden, wenn der Record "direkt" in gespeicher/übertragen/geladen werden soll. :warn:

TForm1 3. Mai 2014 13:35

AW: Programm hängt sich beim Start auf
 
Die Strings sind alle mit Längenangabe und das Array ist ebenfalls ein statisches 2-dimensionales Array of Real. Daran dürfte es also nicht liegen.
Ich habe mal einen Test gemacht, sowohl die InfoDatei als auch das FFile für die Steuerungsklassen gelöscht und dann während der Laufzeit im Programm Stück für Stück neue Einträge vorgenommen. Die Sache läuft 2 mal gut. Beim 3. mal crasht das Programm, d.h. es friert ein.

himitsu 3. Mai 2014 14:35

AW: Programm hängt sich beim Start auf
 
Hmmmmm. :gruebel:

Also der bis jetzt gezeigte Code scheint ja insoweit OK zu sein,
aber dennoch klingt es so, als wenn beim 3. oder auch schon 2. Durchlauf irgendwas "zerschossen" würde, was dann spätestens beim 3. Aufruf zu einem Fehler führt.



PS: (auch wenn es erstmal mit dem Problem noch nicht viel zu tun hat)
Ist InfoArray zufällig ein
Delphi-Quellcode:
array of TInfos
?

Wenn ja, dann könntest du auch direkt
Delphi-Quellcode:
InfoArray[DatIndex] := InfoDatensatz;
machen,
oder sogar gleich
Delphi-Quellcode:
SetLength(Infoarray, DatIndex+1);
Read(InfoDatei, InfoArray[DatIndex]);

TForm1 3. Mai 2014 17:09

AW: Programm hängt sich beim Start auf
 
Zitat:

Zitat von himitsu (Beitrag 1257816)
PS: (auch wenn es erstmal mit dem Problem noch nicht viel zu tun hat)
Ist InfoArray zufällig ein
Delphi-Quellcode:
array of TInfos
?

Wenn ja, dann könntest du auch direkt
Delphi-Quellcode:
InfoArray[DatIndex] := InfoDatensatz;
machen,
oder sogar gleich
Delphi-Quellcode:
SetLength(Infoarray, DatIndex+1);
Read(InfoDatei, InfoArray[DatIndex]);

Ja, das stimmt, da könnte man einiges vereinfachen auch noch an anderen Stellen in meinem Code. Da das Projekt bisher mein größtes ist und ich sozusagen nach dem Try-and-Error-Prinzip vorgehe, vor allem auch um die Sprache zu lernen, ist der Code nicht überall mit gleichen Kenntnissen geschrieben. So habe ich z.B. prozedural angefangen, bis ich gemerkt habe, dass doch OOP einige Vorteile mit sich bringt und den Code daraufhin angepasst.

Naja, da scheint irgendwo ein großer Logikfehler drin zu stecken, den man nicht sofort entdeckt, oder irgendwas anderes ist vermurkst...:wall:

TForm1 3. Mai 2014 17:42

AW: Programm hängt sich beim Start auf
 
Fehler gefunden!!!:bounce1::bounce1::bounce1:
Manchmal hilft ein bisschen auf den Code starren doch...
Das Problem lag in diesem Code:
Delphi-Quellcode:
function TDateiVerwaltung.DateiLaden: TMyArray; //Dynamisches Array
var DatenArray: TMyArray;
    Datensatz: TMyRecord;
    Index, FileIndex: integer;
begin
  try
  FileIndex:= System.FileSize(FFile)-1;
  if FileIndex < 0 then exit; //Falls die Datei noch leer ist, wird nichts zurückgegeben. (Dies muss beim Aufruf berücksichtigt werden)
  Index:= 0;
  repeat
    seek(FFile, Index);
    read(FFile, Datensatz);
    SetLength(DatenArray, Index+1);
    DatenArray[Index]:= Datensatz;
 
  until eof(FFile);

  result:= DatenArray;
  except
  showmessage('Problem beim Laden der Datei');
  end;
end;
Hier fehlt ganz einfach ein
Delphi-Quellcode:
inc(Index);
Da Index immer 0 blieb wurde daraus eine Endlosschleife.

Schönes WE

himitsu 3. Mai 2014 18:25

AW: Programm hängt sich beim Start auf
 
Ohne das Seek (in der Schleife) wäre es nicht hängen geblieben. :angle2:


Zu dem Try-Except:
- grundsätzlich sollte der Code dazwischen keine Exceptions auslösen (das alles sind wohl Fehler, bei denen das Programm sowieso abraucht und man sich die Fehlerbehandlung hier sparen könnte), außer
- - die Datei ist garnicht offen, aber dann hätte es wohl schon beim Öffnen geknallt
- - der Datenträger ist kaputt (defekter Sektor), aber sowas sollte besser eh nie passieren
- - oder die Datei ist viel zu groß und es komm ein OutOfMemory
- aber wenn eine Exception auftritt, dann ist es nicht unbedingt gut, wenn man die Exception verwirft und durch nichtsagenden Code ersetzt.

Delphi-Quellcode:
except
  on E: Exception do
    ShowMessage('Problem beim Laden der Datei "' + Dateiname + '".' + sLineBreak + E.Message);
end;
Und bei einer Exception ist Rückgabewert nicht definiert/initialisiert.

Wobei man die Variable DatenArray weglassen und direkt Result nutzen könnte, aber dennoch sollte man das Result entweder vor dem Try oder im Except auf einen definierten Wert setzen. (wenn du direkt Result verwendest, dann einfach am Anfang ein
Delphi-Quellcode:
Result=nil;
)

Da hier das Result additiv/aufbauend verwaltet wird, muß es sowieso immer initialisiert werden, auch wenn keine Exception auftritt.

Delphi-Quellcode:
function Text: string;
begin
  Result := Result + 'a';
end;

var
  i: Integer;
  S: string;
begin
  for i := 1 to 5 do
    S := S + Test;
  ShowMessage(S);
end;
Was gibt hier die MessageBox aus und was würdest eigentlich du für einen Text erwarten?


Delphi-Referenz durchsuchensLinbBreak: Eine Beschreibung, falls Lazaus sowas nicht kennt.

TForm1 3. Mai 2014 21:57

Zitat:

Zitat von himitsu (Beitrag 1257825)
Ohne das Seek (in der Schleife) wäre es nicht hängen geblieben. :angle2:

Naja, bis heute wusste ich auch noch nicht, dass read() von alleine weitergeht, schließlich steht es, glaube ich, auch im Delphi- Treff- Tutorial so.

Mit dem Exception- Handling sollte ich mich mal auseinandersetzen, das stimmt. Bislang war das mehr fürs gute Gewissen eine Behelfsvariante, aber heute habe ich schon gemerkt, dass es durchaus sinnvoll sein kann zumal das Projekt ja nicht kleiner wird und das evt. die Fehlersuche vereinfacht.

Zitat:

Zitat von himitsu (Beitrag 1257825)
Delphi-Quellcode:
function Text: string;
begin
  Result := Result + 'a';
end;

var
  i: Integer;
  S: string;
begin
  for i := 1 to 5 do
    S := S + Test;
  ShowMessage(S);
end;
Was gibt hier die MessageBox aus und was würdest eigentlich du für einen Text erwarten?

Bezieht sich die Frage auf den Quelltext darüber oder worauf?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz