Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mit POS Smilys ersetzen, findet aber nur 1. Smily (https://www.delphipraxis.net/17023-mit-pos-smilys-ersetzen-findet-aber-nur-1-smily.html)

Die Muhkuh 27. Feb 2004 07:24


Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
Nunja, komischer Titel aber er trifft genau zu!

Also ich hab folgenden Code:
Delphi-Quellcode:
procedure TForm1.SmilyAktuallisieren(Richedit: TRxRichEdit);
var
  I : Integer;
begin
  for I := 0 to Richedit.Lines.Count - 1 do
  begin
    if pos(':-)', Richedit.Lines.Text) <> 0 then
    begin
      with Richedit do
      begin
        SelStart := pos(Copy(Richedit.Lines.Text, pos(':-)', Richedit.Lines.Text) - 2, 2), Richedit.Lines.Text);
        SelLength := 3;
        SelText := ' ';
        Form1.Image1.picture.LoadFromFile(BildPath + 'S_grinsend.bmp');
        InsertSmily;
      end;
    end;

    if pos(':-(', Richedit.Lines.Text) <> 0 then
    begin
      with Richedit do
      begin
        SelStart := SelStart - 4;
        SelLength := 3;
        SelText := '';
        Form1.Image1.picture.LoadFromFile(BildPath + 'S_schmollend.bmp');
        InsertSmily;
      end;
    end;

    if pos(':-|', Richedit.Lines.Text) <> 0 then
    begin
      with Richedit do
      begin
        SelStart := SelStart - 4;
        SelLength := 3;
        SelText := '';
        Form1.Image1.picture.LoadFromFile(BildPath + 'S_neutral.bmp');
        InsertSmily;
      end;
    end;

    if pos(':-D', Richedit.Lines.Text) <> 0 then
    begin
      with Richedit do
      begin
        SelStart := SelStart - 4;
        SelLength := 3;
        SelText := '';
        Form1.Image1.picture.LoadFromFile(BildPath + 'S_lachend.bmp');
        InsertSmily;
      end;
    end;
  end;
end;
Ich füge in ein RXRichEdit einen Smily ein. Der Code für einen lachenenden ist :-). Da geht auch aber wenn zwei mal ein lachender Smily eingefügt wird. Bekommt nur der erste ein Bild beim zweiten steht immer noch der code da (:-)). Kann mir mal jemand helfen? Das Problem ist das immer nur das erste Vorkommen geprüft wird und dann hörts auf!

Matze 27. Feb 2004 07:26

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
Probiere das mal:

Delphi-Quellcode:
if pos(':-)', Richedit.Lines[i]) <> 0 then

Sharky 27. Feb 2004 07:29

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
Hai Spider,

Du prüfst ja auch nur einmal pro Zeile ob ein "Smily" da ist. Du solltest dein Pos-Prüfung in eine Schleife packen die so lange durchlaufen wird bis der Smily in der Zeile nicht mehr gefunden wird.

[Edit] Und der Hinweis von Matze ist natürlich auch zu beachten ;-) [/Edit]

Die Muhkuh 27. Feb 2004 07:30

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
ne geht auch net.

Jetzt sieht das so aus:

Code:
Admin (27.02.2004 08:29:57):
asd (Hier ist ein Smily) in (27.02.2004 08:30:00):
asd :-) asdasd
Admin (27.02.2004 08:30:04):
 asas
Da wo noch :-) ist kein Smily.


PS: Da wo in (<Datum, Zeit>) steht sollte Admin (<Datum , Zeit>)

Die Muhkuh 27. Feb 2004 07:32

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
Zitat:

Zitat von Sharky
Hai Spider,

Du prüfst ja auch nur einmal pro Zeile ob ein "Smily" da ist. Du solltest dein Pos-Prüfung in eine Schleife packen die so lange durchlaufen wird bis der Smily in der Zeile nicht mehr gefunden wird.

[Edit] Und der Hinweis von Matze ist natürlich auch zu beachten ;-) [/Edit]


Hi Fisch,

Ähm die Pos-Prüfung ist doch schon in einer Schleife oder wie meinst du des?

