Autor Beitrag
n0thin
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Mo 14.12.09 09:48 
hilft dir das eventuell schon weiter?

www.swissdelphicente.../showcode.php?id=314

_________________
mfg. Joel
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Mo 14.12.09 12:50 
Ja, das klingt doch genau richtig!
Das wäre dann doch einfach so zu lösen:
ausblenden Delphi-Quelltext
1:
Search_And_Replace(Richedit1,'  ',' ');//also in dem ersten String zwei und in dem zweiten nur ein Leerzeichen					

Dann wäre nur die Frage, was Du mit "ein- und ausschaltbar ablaufen" meinst...(?)
n0thin Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: 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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
for i:=0 to Length(Richedit1.Text)-1 do
if copy(Richedit1.Text,i,2)='  ' then
//hier kannst Du dann das tun, was Du für nötig hältst, z.B.:
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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Di 15.12.09 20:11 
Hallo,

user profile iconn0thin hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Di 15.12.09 21:26 
user profile iconLannes hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

user profile iconn0thin hat folgendes geschrieben Zum zitierten Posting springen:
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