Delphi-PRAXiS
Seite 2 von 2     12   

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: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 09:01 Uhr.
Seite 2 von 2     12   

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