Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme mit Memo und Tastendruck (https://www.delphipraxis.net/22399-probleme-mit-memo-und-tastendruck.html)

Beatmaster S 17. Mai 2004 11:09


Probleme mit Memo und Tastendruck
 
Hallo zusammen,

ich versuche gerade ein Klickadventure zu schreiben. Die Dialoge werde in einem Memofeld dargestellt.Wenn man die ENTER-Taste drückt, soll der Dialog fortgeführt werden. Leider funktioniert das ganze aber gar nicht so, wie ich das haben will :wall:

Anstatt immer nachfolgende Textzeilen auszugeben, wird immer wieder nur die erste textzeile erneut ausgegeben, wenn man die ENTER-Taste drückt. Habt ihr eine Idee woran das liegen könnte?

Code:
procedure memo1keypress(Sender: Tobject; var key: char);
begin
 if key = #13 then begin
  weiter:= true;
 end;
end;
Code:
procedure personklick (Sender: Tobject);
begin
 weiter:= false;

 memo1.lines.add('hallo');
 while weiter = false do begin
  delay(1);
 end;
 weiter:= false;

 memo1.lines.add('hiho');
 while weiter = false do begin
  delay(1);
 end;
 weiter := false;
 
 
 memo1.lines.add('was geeeeeeht?');
 while weiter = false do begin
  delay(1);
 end;
 weiter := false;

 {..und so weiter das Ganze...}
end;
Ich bin langsam echt am Verzweifeln. Vielleicht bin ich auch auf nem ganzen falschen Weg. Bitte um Hilfe.
Schon mal Danke im Voraus!

Gruß Beatmaster

Sharky 17. Mai 2004 11:11

Re: Probleme mit
 
Hai Beatmaster S,

bitte geben deiner Frage einen etwas aussagekräftigeren Titel. Danke :-D

Stevie 17. Mai 2004 11:45

Re: Probleme mit Memo und Tastendruck
 
Versuch es mal statt Delay mit Application.ProcessMessages.
Dieser Befehl sorgt dafür, dass die Nachrichten des Programmes
weiter verarbeitet werden.

Silenoz84 17. Mai 2004 11:49

Re: Probleme mit Memo und Tastendruck
 
Servus,

also irgendwie gefällt mir der Code so nicht wirklich wie du das machst, irgendwas streubt sich da in mir wenn ich das sehe, kanns aber nicht wirklich sagen was?! Naja schau dir mal die Möglichkeit an, vieleicht hilft dir die auch weiter:

Code:
   ...
   var DialogPos: Integer; //Irgendwo in nem Public bereich deklarieren, so dass die entsprechende
                           //Prozedur und dass Tastenereignis darauf zugreifen können!
   ...
   procedure Dingsbums;
   begin
      case DialogPos of
           1: memo1.lines.add('blablbu');
           2: memo1.lines.add('lalala');
           3: memo1.lines.add('hgfhgf');
           4: memo1.lines.add('hgsgjdgh');
           5: memo1.lines.add('jdhgjgdhjhgd');
      end;
   end;
   ...
   procedure TastenDingsbums;
   begin
      Wenn Tastencode = 13 dann //Keine Ahnung wie das jetz heißt
           inc(DialogPos); //inkrementiere um 1
   end;
Hat noch die ein oder andere Macke, nur vom Ansatz find ich's halt en bissl effizienter (ich wette irgendjemand fällt dazu noch was um einiges besseres ein... :wink: )

Kannst mir aber mal erklären was des Delay macht? Hab das in der Hilfe nicht gefunden! Hält es das System für ne Sekunde an oder was?

*greetZ* Sile

P.S.: Wenn dein Adventure fertig ist, musst du es unbedingt hier posten!!! :-D


//Edit: Wow, da war Stevie schneller... also hält Delay das System an (immer sehr übel)!

Sharky 17. Mai 2004 11:55

Re: Probleme mit Memo und Tastendruck
 
Hai Beatmaster S,

warum nicht einfach so:

Delphi-Quellcode:
var
 icount : Integer;
 sl : TStringList;

procedure TForm1.FormCreate(Sender: TObject);
begin
  sl := TStringList.Create;
  sl.Add('Hallo');
  sl.Add('Halli');
  sl.Add('*blubb*');
  icount := 0;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeAndNil (sl);
end;

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  if key = #13 then
  begin
    if (icount < sl.Count) then
    begin
      Memo1.Lines.Add(sl.Strings[icount]);
      INC (icount);
    end;
  end;
end;

Stevie 17. Mai 2004 11:57

Re: Probleme mit Memo und Tastendruck
 
Zitat:

Zitat von Silenoz84
//Edit: Wow, da war Stevie schneller... also hält Delay das System an (immer sehr übel)!

Das hat es zumindest in Pascal immer gemacht. Ich meine, dass es diese Funktion bei Delphi garnicht mehr gibt, aber irgendwie ist sie schon implementiert worden. Hab ich auch schon bei mnir gemacht allerdings so:

Delphi-Quellcode:
procedure Delay(cardinal: ms);
var
  Ticks: cardinal;
begin
  Ticks := GetTickCount;
  while GetTickCount < (Ticks + ms) do
    Application.ProcessMessages;
end;
P.S.: Der Ansatz von Beatmaster scheint mir auch ein wenig "pascallastig" zu sein... :roll:

Beatmaster S 17. Mai 2004 12:29

Re: Probleme mit Memo und Tastendruck
 
Das der Quellcode total Banane war, wusste ich. Ich hatte es kurz darauf auch (wegen der Übersichtlichkeit) in eine Case-Abfrage geschrieben. Mittlerweile hab ich sogar geherausgefunden waran es genau lag, dass es nicht funktioniert hat :stupid:

Das Prob is nämlich, dass wenn das Memofeld nicht ausgewählt ist auch die ENTER-Taste nicht "aktiviert" ist. Gibt es denn irgendetwas, dass Tasten immer aktiviert sind, egal wo man sich befindet?

Das Delay gibt es bei meinem Deplhi auch nich mehr. Aber da ich das noch wo anderst brauche hab ich das Eingefügt.

Vielen Dank für die schnelle Hilfe. Ich werde wohl eine Stringlist fahren (wie mein IT-Lehrer immer zu sagen pflegt :thuimb:). Am Übersichtlichsten und da es ja mindestens 40 verschiedene Gespräche gibt, geht das so schneller. :-D Danke nochmal.

PS: Wäre aber nett, wenn mir jemand noch obige Frage beantworten könnte :oops:

Stevie 17. Mai 2004 12:37

Re: Probleme mit Memo und Tastendruck
 
Zitat:

Zitat von Beatmaster S
Das Prob is nämlich, dass wenn das Memofeld nicht ausgewählt ist auch die ENTER-Taste nicht "aktiviert" ist. Gibt es denn irgendetwas, dass Tasten immer aktiviert sind, egal wo man sich befindet?

Das geht mit der zumindest mit der Entertaste nicht, aber du könntest die KeyPress-Funktion allen möglichen Komponenten zuordnen, die auch ein OnKeyPress-Event haben.

Simon Joker 17. Mai 2004 13:33

Re: Probleme mit Memo und Tastendruck
 
Setze KeyPreview deiner Form auf true, dann werden alle Tastendrücke erst in den Formevents verarbeitet.
Auf Tasten wie Enter, Tab usw. wird nicht im KeyPress-Event sondern reagiert in KeyDown/KeyUP!

Cu Simon

Stevie 17. Mai 2004 13:37

Re: Probleme mit Memo und Tastendruck
 
Zitat:

Zitat von Simon Joker
Setze KeyPreview deiner Form auf true, dann werden alle Tastendrücke erst in den Formevents verarbeitet.
Auf Tasten wie Enter, Tab usw. wird nicht im KeyPress-Event sondern reagiert in KeyDown/KeyUP!

Cu Simon

:thuimb: Oh, wieder was gelernt...


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 Uhr.

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