Matze 27. Feb 2004 07:35

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
Du solltest 2 Schleifen nehmen, eine, die die Zeile komplett durchläuft und eine, die alle zeilen durch läuft.

Die äußere Schleife durchläuft alle zeilen, die innere jedes zeichen einer zeile. :gruebel:

Die Muhkuh 27. Feb 2004 07:42

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
:wiejetzt:?

Wo soll dann die Schleife hin?

Matze 27. Feb 2004 07:44

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
Die soll dahin, wo du den Text nach Smileys überprüfst.

Die Muhkuh 27. Feb 2004 07:48

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
Also hier:
Delphi-Quellcode:
 for I := 0 to Richedit.Lines.Count - 1 do
  begin
    if pos(':-)', Richedit.Lines.Text) <> 0 then
    begin
      with Richedit do
      begin
        for II := 0 to {Was???} do //<-- HIER?
        begin
        SelStart := pos(Copy(Richedit.Lines.Text, pos(':-)', Richedit.Lines.Text) - 2, 2), Richedit.Lines.Text);
        SelLength := 3;
        SelText := ' ';
        Form1.Image1.picture.LoadFromFile(BildPath + 'S_grinsend.bmp');
        InsertSmily;
      end;
    end;
    end;

Matze 27. Feb 2004 07:51

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
ne, so:

Delphi-Quellcode:
for i := 0 to RichEdit.Lines.Count.1 do
  for i := 1 to LängederZeile(kA, wie der Befehl ist :angle2:) do
  begin
     //Code
  end;

Die Muhkuh 27. Feb 2004 07:57

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
Delphi-Quellcode:
for II := 0 to Richedit.Line[I] do
begin
  //Code
end;
Ich denk mal so.

Matze 27. Feb 2004 07:59

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
Zitat:

Zitat von Spider
Delphi-Quellcode:
for II := 0 to Richedit.Line[I] do
begin
  //Code
end;
Ich denk mal so.

Musst du immer mit den Tags spielen? :warn: :mrgreen:

Die 2. Schleife aber nicht vergessen.

Spezi1980 27. Feb 2004 08:00

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
Das sollte so ähnlich aussehen:

Delphi-Quellcode:
(pseudocode)

//erstmal alle Zeilen durchlaufen
for I := 0 to Richedit.Lines.Count - 1 do
begin
  //dann jede Zeile durchlaufen
  Z := Pos(':-)',Richedit.Lines[I]);
  while Z>0 do begin
    SelStart := pos(Copy(Richedit.Lines[I], Z - 2, 2), Richedit.Lines[I]);
    SelLength := 3;
    SelText := ' ';
    Form1.Image1.picture.LoadFromFile(BildPath + 'S_grinsend.bmp');
    InsertSmily;
    Z := Pos(':-)',Richedit.Lines[I]);
  end;

  //und so weiter und so fort...
  Z := Pos(':-(',Richedit.Lines[I]);
  while Z>0 do begin
    {...}
    Z := Pos(':-(',Richedit.Lines[I]);
  end

end;

das ganze würde ich aber noch schöner machen:

Delphi-Quellcode:
(pseudocode)
procedure TForm1.SmilyAktuallisieren(Richedit: TRxRichEdit);
  procedure ReplaceSmilie(const Line,Smily,Bitmap:String);
  var Z : Integer;
  begin
    Z := Pos(Smily,Line);
    while Z>0 do begin
      SelStart := pos(Copy(Line, Z - 2, 2), Line);
      SelLength := 3;
      SelText := ' ';
      Form1.Image1.picture.LoadFromFile(BildPath + Bitmap);
      InsertSmily;
      Z := Pos(Smily,Line);
    end;
  end;

var I : Integer;
begin
  for I := 0 to Richedit.Lines.Count - 1 do
  begin
    ReplaceSmilie(Richedit.Lines[I],':-)','S_grinsend.bmp');
    ReplaceSmilie(Richedit.Lines[I],':-(','S_schmollend.bmp');
    {...}
  end;
sieht doch schon viel übersichtlicher und kleiner aus...

