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 Smileys in JvRichEdit einfügen (https://www.delphipraxis.net/48581-smileys-jvrichedit-einfuegen.html)

tinibeenie 27. Jun 2005 16:48


Smileys in JvRichEdit einfügen
 
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;

toms 27. Jun 2005 23:24

Re: Smileys in JvRichEdit einfügen
 
Hallo,

Wie ist den AddImage() deklariert?

tinibeenie 28. Jun 2005 19:04

Re: Smileys in JvRichEdit einfügen
 
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.

Die Muhkuh 28. Jun 2005 19:07

Re: Smileys in JvRichEdit einfügen
 
Und was macht AddImageToRichEdit?

tinibeenie 28. Jun 2005 19:16

Re: Smileys in JvRichEdit einfügen
 
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;

toms 29. Jun 2005 03:12

Re: Smileys in JvRichEdit einfügen
 
Delphi-Quellcode:
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.

tinibeenie 1. Jul 2005 14:02

Re: Smileys in JvRichEdit einfügen
 
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? :gruebel:

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.


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