Timer auf Funktionsereignis
-
Hallo,
kann man denn einen Timer so steuern, dass er immer dann ausgeführt wird, wenn eine Funktion beendet und ausgeführt wurde?
Habe ein TRichEdit mit dem EVENT OnKeyDown.
In diesem Event werden einige Dinge gesteuert, wie z.B. auslesen der aktuellen Zeile und abspeichern in ein Array, falls er Benutzer die "ENTER-Taste" drückt.Wenn nun dieses Ereignis vollständig abgeschlossen ist, möchte ich gerne im Anschluss daran eine weitere Funktion ausführen lassen, in der in die aktuelle Zeile des TRichEdit's ein Insert Ereignis auftritt.
In KurzForm:
void __fastcall TForm1::reditKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) {AnsiString s; int index=redit->Lines->Count; if (Key=='\r') {s=redit->Lines->Strings[index]; ... ... } .... .... }Danach springt die Position des Cursors ja bekanntlich um eine Stelle tiefer;
An dieser Position möchte ich nun den String ">> " einfügen.
Alle Möglichkeiten dies innerhalb eines OnKeyDown bzw. OnkeyPress Events schlagen fehl, was ja auch schnell einen Sinn macht.Und an dieser Stelle kommt der Timer ins Spiel:
Im PseudoCode:void __fastcall TForm1::Timer1Timer(TObject *Sender) { int count=redit->Lines->Count; TPoint cp=redit->CaretPos; if (reditKeyDown == abgeschlossen) { redit->Lines->Insert(Count,">> "); SetCaretPos(c.x,c.y); redit->SelStart=redit->Text.Length()-2; } }Ist es mögich einen Timer so einzustellen?
Vielen Dank
Todd
-
das ganze geht einfacher im OnKeyPress-Event und dann auch ohne Timer, dort brauchst du nur deinen Quellcode vom Timer und von OnKeyDown einzufügen, z.B.:
void __fastcall TForm1::reditKeyPress(TObject *Sender, char &Key) { if (Key == VK_RETURN) { // ... sonstige Bearbeitung ... int count=redit->Lines->Count; TPoint cp=redit->CaretPos; redit->Lines->Insert(count,">> "); SetCaretPos(cp.x,cp.y); redit->SelStart=redit->Text.Length()-2; Key = 0; }
-
Hallo,
danke für deine Antwort.
Ich denke, dass was ich möchte funktionert so oder so nicht.
Im KeyPress EVENT wird ja bei betätigung der ENTER Taste eine neue leere Zeile eingefügt.Füge ich jetzt in diese leere Zeile mittels
RichEdit->Lines->Insert(RichEdit->Lines->Count,">> ")
steht zwar in dieser Zeile am Anfang ein ">> " er fügt aber dennoch wieder eine leere Zeile darunter ein, wo auch der Cursor steht.
0. Zeile: >> "hier gebe ich text ein und der User drückt ENTER und Insert wird ausgeführt"
1. Zeile: >> //entsteht nach ENTER
2. Zeile | ← Cursor steht dennoch an dieser StelleEs sollte aber so aussehen:
0. Zeile: >> "Text" -> Drücken von ENTER
1. Zeile: >> | ← Cursor steht nun richtig.Mit SetCaretPos und SelStart hab ich es zwar geschafft, den Cursor an die richtige Stelle zu bringen, aber die letzte leere angelegete Zeile besteht weiterhin und lässt sich auch nicht löschen.
Deshalb hab ich beschlossen das ganze aufzugeben.

-
der Quellcode funktioniert prinzipiell schon, allerdings nicht in einem ganz leeren Richedit, da das RichEdit nie wirklich ganz leer ist, das merkt man schon daran, dass die im Objektinspektor eingegebenen Zeilen immmer mit einer leeren Zeile enden, auch wenn man das nicht so will
sobald man aber in einem leeren Richedit ein paar Zeichen eingetippt hat und dann Enter drückt werden nur die gewünschten Zeichen angefügthier nochmal eine gekürzte Version
void __fastcall TForm1::RichEdit1KeyPress(TObject *Sender, char &Key) { if (Key == VK_RETURN) { // ... sonstige Bearbeitung ... int count=RichEdit1->Lines->Count; RichEdit1->Lines->Add(">> "); Key = 0; } }
-
Es ist halt immer schwieriger vorhandene Funktionalität zu verändern statt etwas Neues zu implementieren.
Wenn du statt TRichEdit meinetwegen eine PaintBox nimmst, mußt du zwar alle Tastatur und Mausreaktionen selber implementieren. Andererseits hast du hier die volle Kontrolle.
-
Erstmals vielen Dank für eure Hilfe und ein ganz großes Lob an das gesamte Forum.
Ich habe es so gelöst wie es Linnea vorgeschlagen hat.
Der Knackpunkt an der ganzen Sache war folgende Zeile, die ich nie mit in Betracht gezogen habe:Key=0;
Bin mir immernoch unsicher, was hier denn wirklich geschieht. Wie verarbeitet dsa der Compiler?
Vielen Dank
-
Hallo
Das ist nichts besonderes. Key wird der Integerwert 0 zugewiesen (also nicht das Zeichen '0'). Da Key in dieser Funktion als Referenz übergeben wurde (sichtbar an dem &) bedeutet das das auch das Original des Methodenaufrufers verändert wird. In In diesem Fall bedeutet der char-Wert 0 das keine weitere Standardbehandlung des Tastenevents mehr erfolgen soll.
bis bald
akari