![]() |
Smilies im Richedit
hallo.
ich möchte eine procedure, die es ermöglicht, alle text-smilies wie zB ":-)" durch ein grafisches zu ersetzen. dazu habe ich mir überlegt, dass ich mit Pos() die Position von ":-)" suche und an dieser stelle dann das bild einfüge. ich verwende das TJvRichedit (Jedi). Dort gibt es eine Routine zum einfügen von bildern, die das bild immer an der aktuellen cursorposition einfügt. So nun mein fragen: 1) wie kann ich zu dieser stelle "springen", sodass ich dann das bild einfügen kann. 2) wie kann ich das am besten verallgemeinern für mehrere Smilies. nicht nur das eine ":-)" ich hoffe, dass ihr versteht was ich meine... Schonmal Danke für eure Antworten. MfG |
Re: Smilies im Richedit
Wie wäre es mit SelStart den Cursor an die entsprechende Stelle zu setzen?
|
Re: Smilies im Richedit
hm, ok.
werde es sofort ausprobieren. aber nebenbei nochmal eine frage: ich füge am ENDE vom richedit immer wieder text dazu. wie kann ich es ermöglichen, dass das richedit IMMER nach unten scrollt, also immer ganz unten ist? |
Re: Smilies im Richedit
Für eine neue Frage erstell bitte auch einen neuen Thread.
|
Re: Smilies im Richedit
hab nun folgendes probiert um das bild einzufügen. es klappt auch wunderbar. aber nur wenn die schleife nicht da ist.
dadurch wird leider immer nur das ERSTE smilie durch ein bild ersetzt. wie kann ich nun am besten lösen, dass alle ersetzt werden? wenn ich das so wie unten steht MIT der schleife verwende, is das ne endloschleife die ganz viele bilder hintereinander zeichnet. wahrscheilich wird das graf. smilie auch wieder als ": - )" erkannt. kann jmd helfen?
Delphi-Quellcode:
repeat
{ Text-Smilie finden } ChatBox.SelStart := Pos(':-)', ChatBox.Text) - 1; if ChatBox.SelStart >= 0 then begin { Smilie lsöchen } ChatBox.SelLength := 3; ChatBox.SelText := ''; { Bild einfügen } AddImageToRichEdit(0); end; until Chatbox.SelStart < 0; |
Re: Smilies im Richedit
Der Fehler liegt wohl in der letzten Zeile:
Delphi-Quellcode:
Bis der Selstart UNTER 0 ist. Dabei kann er gar nicht niedriger als 0 sein ;)
until Selstart < 0
Richtig sollte es heißen:
Delphi-Quellcode:
Dieser Code würde solange ausgeführt werden, bis ganz unten am Text angekommen würde ;)
until SelStart >= Length(ChatBox.Text)
//edit: Es wird außerdem nirgendwo SelStart verändert. Wie kann das auch zu einem Ende kommen? |
Re: Smilies im Richedit
- bitte löschen -
|
Re: Smilies im Richedit
so leider funzt es doch nicht :(
es funzt grade wie es will.. manchmal aber hängt er sich einfach auf. ich weiß nicht an was es liegen könnte :( kann jemand helfen? hier mal der code:
Delphi-Quellcode:
var
i: integer; Smilie: array[1..13] of string; function GetImageIndex(Image: String): Integer; begin if image = '(cool)' then Result := 0; if image = ':-\' then Result := 1; if (image = ':-(') or (image = ':(') then Result := 2; if (image = ':-)') or (image = ':)') then Result := 3; if (image = ';-)') or (image = ';)') then Result := 4; if (image = ':-D') or (image = ':D') then Result := 5; if (image = ':P') or (image = ':p') or (image = ':-P') then Result := 6; end; begin (* RichEdit1.Perform(EM_SCROLLCARET, 0, 0); RichEdit1.SelStart:=length(RichEdit1.text); *) Smilie[1] := ':-)'; Smilie[2] := ':-\'; Smilie[3] := ':-('; Smilie[4] := ':('; Smilie[5] := ':-)'; Smilie[6] := ':)'; Smilie[7] := ';-)'; Smilie[8] := ';)'; Smilie[9] := ':-D'; Smilie[10] := ':D'; Smilie[11] := ':P'; Smilie[12] := ':-P'; Smilie[13] := ':p'; for i := 1 to High(Smilie) do repeat { Text-Smilie finden } ChatBox.SelStart := Pos(Smilie[i], ChatBox.Text) - 1; if Pos(Smilie[i], chatbox.text) > 0 then begin { Smilie lsöchen } ChatBox.SelLength := Length(Smilie[i]); ChatBox.SelText := ''; { Bild einfügen } AddImageToRichEdit(GetImageIndex(Smilie[i])); end; until ChatBox.SelStart >= Length(ChatBox.Text); end; |
Re: Smilies im Richedit
hat denn keiner eine Idee woran das liegen könnte?
|
Re: Smilies im Richedit
Du musst mit Posex suchen, damit du deine vorige Fundstelle nicht nocheinmal findest !
(Und natürlich SelStart in der Schleife setzen ;) ) |
Re: Smilies im Richedit
PosEx()?
und das is doch in der schleife, oder net? |
Re: Smilies im Richedit
Ja, vergiss den Teil in Klammern ;)
PosEx ist in der Unit StrUtils dehklariert, näheres in der OH ... |
Re: Smilies im Richedit
also PosEx gibts in meiner delphi hilfe und in dieser unit net :(
|
Re: Smilies im Richedit
Zitat:
|
Re: Smilies im Richedit
Gibt es erst genau ab D7.
Aber eigentlich sollte doch der Text entfernt werden und so auch Pos reichen :gruebel: . |
Re: Smilies im Richedit
also ich habe sowas ähnliches schonmal programmiert und hab es etwas angepasst :
Delphi-Quellcode:
Ich hoffe das dir das hilft und ich nicht irgendwie an dir vorbeirede ^^
procedure ReplaceSmilie(Smile : String; Source : TRichedit);
var Posi : Integer; text : String; begin text := Source.Text; while pos(Smile,Text) <> 0 do begin if pos(Smile,Text) > 0 then begin Posi := pos(Smile,Text); delete(Text,pos(Smile,Text),Length(Smile)); // ':)' wird gelöscht insert('hehe',Text,posi); // und an dessen stelle 'hehe' eingefügt. Bei dir eben das bild end; Source.Text := Text; end; end; Bei der Zeile mit
Delphi-Quellcode:
musst du halt dein Smilie einfügen aber ich denke das das funktioniert.
insert('hehe',Text,posi);
|
Re: Smilies im Richedit
@Khabarakh
das isses ja auch. Das funzt ja auch ne weile, aber irgendwann will er net mehr. ich bau mal ein test prg zusammen und poste es hier. vllt findet ihr den (wahrscheinlich kleinen, dummen) fehler ;) |
Re: Smilies im Richedit
Liste der Anhänge anzeigen (Anzahl: 1)
hm,
ich probier deinen code mal aus. aber hier erstmal mein aktuelles prog. is ein jvRichedit, das das TRichedit das ja net so kann mit den bildern. |
Re: Smilies im Richedit
Wenn du sowieso ein JvRichEdit benutzt, warum nimmst du nicht die Funktion FindText? Wenn du stSetSelection angibst, dann markiert die dir sogar schon die Fundstelle.
|
Re: Smilies im Richedit
@ Flocke.
danke für den tipp. hab ich übersehen. hab das nun auch so gemacht, und daraus entsteht folgender code, der auch funzt :)
Delphi-Quellcode:
es ist ja nun so, dass er zunächst einmal immer nur das ERSTE smilie von einer sorte ersetzt. ich brauch nun noch ne repeat oder while schleife für außenherum, sodass er auch alle vorkommenden ersetzt. nur fällt mir keine bedingung für die schleife ein!?
procedure TForm1.Button1Click(Sender: TObject);
var i: integer; Smilie: array[1..13] of string; function GetImageIndex(Image: String): Integer; begin if image = '(cool)' then Result := 0 else if image = ':-\' then Result := 1 else if (image = ':-(') or (image = ':(') then Result := 2 else if (image = ':-)') or (image = ':)') then Result := 3 else if (image = ';-)') or (image = ';)') then Result := 4 else if (image = ':-D') or (image = ':D') then Result := 5 else if (image = ':P') or (image = ':p') or (image = ':-P') then Result := 6 else Result := -1; end; begin Smilie[1] := '(cool)'; Smilie[2] := ':-\'; Smilie[3] := ':-('; Smilie[4] := ':('; Smilie[5] := ':-)'; Smilie[6] := ':)'; Smilie[7] := ';-)'; Smilie[8] := ';)'; Smilie[9] := ':-D'; Smilie[10] := ':D'; Smilie[11] := ':P'; Smilie[12] := ':-P'; Smilie[13] := ':p'; for i := 1 to High(Smilie) do if Pos(Smilie[i], ChatBox.Text) > 0 then begin ChatBox.FindText(Smilie[i], 0, Length(Chatbox.Text), [stSetSelection]); ChatBox.SelLength := Length(Smilie[i]); ChatBox.SelText := ''; AddImageToRichEdit(GetImageIndex(Smilie[i])); end; end; |
Re: Smilies im Richedit
Etwa so (das Pos kannst du dir sparen):
Delphi-Quellcode:
for i := 1 to High(Smilie) do
while ChatBox.FindText(Smilie[i], 0, -1, [stMatchCase]) >= 0 do begin ChatBox.SelLength := Length(Smilie[i]); ChatBox.SelText := ''; AddImageToRichEdit(GetImageIndex(Smilie[i])); end; |
Re: Smilies im Richedit
@Flocke:
danke für die verkürzte Form. Funzt prima. aber nun möchte ich nun, dass wenn man text aus dem richedit rauskopieren will, die bilder-smilies wieder in text-similes zurück-verwandelt werden, sodass man den text z.B. auch im notepad lesen kann (mit den text-smilies). wenn ich jetzt den text kopiere kopiert er halt einfach die bilder-smilies mit raus. das problem ist halt, dass der notepad zB keine bilder anzeigen kann. aber ich weiß ünerhaupt nicht, wie ich das anfangen soll und ob das überhaupt geht. kann mir da jemand helfen? MfG |
Re: Smilies im Richedit
Für eine neue Frage erstell bitte auch einen neuen Thread.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz