AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Smileys in JvRichEdit einfügen

Offene Frage von "tinibeenie"
Ein Thema von tinibeenie · begonnen am 27. Jun 2005 · letzter Beitrag vom 1. Jul 2005
Antwort Antwort
tinibeenie

Registriert seit: 5. Feb 2005
Ort: Barsbüttel
34 Beiträge
 
Delphi XE6 Professional
 
#1

Smileys in JvRichEdit einfügen

  Alt 27. Jun 2005, 17:48
Hallo!

Um Smileys in ein JvRichEdit zu bekommen, habe ich mich am JVCL-Messenger-Beispiel orientiert. Es klappt auch größtenteils, nur verstehe ich nicht, wie das mit der Integer-Variable "State" funktioniert. Es ist doch nirgendwo definiert, was State=1,10,20 usw. ist, also woher weiß das Program, dass wenn z.B. State=1 ist, der ':' gemeint ist. Es steht ja nur im Kommentar, aber nirgendwo als "richtiger Code". Ist das irgendwie schon vordefiniert oder so?

Es wär toll, wenn ihr mir helfen könntet. Das ist die dazugehörige Prozedur:

Delphi-Quellcode:
procedure TMessengerMainForm.ParseString(const S: string);
var
  P, Q: PChar;
  State: Integer;
  procedure AddImage(const SmileIndex, SmileLength: Integer);
  begin
    AddTextToRichEdit(Q, P - Q - SmileLength + 1, FCurrentFont);
    AddImageToRichEdit(SmileIndex);
    State := 0;
    Q := P + 1;
  end;
begin
  P := PChar(S);
  Q := P;
  State := 0;

  // State = 1.. then looking at ":-A" with A = @x)( etc.
  // 10.. "LOL"
  // 20.. "O :-)"
  // 30.. "(blush)"
  // 40.. ":'-("
  // 50.. "8-)"
  // 60.. ";-)"
  // 70.. "readonly"
  // 80.. "read-only on" or "read-only off"
  //
  // State = 1 -> ":" read
  // State = 2 -> ":-" read
  // State = 11 -> "LO" read
  // State = 22 -> "O :" read
  // State = 23 -> "O :-" read
  //
  // etc.

  while P^ <> #0 do
  begin
    case P^ of
      '$':
        if State in [2, 23] then
          AddImage(9, 3) // :-$
        else
          State := 0;
      '&':
        if State in [2, 23] then
          AddImage(4, 3) // :-&
        else
          State := 0;
      '(':
        case State of
          1, 22: AddImage(5, 2); // :(
          2, 23: AddImage(5, 3); // :-(
          40: AddImage(2, 3); // :,(
          41: AddImage(2, 4); // :'-(
        else
          State := 30;
        end;
      ')':
        case State of
          1, 22: AddImage(11, 2); // :)
          2: AddImage(11, 3); // :-)
          23: AddImage(6, 5); // O :-)
          35: AddImage(3, 7); // (blush)
          51: AddImage(1, 3); // 8-)
          61: AddImage(15, 3); // ;-)
        else
          State := 0;
        end;
      '*':
        if State = 1 then
          AddImage(7, 2) // :*
        else
          State := 0;
      ',':
        if State in [1, 22] then
          State := 40
        else
          State := 0;
      '-':
        case State of
          1, 22, 40, 50, 60: Inc(State);
          73: State := 80;
        else
          State := 0;
        end;
      '8': State := 50;
      '"': State := -1; // to prevent "read.." etc will be triggered by the program
      ':':
        if State = 21 then
          State := 22
        else
          State := 1;
      ';': State := 60;
      '@':
        case State of
          1, 22: AddImage(0, 2); // :@
          2, 23: AddImage(0, 3) // :-@
        else
          State := 0;
        end;
      'D':
        case State of
          1, 22: AddImage(8, 2); // :D = LOL
          2, 23: AddImage(8, 3) // :-D = LOL
        else
          State := 0;
        end;
      'L':
        if State = 11 then
          AddImage(8, 3) // LOL
        else
          State := 10;
      'O':
        if State = 10 then
          State := 11
        else
          State := 20;
      '\', '/':
        if State in [2, 23] then
          AddImage(14, 3) // :-\
        else
          State := 0;
      'a':
        if State = 71 then
          State := 72
        else
          State := 0;
      'b':
        if State = 30 then
          State := 31
        else
          State := 0;
      'd':
        if State = 72 then
          State := 73
        else
          State := 0;
      'e':
        if State = 70 then
          State := 71
        else
          State := 0;
      'f':
        case State of
          86: State := 87;
          87: HandleReadOnlyOff;
        else
          State := 0;
        end;
      'h':
        if State = 34 then
          State := 35
        else
          State := 0;
      'l':
        if State in [31, 75, 82] then
          Inc(State)
        else
          State := 0;
      'n':
        case State of
          74, 81: Inc(State);
          86: HandleReadOnlyOn;
        else
          State := 0;
        end;
      'o':
        case State of
          2, 23: AddImage(12, 3); // :-o
          73, 80, 85: Inc(State);
        else
          State := 0;
        end;
      'p':
        if State in [2, 23] then
          AddImage(13, 3) // :-p
        else
          State := 0;
      'r':
        if State <> -1 then
          State := 70
        else
          State := 0;
      's':
        if State = 33 then
          State := 34
        else
          State := 0;
      'u':
        if State = 32 then
          State := 33
        else
          State := 0;
      'x', 'X':
        if State in [2, 23] then
          AddImage(10, 3) // :-x
        else
          State := 0;
      'y':
        case State of
          76: HandleReadOnly;
          83: State := 84;
        else
          State := 0;
        end;
      ' ':
        case State of
          20, 84: Inc(State);
          11: State := 21;
        else
          State := 0;
        end;
    end;
    Inc(P);
  end;

  if Q < P then
    AddTextToRichEdit(Q, P - Q, FCurrentFont);
