Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Zeichenkette im RichEdit zählen (https://www.delphipraxis.net/160716-zeichenkette-im-richedit-zaehlen.html)

Elexarie 27. Mai 2011 13:27

Zeichenkette im RichEdit zählen
 
Hallo Delphi-Praix,

ich sitze gerade an einem kleinen Programm, mit dem ich Chars und Strings zählen soll.

Chars habe ich hinbekommen, was wiefolgt aussieht:
Delphi-Quellcode:
begin
    CountButton2 := 0;

      for i := 1 to Length(RichEdit1.Text) do
        begin
          if (RichEdit1.Text[i] = Edit1.Text) then
          inc(CountButton2)
        end;
    Label2.Caption := 'Es sind ' + inttostr(CountButton2) + ' ' + Edit1.Text + ' vorhanden.';
end;
Nun soll ich das ganze aber mit einer Zeichenkette machen. Ich habe aber gerade keine logische Lösung dafür.
Angenommen ich suche 'Hallo';
Ich muss ja von der Position 1 die nächsten fünf Buchstaben überprüfen. Nun ist meine Idee ursprünglich gewesen, die nächsten 4 Stacks des Arrays zu untersuchen, aber wie mache ich das denn am einfachsten. Leider kann man ja nicht auf diese Art vorgehen. Habt ihr andere Vorschläge. Bitte erstmal nur Pseudocode. Will die Lösung selbst syntaktisch ausarbeiten. Wenn ich wirklich nicht weiterkomme, bitte ich noch einmal um einen Code.:oops:

Vielen Dank im Vorraus. Entschuldigungen für die vielen Fragen. Ich hoffe ich kann künftig selber dienen.

DeddyH 27. Mai 2011 13:49

AW: Zeichenkette im RichEdit zählen
 
Versuch es einmal mit Delphi-Referenz durchsuchenPosEx.

alfold 27. Mai 2011 13:56

AW: Zeichenkette im RichEdit zählen
 
Schon mal bei den StrUtils geschaut?
AnsiContainsText sucht in einen text ob das Suchwort vorhanden ist

Gruss alfold

DeddyH 27. Mai 2011 14:05

AW: Zeichenkette im RichEdit zählen
 
Das hilft so für sich allein aber beim Zählen auch nicht weiter.

blackfin 27. Mai 2011 14:15

AW: Zeichenkette im RichEdit zählen
 
Schau dir mal das MapReduce Verfahren an, wenn du in Texten nach der Anzahl / Häufigkeit von Wörtern suchen willst.
Auf der Seite einfach mal etwas nach unten Scrollen und die "Beispielhafte Berechnung" angucken.


Ansonsten kannst du auch die folgende Funktion verwenden, die die Position eines gesuchten strings in einem Text ermittelt.
Wenn ein Wort öfters vorkommt, einfach den Text ab der ersten Fundstelle + Wortlänge des gesuchten Wortes abschneiden und weitersuchen.

Delphi-Quellcode:
function ASMstrPos(SubStr: AnsiString; Str: AnsiString;): DWORD;
type
  StrRec = packed record
  allocSiz: Longint;
  refCnt: Longint;
 length: Longint;
end;

const
        skew = sizeof(StrRec);

  asm
           TEST   EAX,EAX
           JE     @@noWork
           TEST   EDX,EDX
           JE     @@stringEmpty
           PUSH   ECX
           PUSH   EBX
           PUSH   ESI
           PUSH   EDI
           MOV    ESI,EAX
           MOV    EDI,EDX
           MOV    EBX,ECX
           MOV    ECX,[EDI-skew].StrRec.length
           SUB    ECX,EBX
           PUSH   EDI
           ADD    EDI,EBX
           MOV    EDX,[ESI-skew].StrRec.length
           DEC    EDX
           JS     @@fail
           MOV    AL,[ESI]
           INC    ESI
           SUB    ECX,EDX
           JLE    @@fail

         @@loop:
           REPNE  SCASB
           JNE    @@fail
           MOV    EBX,ECX
           PUSH   ESI
           PUSH   EDI
           MOV    ECX,EDX
           REPE   CMPSB
           POP    EDI
           POP    ESI
           JE     @@found
           MOV    ECX,EBX
           JMP    @@loop

         @@fail:
           POP    EDX
           XOR    EAX,EAX
           JMP    @@exit

         @@stringEmpty:
           XOR    EAX,EAX
           JMP    @@noWork

         @@found:
           POP    EDX
           MOV    EAX,EDI
           SUB    EAX,EDX

         @@exit:
           POP    EDI
           POP    ESI
           POP    EBX
           POP    ECX

         @@noWork:
end;
Edit II: Reguläre Ausdrücke würden sich hier alternativ auch anbieten...

Elexarie 27. Mai 2011 16:53

AW: Zeichenkette im RichEdit zählen
 
So. Mit unwahrscheinlicher Kreativität.. Naja eigentlich war es ganz simpel, habe ich den String durchsucht bekommen.

Delphi-Quellcode:
var  i : integer;
begin
    for i := 1 to Length(RichEdit1.Text) do
      begin
           RichEdit1.SelStart := i - 1;
           RichEdit1.SelLength := Length(Edit2.Text);
           if (RichEdit1.SelText = Edit2.Text) then
           inc(CountButton3);
      end;
    Label4.Caption := 'Es sind ' + inttostr(Countbutton3) + ' ' + Edit2.Text + ' vorhanden.';
end;
Das wars! Danke für die Hilfe.. Mit dem ASM Code kann ich leider nichts anfangen .:(

DeddyH 27. Mai 2011 17:39

AW: Zeichenkette im RichEdit zählen
 
Ich hätte das so versucht (Fehler vorbehalten):
Delphi-Quellcode:
uses StrUtils;

function PatternCount(Src, Pattern: string; CaseInsensitive: Boolean = false): integer;
var
  CurrentPos: integer;
begin
  if CaseInsensitive then
    begin
      Src := AnsiLowerCase(Src);
      Pattern := AnsiLowerCase(Pattern);
    end;
  Result := 0;
  CurrentPos := PosEx(Pattern, Src);
  while CurrentPos <> 0 do
    begin
      inc(Result);
      CurrentPos := PosEx(Pattern, Src, CurrentPos + Length(Pattern));
    end;
end;


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