Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Programmabsturz, aber warum (https://www.delphipraxis.net/196325-programmabsturz-aber-warum.html)

Weber 11. Mai 2018 17:15

Programmabsturz, aber warum
 
Hallo zusammen.

Ich habe eine While geschrieben die per Button click ausgeführt werden soll und später bei Eingabe in das oberste Edit.
Jetzt ist es so das wenn ich sie zu Test starten will, um zu sehen ob es so funktioniert stürzt das Programm ab. Leider weiß ich nicht wo ran es liegen könnte.
Ich Arbeite mich grade in Delphi ein und habe schon in verschiedenen Forums nach einer Lösung geschaut aber nix gefunden. Erklärungen wie die Schleife aufgebaut ist habe ich mir durch gelesen und so wie ich das verstanden habe sollte es ja funktionieren.
Für den Fall das es wichtig sein sollte, ich verwende Delphi XE2

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  a,b,c:Integer;
begin
//String Umwandlung in Integer
  a:=StrToInt(Edit1.Text);
  b:=StrToInt(Edit2.Text);
//While-Schleife
  while b<=0 do
    begin
      Edit1.Text:=IntToStr(a+1);
    end;
end;

procedure TForm1.Edit1Change(Sender: TObject);

//Beispiel was bei erreichen der Zahl 3 pasieren sollte
begin
  if Edit1.Text='3' then
    Edit2.Text:=('3')
  else
    Edit2.Text:=('0');
end;
end.
Danke schon mal.

KodeZwerg 11. Mai 2018 17:29

AW: Programmabsturz, aber warum
 
Könntest Du bitte beschreiben was Du da machen möchtest, also mit Deinen Worten.
Was sollte zum Beispiel in Edit1.Text und Edit2.Text stehen und was soll passieren wenn Button1 gedrückt wird?

freimatz 11. Mai 2018 17:30

AW: Programmabsturz, aber warum
 
Das Problem ist dass die Schleife nie verlassen wird. Die Methode Edit1Change wird nie aufgerufen. Abhilfe wäre ein "Application.ProcessMessages;" in der Schleife. Aber schlechter Stil ist es allemal.

Hobbycoder 11. Mai 2018 17:30

AW: Programmabsturz, aber warum
 
Das hier
Delphi-Quellcode:
  while b<=0 do
     begin
       Edit1.Text:=IntToStr(a+1);
     end;
ist eine Endlos-Schleife.
Wenn b wirklich mal kleinergleich 0 ist, b aber innerhalb der Schleife niemals über 0 wird, wird die Schleife nie verlassen.

Weber 11. Mai 2018 18:20

AW: Programmabsturz, aber warum
 
Die Variable b ist ja in Edit2 definiert, die zu begin 0 ist.
Es soll a so lange hoch gezählt werden das wie in meinem Beispiel beschriben ist, wenn die Zahl 3 erreicht ist das dan in dem Edit2 dan 3 stehen soll (nur ein beispiel) und wenn das der Fall ist soll die Schleife abgebrochen werden. Des halb verstehe ich jetzt nicht genau wie so das nicht funktioniert. Ich definiere ja am Schleifenbegin das das ja so lange ausgeführt werden soll bis b>0 sein soll.

Delphi.Narium 11. Mai 2018 18:33

AW: Programmabsturz, aber warum
 
Wenn b zu Beginn der While-Schleife <= 0 ist, wie soll es dann geändert werden? Wo findet denn da eine Zuweisung statt, die jemals dazuführen könnte, dass die Bedingung b <= 0 nicht mehr zutreffend sein könnte und damit zum Schleifenabbruch führen würde? Erst wenn b > 0 ist, wird die Schleife verlassen. Da aber keine Zuweisung an b erfolgt, die den Wert innerhalb der Schleife ändern könnte, wird b einweder immer <= 0 bleiben oder bereits vor dem Schleifenaufruf > 0 sein. In diesem Fall wird die Schleife jedoch nicht durchlaufen.

Weber 11. Mai 2018 19:03

AW: Programmabsturz, aber warum
 
ok jetzt verstehe ich das.
ich muss im Prinzib innehalb der Schleife schon angeben das wenn die Zahl 3 erreicht ist da mit sie abgebrochen wird.
Das heist für mich das ich das so nicht realiesiren kann. Kann mir jemand sagen bzw einen Tipp geben wie ich so eine "Dauerschleife" erzeugen kann die immer +1 zu a Addiert wird.

Delphi.Narium 11. Mai 2018 19:58

AW: Programmabsturz, aber warum
 
Delphi-Quellcode:
while b<=0 do
  begin
    a := a + 1;
  end;
Nur, b bleibt immernoch unverändert. Du müsstest also auch mal definieren, wann b in welcher Form verändert werden soll.

Wenn wir mal das OnChange des Edits nehmen, soll vermutlich sowas in der Art dabei rauskommen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  a,b,c:Integer;
begin
//String Umwandlung in Integer
  a:=StrToInt(Edit1.Text);
  b:=StrToInt(Edit2.Text);
//While-Schleife
  while b<=0 do
    begin
      a := a + 1;
      Edit1.Text:=IntToStr(a);
      if a = 3 then
      begin
        b := 3;
      end;
    end;
end;

Weber 11. Mai 2018 20:16

AW: Programmabsturz, aber warum
 
Das hilft mir schon mal weiter. Danke

Ich probiere das morgen mal aus ob ich das so machen kann oder ob das dan an einer anderen Stelle hängen bleibt.

freimatz 12. Mai 2018 06:58

AW: Programmabsturz, aber warum
 
vermutlich willst du nach
Edit1.Text:=IntToStr(a);
noch ein Edit1.Update haben und nach auch noch eine kleine Pause?

Alallart 12. Mai 2018 15:24

AW: Programmabsturz, aber warum
 
Vielleicht noch etwas, es wurde zwar schon erwähnt, aber die Wichtigkeit wurde evtl. nicht so richtig betont. Komponenten in Delphi werden nicht zeitnah aktualisiert, erst dann (sagen wir es etwas vereinfacht) wenn etwas Zeit da ist. Um das zu verstehen muss man verstehen wie Windows funktioniert. Delphi gehört zu den ereignisorientierten Programmiersprachen. Sie macht also erst dann etwas, wenn etwas passiert, z. B. man klickt auf ein Button. Oder man gibt etwas in ein Editfeld ein. Oder man verlässt ein Editfeld, usw. Damit eine ereignisorientierte Aktion ausgeführt wird, und procedure TForm1.Edit1Change(Sender: TObject) ist so eine ereignisorientierte Prozedur, muss es von Windows erst eine Nachricht bekommen, dass da etwas passiert ist. Diese Nachricht kommt aber in deinem Fall nicht. Das Edit2-Feld wird zwar verändert (bzw. du versuchst es), aber dein Programm ist so mit der While-Schleife beschäftigt, dass es keine Nachrichten verarbeitet. Es bekommt also nicht mit, dass da etwas passiert. Erst dann wenn die Schleife oder Prozedur beendet ist. Du aber geht davon aus, dass wenn du etwas in Edit2 eingibst, das System es mitbekommt. Tut es nicht.

Weber 14. Mai 2018 17:48

AW: Programmabsturz, aber warum
 
Sory das ich mich heute erst melde hatte bissel was um die Ohren.
Wollte nur bescheid sagen das das jetzt funktioniert so wie ich das brauche. Danke für eure Hilfe


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 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