Autor Beitrag
wi3738
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 18.06.03 16:34 
Hallo,

ich habe folgendes Problem : Ich möchte in einem Programm zur Demonstration von Hashverfahren eine Schleife, die die History aller bisher getätigten Eingaben abspielt, auf Benutzerwunsch abbrechen.
Ich habe in diesem Forum zwar schon eine Menge Sachen gefunden, die haben aber alle nicht funktioniert.
Der Code sieht ungefähr so aus :

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TFOberflaeche.loadtempfile;
begin
  while not((eof(tempfile)) or (Abbruch)) do
   begin
    application.processmessages;
    .
    .
    .
   end;
end;

procedure TFOberflaeche.FormKeypress(Sender: TObject; var Key: Char);
begin
 if ((upcase)Key='X') 
  then Abbruch:=true;
end;



Die Tastatureingabe wird zwar angenommen, aber erst nach Beendigung der Schleife ausgeführt. Die Eigenschaft keyPreview des Formulars steht auf true.
Hat irgendjemand von euch eine Idee, wie man die Schleife vorher abbrechen kann?? Code wäre göttlich!!

Gruß, Frank
Pascal
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 155

Win 98, Win XP
Delphi 2005, Delphi 5
BeitragVerfasst: Mi 18.06.03 17:16 
Ich hab den Code mal ausprobiert und vorher soweit angepasst, dass ich ihn einfach laufen lassen kann. Er funktioniert:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.KeyPreview:=true;
  while Abbruch do
   begin
   button1.Caption:='Schleife';
    application.processmessages;
   end;
button1.Caption:='Ende';
end;

procedure tform1.FormKeypress(Sender: TObject; var Key: Char);
begin
if ((upcase(Key)='X'))
  then Abbruch:=false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
abbruch:=true;
end;
Kannst du ja ausprobieren und schauen ob's nen Unterschied gibt.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.06.03 17:32 
Um deinen Code zu behalten, kannst du auch einfach (Abbruch) vor das or setzen und dein EndOfFile dahinter.
Das Ganze begründet sich in der boolschen Abfrage von Delphi. Standardmäßig macht der das nämlich so kurz wie möglich, wenn der erste True ist, prüft er bei or gar nicht mehr den zweiten, sondern macht gleich weiter.
Zu deaktivieren in den Compileroptionen vom Projekt.
wi3738 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 18.06.03 18:45 
Vielen Dank schon mal für eure Mühe.
Habe den Code ausprobiert und auch die bool´sche Bedingung
umgedreht, leider wird die Tastatureingabe trotzdem erst nach der Schleife abgearbeitet.
Gibt es noch andere Möglichkeiten?? Häng nicht so sehr an dem Code, kann ihn auch gerne umbauen / neu machen.

Vielen Dank schon mal,
Gruß, Frank
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.06.03 18:57 
Probier mal beides einzeln zu negieren mit not und nicht in der Klammer.
wi3738 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 18.06.03 19:40 
Nein, das funktioniert leider auch nicht.
Gibt es nicht irgendeinen Befehl, der abfragt, ob ein Tastaturereignis eingetreten ist??
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Mi 18.06.03 23:19 
Hallo!

Mir ist nicht ganz klar, was da nicht funktionieren soll.
Bricht die Schleife überhaupt nicht ab?
Dann könnte es sein, daß die "FormKeypress" nicht ausgeführt wird.

Wenn die Schleife abbricht, ist doch alles in Ordnung. Da nur 1 mal in der Schleife "Application.ProcessMessages" aufgerufen und nur einmal (am Anfang) die Variable "Abbruch" geprüft wird, läuft die Schleife auf jeden Fall weiter, bist das "end" erreicht ist. Dann wird die Bedingung erneut geprüft.

Vorschlag: setze das "Applikation.Processmessages" an das Ende der Schleife! Wenn nämlich im Schleifenlauf das Ereignis auftritt, ist es noch nicht bearbeitet, die Schleife startet den nächsten Lauf und dann wird am Anfang die Eingabe bearbeitet. Anschließend wird die Schleife noch einmal durchlaufen.
Mit Nachrichtenverarbeitung am Ende der Schleife bricht der Lauf sofort ab.
Das Ganze wirkt sich natürlich nur aus, wenn der Schleifendurchlauf relativ lang ist.

Noch eine Fehlermöglichkeit: Irgendwo wird "abbruch" wieder zurückgesetzt. Vielleicht hast Du ja in einer Prozedur eine als lokal gedachte Variable Abbruch, die Du nur vergessen hast zu deklarieren (oder ein Schreibfehler in der Deklaration, z.B. "Abruch").
Der Compiler findet die globale "Abbruch" und benutzt sie - Fehler schwer zu finden.

Gruß

Dietmar Brüggendiek
wi3738 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 19.06.03 11:06 
Die Schleife brach überhaupt nicht ab.
Habe sie aber nun mal mit
"processmessages" gespikt, jetzt funktioniert es. Vielen Dank Leute