Autor |
Beitrag |
n0thin
Hält's aus hier
Beiträge: 13
|
Verfasst: So 13.12.09 21:30
Hi,
nun, ich schreibe gerade an einem Programm, was mehrfach hintereinander vorkommende Leerzeichen in einem RichEdit-Feld löscht.Das Ganze soll ein- und ausschaltbar ablaufen.
Ich kenne aber leider keinen Befehl, mit dem man die aktuelle Stelle im Text herausfinden kann, also muss ich jedesmal den ganzen Text überprüfen. Das wäre die eine Möglichkeit mein eigentliches Problem zu beheben. Dieses liegt nämlich darin, dass dadurch, dass man immer ein veränderten Text ins RichEdit ausgibt, wenn etwas gelösch wurde, dieses immer auf den Anfang zurückspringt. Das ist zwar logisch, aber eben trotzdem störend. Hier wäre die zweite Lösungsmöglichkeit, ich bräuchte einen Befehl, mit dem man direkt aus dem RichEdit löschen kann und nicht den Umweg über eine zusätzliche String-Variable gehen muss. Das sollte das lästige Springen verhindern.
MfG
|
|
JoelH
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: Mo 14.12.09 09:48
_________________ mfg. Joel
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Mo 14.12.09 12:50
Ja, das klingt doch genau richtig!
Das wäre dann doch einfach so zu lösen:
Delphi-Quelltext 1:
| Search_And_Replace(Richedit1,' ',' '); |
Dann wäre nur die Frage, was Du mit "ein- und ausschaltbar ablaufen" meinst...(?)
|
|
n0thin 
Hält's aus hier
Beiträge: 13
|
Verfasst: Mo 14.12.09 19:31
Mit ein- und ausschaltbar ablaufen meine ich, dass man das Löschen von Leerzeichen, welches an sich automatisch abläuft, ein- und ausschaltbar gestalten kann, was über eine Boolean-Variable und ein Button funktioniert. Heißt, sobald ich den Button drücke, werden sämtliche doppelten Leerzeichen gelöscht und auch, wenn ich weiter schreibe, wird dieser Fehler immer wieder bereinigt. Ich habe also die Search_And_Replace-function genommen und ins Programm gepackt. Sie wird immer bei der Prozedur REdtText.OnChange abgerufen. Blöderweise entsteht bei mir schon wenn ich nur eine einzige Taste drücke, egal welche, ein Fehler und das Programm stürzt mit der Begründung StackOverflow ab, was natürlich nicht im Sinne des Entwicklers ist. Vllt. ist da eine Endlosschleife drin oder ich habs irgendwie komplett falsch implementiert, auch wenn ich eigentlich nur Copy&Paste probiert hab-.-
MfG
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Mo 14.12.09 19:55
Naja, wenn Du direkt beim schreiben in OnChange() das kontrollieren möchtest, dann musst Du doch nur immer bei OnChange(..) die beiden gerade geschriebenen kontrollieren - also so:
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure Richedit1.OnChange(Sender:TObject); begin if (immerPruefen=true) and (copy(Richedit1.Text,Length(Richedit1.Text)-3,2)=' ') then Richedit1.Text:=copy(Richedit1.Text,0,Length(Richedit1.Text)-1) end; |
...was natürlich nur in der Hoffnung geht, dass keiner so mal eben irgendwo dazwischen eine Änderung macht!
...und wenn Du das ganze nicht immer direkt beim Schreiben kontrollieren möchtest, brauchst Du doch nur so zu schreiben:
Delphi-Quelltext 1: 2: 3: 4:
| for i:=0 to Length(Richedit1.Text)-1 do if copy(Richedit1.Text,i,2)=' ' then Richedit1.Text=copy(Richedit1.Text,0,i])+copy(Richedit1.Text,i+2,Length(Richedit1.Text)-i-2) |
So, ich hoffe, dass ich jetzt hier nicht gerade irgendwelchen Sch... zusammengeschrieben habe, weil ich das ganze noch drei mal umgeschrieben habe um es hoffentlich verständlich auszudrücken.
|
|
n0thin 
Hält's aus hier
Beiträge: 13
|
Verfasst: Mo 14.12.09 20:39
Erstmal danke für die schnelle Antwort!
Nun, wie du selbst sagst funktioniert den Vorschlag nur, wenn jemand nicht irgendwo mitten rein schreibt. Mir ist es aber lieber, wenn er immer gleich das ganze Programm ausliest, als wenn er nur das Textende kontrolliert. Sonst würde ich das prinzipiell sogar eher über .KeyPress machen.
Den Befehl mit dem Löschen auf Button-Klick habe ich auch schon implentiert, das automatische ein- und ausschaltbare Löschen ist eigentlich nur eine Zusatzfunktion.
MfG
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Di 15.12.09 20:11
Hallo,
n0thin hat folgendes geschrieben : | Ich habe also die Search_And_Replace-function genommen und ins Programm gepackt. Sie wird immer bei der Prozedur REdtText.OnChange abgerufen. Blöderweise entsteht bei mir schon wenn ich nur eine einzige Taste drücke, egal welche, ein Fehler und das Programm stürzt mit der Begründung StackOverflow ab, was natürlich nicht im Sinne des Entwicklers ist. Vllt. ist da eine Endlosschleife drin oder ich habs irgendwie komplett falsch implementiert, auch wenn ich eigentlich nur Copy&Paste probiert hab-.- |
da ist nicht nur vllt. eine "Endlosschleife" drin, sondern mit Sicherheit. Dadurch das du in OnChange den Text im RichEdit veränderst(oder durch die Art der Veränderung), löst du ein erneutes OnChange aus usw. usw. usw ...
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
JoelH
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: Di 15.12.09 21:26
Lannes hat folgendes geschrieben : | Hallo,
n0thin hat folgendes geschrieben : | Ich habe also die Search_And_Replace-function genommen und ins Programm gepackt. Sie wird immer bei der Prozedur REdtText.OnChange abgerufen. Blöderweise entsteht bei mir schon wenn ich nur eine einzige Taste drücke, egal welche, ein Fehler und das Programm stürzt mit der Begründung StackOverflow ab, was natürlich nicht im Sinne des Entwicklers ist. Vllt. ist da eine Endlosschleife drin oder ich habs irgendwie komplett falsch implementiert, auch wenn ich eigentlich nur Copy&Paste probiert hab-.- | da ist nicht nur vllt. eine "Endlosschleife" drin, sondern mit Sicherheit. Dadurch das du in OnChange den Text im RichEdit veränderst(oder durch die Art der Veränderung), löst du ein erneutes OnChange aus usw. usw. usw ... |
Das stimmt nicht ganz. In Der Tat löst die letzte Änderung wohl einen neuen Chance-Event aus, allerdings ist viel schlimmer, dass jeder Tastendruck, zumindest bei lengen Texten, schneller getätig wird als die Replacefuntion arbeitet. Dadurch ergibt sich zum einen ein Problem, aber es ergeben sich auch mehrere Lösungsmöglichkeiten.
Zum einen kannst du die Richedit disablen wärend das onCange läuft, dadurch verbietest du weitere eingaben und verhinderst dadurch die Endlosschleife. Der Nachteil ist, dass die Eingaben gehackt kommen und Buchstaben vergessen werden können.
Die andere Möglichkeit ist es eine Formglobale-Boolean-Variable innerhalb der oNChange Procedure zu setzen, diese setzt du im Create auf false. Danach setzt du deinen Repalcefuntion in ein if-Construkt in das nur hineingelaufen wird wenn eben diese Boolean false ist. Bist du im If, dann setzt du die boolean true und arbeitest replace ab. solange dies läuft wird zwar bei Tastendruck das onChange aufgerufen aber es läuft über das Replace drüber. Bist du mit dem Replace fertig setzt du die Boolean wieder auf false udn alle weiteren Tasteneingaben werden beim nächsten onChange abgearbeitet. Du vermeidest dadurch die Endlosschleife. Beides hat Vor und Nachteile aber beides funktioniert im Hausgebrauch.
_________________ mfg. Joel
|
|
|