end;
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: Smileys in JvRichEdit einfügen

  Alt 28. Jun 2005, 00:24
Hallo,

Wie ist den AddImage() deklariert?
Thomas
  Mit Zitat antworten Zitat
tinibeenie

Registriert seit: 5. Feb 2005
Ort: Barsbüttel
34 Beiträge
 
Delphi XE6 Professional
 
#3

Re: Smileys in JvRichEdit einfügen

  Alt 28. Jun 2005, 20:04
Hallo toms!

Das ist AddImage:

Delphi-Quellcode:
procedure AddImage(const SmileIndex, SmileLength: Integer);
begin
  AddTextToRichEdit(Q, P - Q - SmileLength + 1, FCurrentFont);
  AddImageToRichEdit(SmileIndex);
  State := 0;
  Q := P + 1;
end;
Sie ist direkt in der procedure ParseString() (also die Prozedur aus meinem oberen Beitrag) deklariert. SmileIndex ist dabei der ImageIndex aus einer ImageList und SmileLength die Länge der Zeichen, die dann zum Bild umgewandelt werden sollen, z.B. wären 2, wären 3 Zeichen, die dann durch das Bild ersetzt werden sollen.
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Smileys in JvRichEdit einfügen

  Alt 28. Jun 2005, 20:07
Und was macht AddImageToRichEdit?
  Mit Zitat antworten Zitat
tinibeenie

Registriert seit: 5. Feb 2005
Ort: Barsbüttel
34 Beiträge
 
Delphi XE6 Professional
 
#5

Re: Smileys in JvRichEdit einfügen

  Alt 28. Jun 2005, 20:16
Hallo Spider!

Das ist AddImageToRichEdit:

Delphi-Quellcode:
procedure TForm2.AddImageToRichEdit(const AImageIndex: Integer);
var
  Bitmap: TBitmap;
begin
  Bitmap := TBitmap.Create;
  try
    ImageList1.GetBitmap(AImageIndex, Bitmap);
    JvRichEdit1.InsertGraphic(Bitmap, False);

    { Move cursor }
    with JvRichEdit1.GetSelection do
      JvRichEdit1.SetSelection(cpMin + 1, cpMin + 1, False);
  finally
    Bitmap.Free;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#6

Re: Smileys in JvRichEdit einfügen

  Alt 29. Jun 2005, 04:12
AddImage(SmileIndex, ...); fuegt das Smiley mit Index SmileIndex von der TImageList ins RichEdit.

Empfehlung: Setze einen Breakpoint in dei ParseString() Prozedur und fuehre den Code Schritt fuer Schritt aus, damit du siehst, was genau passiert. Es ist im Prinzip eine Bei Google suchenState Machine.
Thomas
  Mit Zitat antworten Zitat
tinibeenie

Registriert seit: 5. Feb 2005
Ort: Barsbüttel
34 Beiträge
 
Delphi XE6 Professional
 
#7

Re: Smileys in JvRichEdit einfügen

  Alt 1. Jul 2005, 15:02
Okay, hab's mir noch mal mit F7 angeguckt, hat aber auch nicht viel gebracht. Ich versteh nämlich immer noch nicht, wie es kommt, dass z.B. aus State=1 der Doppelpunkt entstehen kann. Es steht zwar im Kommentar (den ich hier noch mal rangehängt hab (aus der procedure ParseString)), aber es es steht eben nur im Kommentar und nicht im richtigen Programmtext. Wie kann das denn funktionieren? Woher "weiß" das Programm, dass state=x Zeichen y bedeutet?

Delphi-Quellcode:
// State = 1.. then looking at ":-A" with A = @x)( etc.
// 10.. "LOL"
// 20.. "O :-)"
// 30.. "(blush)"
// 40.. ":'-("
// 50.. "8-)"
// 60.. ";-)"
// 70.. "readonly"
// 80.. "read-only on" or "read-only off"
//
// State = 1 -> ":" read
// State = 2 -> ":-" read
// State = 11 -> "LO" read
// State = 22 -> "O :" read
// State = 23 -> "O :-" read
//
// etc.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 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