AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zeichenkette im RichEdit zählen

Ein Thema von Elexarie · begonnen am 27. Mai 2011 · letzter Beitrag vom 27. Mai 2011
Antwort Antwort
Elexarie

Registriert seit: 7. Apr 2011
32 Beiträge
 
#1

Zeichenkette im RichEdit zählen

  Alt 27. Mai 2011, 13:27
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.

Vielen Dank im Vorraus. Entschuldigungen für die vielen Fragen. Ich hoffe ich kann künftig selber dienen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Zeichenkette im RichEdit zählen

  Alt 27. Mai 2011, 13:49
Versuch es einmal mit Delphi-Referenz durchsuchenPosEx.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Zeichenkette im RichEdit zählen

  Alt 27. Mai 2011, 13:56
Schon mal bei den StrUtils geschaut?
AnsiContainsText sucht in einen text ob das Suchwort vorhanden ist

Gruss alfold
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Zeichenkette im RichEdit zählen

  Alt 27. Mai 2011, 14:05
Das hilft so für sich allein aber beim Zählen auch nicht weiter.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#5

AW: Zeichenkette im RichEdit zählen

  Alt 27. Mai 2011, 14:15
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...

Geändert von blackfin (27. Mai 2011 um 14:47 Uhr)
  Mit Zitat antworten Zitat
Elexarie

Registriert seit: 7. Apr 2011
32 Beiträge
 
#6

AW: Zeichenkette im RichEdit zählen

  Alt 27. Mai 2011, 16:53
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 .
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Zeichenkette im RichEdit zählen

  Alt 27. Mai 2011, 17:39
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:49 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