Luckie 27. Feb 2004 11:00

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
pos findet imme rnur das erste Vorkommen. Hier noch eine Funktion, die jedes beliebige Vorkommen findet. Man muss nur immer die Position des letzten Vorkommen angeben.
Delphi-Quellcode:
function NextPos(SubStr: AnsiString; Str: AnsiString; LastPos: DWORD
  = 0): DWORD;
type
  StrRec = packed record
    allocSiz: Longint;
    refCnt: Longint;
    length: Longint;
  end;

const
  skew = sizeof(StrRec);

asm
  // Search-String passed?
  TEST   EAX,EAX
  JE     @@noWork

  // Sub-String passed?
  TEST   EDX,EDX
  JE     @@stringEmpty

  // Save registers affected
  PUSH   ECX
  PUSH   EBX
  PUSH   ESI
  PUSH   EDI

  // Load Sub-String pointer
  MOV    ESI,EAX
  // Load Search-String pointer
  MOV    EDI,EDX
  // Save Last Position in EBX
  MOV    EBX,ECX

  // Get Search-String Length
  MOV    ECX,[EDI-skew].StrRec.length
  // subtract Start Position
  SUB    ECX,EBX
  // Save Start Position of Search String to return
  PUSH   EDI
  // Adjust Start Position of Search String
  ADD    EDI,EBX

  // Get Sub-String Length
  MOV    EDX,[ESI-skew].StrRec.length
  // Adjust
  DEC    EDX
  // Failed if Sub-String Length was zero
  JS     @@fail
  // Pull first character of Sub-String for SCASB function
  MOV    AL,[ESI]
  // Point to second character for CMPSB function
  INC    ESI

  // Load character count to be scanned
  SUB    ECX,EDX
  // Failed if Sub-String was equal or longer than Search-String
  JLE    @@fail
@@loop:
  // Scan for first matching character
  REPNE  SCASB
  // Failed, if none are matching
  JNE    @@fail
  // Save counter
  MOV    EBX,ECX
  PUSH   ESI
  PUSH   EDI
  // load Sub-String length
  MOV    ECX,EDX
  // compare all bytes until one is not equal
  REPE   CMPSB
  // restore counter
  POP    EDI
  POP    ESI
  // all byte were equal, search is completed
  JE     @@found
  // restore counter
  MOV    ECX,EBX
  // continue search
  JMP    @@loop
@@fail:
  // saved pointer is not needed
  POP    EDX
  XOR    EAX,EAX
  JMP    @@exit
@@stringEmpty:
  // return zero - no match
  XOR    EAX,EAX
  JMP    @@noWork
@@found:
  // restore pointer to start position of Search-String
  POP    EDX
  // load position of match
  MOV    EAX,EDI
  // difference between position and start in memory is
  //   position of Sub
  SUB    EAX,EDX
@@exit:
  // restore registers
  POP    EDI
  POP    ESI
  POP    EBX
  POP    ECX
@@noWork:
end;
Ist, glaube ich, von unserer Katze :cat:, die jetzt gerade Trill frißt. :roll:

Treffnix 27. Feb 2004 11:04

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
Dafür gibts doch auch PosEx
Delphi-Quellcode:
function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;

Alexander 27. Feb 2004 17:04

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
Die müsste aber um einiges langsamer sein als die von sakura (die Luckei gepostet hat)..
Meine ich zu mindest..

APP 27. Feb 2004 17:23

Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
 
Hallo,

Zitat:

Zitat von Treffnix
Dafür gibts doch auch PosEx
Delphi-Quellcode:
function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;

das betrift Euch zwar nicht, aber diese Funktion gibt es bei meinem D5 zu Hause noch nicht.

p.s
Habe mal gegoogelt:
Laut Marco Cantú gibt es diese Funktion erst ab D7.

[OT]
:mrgreen:
zuerst habe ich nur "PosEx" gegoogelt, da bekam ich
Seiten die sich mit Po-Sex beschäftigten zurück, :roteyes:
erst bei "Delphi PosEx" stieß ich auf Marco.
:mrgreen:
[/OT]


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