Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Smilies im Richedit (https://www.delphipraxis.net/48110-smilies-im-richedit.html)

freak1985 20. Jun 2005 22:18


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

Luckie 20. Jun 2005 22:21

Re: Smilies im Richedit
 
Wie wäre es mit SelStart den Cursor an die entsprechende Stelle zu setzen?

freak1985 20. Jun 2005 22:24

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?

Luckie 20. Jun 2005 22:26

Re: Smilies im Richedit
 
Für eine neue Frage erstell bitte auch einen neuen Thread.

freak1985 20. Jun 2005 22:42

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;

malo 20. Jun 2005 22:47

Re: Smilies im Richedit
 
Der Fehler liegt wohl in der letzten Zeile:

Delphi-Quellcode:
until Selstart < 0
Bis der Selstart UNTER 0 ist. Dabei kann er gar nicht niedriger als 0 sein ;)

Richtig sollte es heißen:

Delphi-Quellcode:
until SelStart >= Length(ChatBox.Text)
Dieser Code würde solange ausgeführt werden, bis ganz unten am Text angekommen würde ;)

//edit: Es wird außerdem nirgendwo SelStart verändert. Wie kann das auch zu einem Ende kommen?

freak1985 20. Jun 2005 22:50

Re: Smilies im Richedit
 
- bitte löschen -

freak1985 20. Jun 2005 23:22

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;

freak1985 21. Jun 2005 13:24

Re: Smilies im Richedit
 
hat denn keiner eine Idee woran das liegen könnte?

jfheins 21. Jun 2005 13:25

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 ;) )

freak1985 21. Jun 2005 13:27

Re: Smilies im Richedit
 
PosEx()?

und das is doch in der schleife, oder net?

jfheins 21. Jun 2005 13:28

Re: Smilies im Richedit
 
Ja, vergiss den Teil in Klammern ;)

PosEx ist in der Unit StrUtils dehklariert, näheres in der OH ...

freak1985 21. Jun 2005 13:36

Re: Smilies im Richedit
 
also PosEx gibts in meiner delphi hilfe und in dieser unit net :(

jfheins 21. Jun 2005 13:41

Re: Smilies im Richedit
 
Zitat:

PosEx (Funktion)

Die Funktion gibt den Indexwert eines Teilstrings zurück.

Unit
StrUtils

Kategorie
String-Verarbeitung

Delphi-Syntax:
function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;


Beschreibung

PosEx gibt den Index von SubStr in S zurück, wobei die Suche bei Offset begonnen wird. Wenn Offset 1 ist (Vorgabe), entspricht PosEx Pos.

PosEx gibt 0 zurück, wenn SubStr nicht gefunden wird, Offset größer als die Länge von S ist oder Offset kleiner als 1 ist.
Das sagt meine OH (D7) ... welche Delphiversion hast du denn ?

Khabarakh 21. Jun 2005 13:42

Re: Smilies im Richedit
 
Gibt es erst genau ab D7.
Aber eigentlich sollte doch der Text entfernt werden und so auch Pos reichen :gruebel: .

Neutral General 21. Jun 2005 13:42

Re: Smilies im Richedit
 
also ich habe sowas ähnliches schonmal programmiert und hab es etwas angepasst :

Delphi-Quellcode:
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;
Ich hoffe das dir das hilft und ich nicht irgendwie an dir vorbeirede ^^
Bei der Zeile mit

Delphi-Quellcode:
insert('hehe',Text,posi);
musst du halt dein Smilie einfügen aber ich denke das das funktioniert.

freak1985 21. Jun 2005 13:45

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 ;)

freak1985 21. Jun 2005 13:56

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.

Flocke 21. Jun 2005 13:58

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.

freak1985 21. Jun 2005 14:10

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:
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;
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!?

Flocke 21. Jun 2005 15:00

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;

freak1985 23. Jun 2005 08:21

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

uschi 23. Jun 2005 08:38

Re: Smilies im Richedit
 
Für eine neue Frage erstell bitte auch einen neuen Thread.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 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