AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Mit POS Smilys ersetzen, findet aber nur 1. Smily
Thema durchsuchen
Ansicht
Themen-Optionen

Mit POS Smilys ersetzen, findet aber nur 1. Smily

Ein Thema von Die Muhkuh · begonnen am 27. Feb 2004 · letzter Beitrag vom 27. Feb 2004
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#11

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

  Alt 27. Feb 2004, 07:57
Delphi-Quellcode:
for II := 0 to Richedit.Line[I] do
begin
  //Code
end;
Ich denk mal so.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#12

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

  Alt 27. Feb 2004, 07:59
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?

Die 2. Schleife aber nicht vergessen.
  Mit Zitat antworten Zitat
Benutzerbild von Spezi1980
Spezi1980

Registriert seit: 11. Aug 2003
Ort: Dresden OT Cossebaude
71 Beiträge
 
Delphi 2005 Personal
 
#13

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

  Alt 27. Feb 2004, 08:00
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...
Robert
Codito, ergo sum.
>>I code, therefore I am<<
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#14

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

  Alt 27. Feb 2004, 11:00
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 , die jetzt gerade Trill frißt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Treffnix
Treffnix

Registriert seit: 25. Jun 2003
Ort: AC
740 Beiträge
 
Delphi 7 Professional
 
#15

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

  Alt 27. Feb 2004, 11:04
Dafür gibts doch auch PosEx
function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#16

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

  Alt 27. Feb 2004, 17:04
Die müsste aber um einiges langsamer sein als die von sakura (die Luckei gepostet hat)..
Meine ich zu mindest..
Alexander
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#17

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

  Alt 27. Feb 2004, 17:23
Hallo,

Zitat von Treffnix:
Dafür gibts doch auch PosEx
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]

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

[/OT]
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 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