![]() |
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 09:01 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