Ergebnis 1 bis 20 von 47

Thema: Delphi - Fragen!

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Zitat Zitat
    und da ich zweitens etwas ganz anderes umsetzen möchte, was mit repeat...until locker möglich sein sollte.
    Aber nicht in einer GUI-Umgebung. In einem Kommandozeilenprogramm wäre eine repeat-schleife sicher die richtige Idee, in einem GUI-Programm aber nicht.

    Ich versuch es mal anschaulich zu erklären:
    Wenn du eine GUI-Applikation schreibst verzahnst du dein Programm eng mit der Funktionsweise von Windows. Sprich, Windows überwacht für dich den gesamten Userinput, also Mausbewegungen, Mausklicks und Tastendrücke. Wenn Windows nun merkt "Der Benutzer hat die linke Maustaste gedrückt" guckt Windows welches offene Programm gerade den Fokus hat und benarichtigt dieses Programm über dieses Ereigniss, indem es eben dem Programm eine Message sendet.
    Das Programm wiederrum empfängt diese Message, verarbeitet diese und wartet wiederrum auf neue Messages.

    Das Problem bei deinem Programm und der Schleife ist, der Verarbeitungsprozess der Nachricht "Button wurde angeklickt" ist erst beendet wenn die aufgerufene Funktion zuende ist. Baust du dort nun eine Schleife ein, wird dieser Prozess erst beendet wenn die Schleife beendet ist. Solange dieser Prozess aber nicht beendet wird, wird dein Programm auf neue Nachrichten von Windows nicht reagieren, also auch nicht auf neuen Userinput. Wenn du eine solche Schleife benutzt musst du auch innerhalb der Schleife selber dafür sorgen, daß sie irgendwann verlassen wird. Alles andere ist eine Endlosschleife. Bei deinem Code bricht die Schleife nur ab wenn eine Variable eine bestimmte Bedingung erfüllt, nur da die Variable innerhalb der Schleife nicht verändert wird gibt es nur 2 Möglichkeiten:
    - Die Schleife bricht sofort ab da die Variable die Bedingung erfüllt
    - Die Schleife bricht nie ab, da die Variable die Bedingung nicht erfüllt und auch nicht geändert wird

    Wenn du willst, daß etwas geändert wird sobald Bedingung X erfüllt ist, aber gleichzeitig den normalen Programmablauf nicht unterbrechen willst (da du noch auf Userinput reagieren willst) musst du dich eben da einhaken wo eine Funktion periodisch immer aufgerufen wird, ein Timer wie Ineluki es im Beispiel benutzt wäre da eine Lösung.

  2. #2
    Nun, ich hatte letztendlich nur einen begin + end Rahmen vergessen, es hat sich geklärt. Falls es jemanden interessiert:

    Code:
     begin 
     repeat 
     ok := false;
     v1 := random(51) + 1;
     if not (v1 = v2) 
     then
     begin 
     lbltext.Caption := text[v1];
     ok := true; 
     end;
     until ok; 
     end;
    Ich hätte vielleicht sagen sollen, dass ich Random-Integers verwende. Diese mussten natürlich jedesmal neu bestimm werden, daher kam das Aufhängen. Da ich begin und end (rot markiert) vergessen hatte, wurde ok := true (ok ist ein Boolean) nicht ausgeführt und es kam zu Fehlern. Habe es zum Glück endlich herausgefunden, das, was ich wollte war wohl zu schaffen. Habe die Schleife nochmal blau markiert. Danke nochmal an alle anderen.


    EDIT:
    Dann mal meine nächste Frage.^^
    Es gibt ja den sleep - Befehl. Wenn ich mitten beim Ausführen des Programmierten eine Pause haben will, dann gehts weiter, wie kann ich das dann machen? Mit sleeps funktioniert es irgendwie nicht richtig.

    Geändert von Expresseon (30.11.2007 um 16:14 Uhr)

Berechtigungen

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