Ergebnis 1 bis 20 von 47

Thema: Delphi - Fragen!

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Delphi - Fragen!

    Hi,
    ich habe ein Problem. Wenn man in einem Delphiprogramm auf einen Button klickt, soll in ein Label etwas geschrieben werden.

    Hier ein entsprechendes Abfragebeispiel:

    Code:
    if not (v1 = 10) then
     lbltext.Caption := text[v1];
    Diese Abfrage soll jetzt solange wiederholt werden, bis v1 nicht 10 ist, dann soll etwas in das Label geschrieben werden. Ich habe dies so versucht, das Programm hing sich dann aber wegen dem Loop auf:

    Code:
    repeat until ok = 1; 
      begin 
       if not (v1 = 10) then
        lbltext.Caption := text[v1];
        ok := 1;
        break;
      end;
    Der Zweck des Loops ist eben, dass man nicht solange auf den Button klicken muss, bis die Bedingung erfüllt ist, sondern dass solange weitergemacht wird, bis die Bedingung erfüllt ist. Danach wird der nächste Abfrageloop für ein anderes Label gestartet. Mit einem Button werden also mehrere Labels beschrieben.

    Was muss ich machen, damit es klappt und sich das Programm nicht mehr aufhängt?

    Danke im Vorraus!

    Geändert von Expresseon (22.11.2007 um 17:10 Uhr)

  2. #2
    Also wenn du die Überprüfung beim Button-Klick machst, ist es ja klar, dass sich das Programm aufhängt, wenn die Bedingung jedesmal wieder durchlaufen wird. Wieso machst du die Überprüfung nicht dann, wenn sich der Textbox-Inhalt ändert. Soweit ich weiß, gibt es ein solches Ereignis bei der Textbox. (Kann das jetzt aber nicht überprüfen.)

  3. #3
    Ein Loop ist unbedingt erforderlich, da sonst alles nur einmal überprüft wird und ggf. nicht alle Felder ausgefüllt werden. Da ist es auch egal, wie ich die Schleife abfrage.

  4. #4
    Zitat Zitat von PX Beitrag anzeigen
    Ein Loop ist unbedingt erforderlich, da sonst alles nur einmal überprüft wird und ggf. nicht alle Felder ausgefüllt werden. Da ist es auch egal, wie ich die Schleife abfrage.
    Ich sagte doch, mach die Abfrage (normale If-Abfrage, kein Loop) jedesmal, wenn sich der Textbox-Inhalt ändert. Dann brauchst du garkeinen Loop. Dann wird, wenn der Anwender sein Eingabe korrigiert, automatisch die Überprüfung gestartet.

  5. #5
    Zitat Zitat von The_Best_Isaac Beitrag anzeigen
    Also wenn du die Überprüfung beim Button-Klick machst, ist es ja klar, dass sich das Programm aufhängt, wenn die Bedingung jedesmal wieder durchlaufen wird. Wieso machst du die Überprüfung nicht dann, wenn sich der Textbox-Inhalt ändert. Soweit ich weiß, gibt es ein solches Ereignis bei der Textbox. (Kann das jetzt aber nicht überprüfen.)
    Das ist kompliziert, immer wenn sich der Text ändert, eine Überprüfung zu machen, erfüllt nicht den Sinn. Der Benutzer gibt eh nichts ein, v1 ist ein Random-Integer... Loops sind definitiv die einzige Lösung, da bin ich mir sicher.

  6. #6
    Zitat Zitat von PX Beitrag anzeigen
    Das ist kompliziert, immer wenn sich der Text ändert, eine Überprüfung zu machen, erfüllt nicht den Sinn. Der Benutzer gibt eh nichts ein, v1 ist ein Random-Integer... Loops sind definitiv die einzige Lösung, da bin ich mir sicher.
    Gut, wenn die Änderung von v1 nicht vom Benutzer gemacht wird, hast du recht. Aber wenn du nach Klick auf den Button ein Loop durchläufst, in dem die abzufragende Variable nicht geändert wird, hast du eine Endlosschleife, also ist es klar, dass sich das Programm aufhängt. Wenn der Wert von v1 zufällig bestimmt wird, musst du die Bedingung eben nach jeder Änderung abfragen. Und wird die Änderung des ZUfallswerts durch den Benutzer veranlasst? Also dann man z.B. auf einen Button "Zufallszahl generieren" oder so klickt?

  7. #7
    Also, der Loop wird natürlich unterbrochen. Er wird solange gemacht, bis die Variable ok zu 1 wird (sie ist zunächst 0), tritt der Textänderungsfall ein, wird ja:
    Code:
    ok := 1
    ...der Loop unterbrochen! Die Zufallszahl(en) werden durch den Buttonklick veranlasst, das spielt aber keine Rolle.

  8. #8
    Nur ein kleiner Einwurf...
    Müsste da nicht das until ganz nach unten?
    Code:
    repeat
      if not (v1 = 10) then
        lbltext.Caption := text[v1];
      ok := 1;
      break;
    until ok = 1;
    Sonst wird doch die repeat-until-Schleife ohne Inhalt durchlaufen und die Bedingung kann sich gar nicht ändern. Oder denke ich grad falsch?
    (Andererseits erscheint es so auch sinnlos, da man sich auch die Schleife sparen kann - selbst wenn ok vorher schon 1 ist, wird der Wert ja erst am Ende abgefragt, und wenn es nicht 1 ist, wird es in jedem Fall in der Schleife 1 gesetzt. Daher wird der Schleifeninhalt doch immer einmal aufgerufen, ganz egal, was geschieht... und dann ist doch die Schleife sinnlos. *Kopfschüttel* Irgendwie versteh ich das alles nicht. ^^)
    Code:
    repeat 
      if v1 = 10 then 
      sleep(1000);
    until v1 <> 10;      
    lbltext.Caption := text[v1];
    So, ich hab das jetzt mal so umgebaut, wie ich dich verstanden habe... Die Schleife wird so lange wiederholt, bis v1 nicht mehr 10 ist. Dabei hab ich innendrin noch ein sleep, damit nicht die ganze Zeit lang diese Schleife durchgelaufen wird... Egal, kann man auch rauslassen. Jedenfalls - wenn dann v1 ungleich 10 wird, geht der Quelltext ganz normal danach weiter (wozu ein break?) und die Caption wird gesetzt. Aber bestimmt habe ich wirklich alles ganz falsch verstanden...

    Geändert von Moyaccercchi (22.11.2007 um 19:20 Uhr)

  9. #9
    Sleeps kannte ich gar nicht, danke dafür.
    Auch mit der repeat - until Schleife hast du gleube ich recht, aber trotzdem werden nicht alle Labels gefüllt! (erst nachdem man mehrmals geklickt hat) Wenn ich <> wähle, hängt es sich auch wieder auf.

    Edit: Klappt! 10x getestet, funktioniert. Danke.

    Edit2: ....... Da ja der Captionbefehl jetzt außerhalb des Loops steht, treten Fehler im Programm auf. Einfach in den Loop schreiben geht nicht. Was tun?

    Geändert von Expresseon (22.11.2007 um 19:59 Uhr)

  10. #10
    Was für Fehler treten denn auf? ^^

  11. #11
    Nach dem Sleep bzw generell in JEDER laengeren Schleife sollte man Application.ProcessMessages; aufrufen, damit sich die GUI nicht aufhaengt, weil nur noch die Schleife und nicht mehr die Windows-Message-Loop abgearbeitet wird.

    Der Fehler kann nicht dadran liegen, ob das label in oder ausserhalb der Schleife geaendert wird. Hast du dich vielleicht vertippt ?

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •