![]() |
Mit POS Smilys ersetzen, findet aber nur 1. Smily
Nunja, komischer Titel aber er trifft genau zu!
Also ich hab folgenden Code:
Delphi-Quellcode:
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!
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; |
Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
Probiere das mal:
Delphi-Quellcode:
if pos(':-)', Richedit.Lines[i]) <> 0 then
|
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] |
Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
ne geht auch net.
Jetzt sieht das so aus:
Code:
Da wo noch :-) ist kein Smily.
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 PS: Da wo in (<Datum, Zeit>) steht sollte Admin (<Datum , Zeit>) |
Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
Zitat:
Hi Fisch, Ähm die Pos-Prüfung ist doch schon in einer Schleife oder wie meinst du des? |
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: |
Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
:wiejetzt:?
Wo soll dann die Schleife hin? |
Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
Die soll dahin, wo du den Text nach Smileys überprüfst.
|
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; |
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; |
Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
Delphi-Quellcode:
Ich denk mal so.
for II := 0 to Richedit.Line[I] do
begin //Code end; |
Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
Zitat:
Die 2. Schleife aber nicht vergessen. |
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:
sieht doch schon viel übersichtlicher und kleiner aus...
(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; |
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:
Ist, glaube ich, von unserer Katze :cat:, die jetzt gerade Trill frißt. :roll:
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; |
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;
|
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.. |
Re: Mit POS Smilys ersetzen, findet aber nur 1. Smily
Hallo,
Zitat:
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