AGB  ·  Datenschutz  ·  Impressum  







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

Wort gefunden und markiert!

Ein Thema von Chakvour · begonnen am 17. Feb 2010 · letzter Beitrag vom 17. Feb 2013
Antwort Antwort
Chakvour

Registriert seit: 6. Nov 2009
Ort: Kiel
21 Beiträge
 
RAD-Studio 2009 Pro
 
#1

Wort gefunden und markiert!

  Alt 17. Feb 2010, 19:48
Hi,

hab ein kleines Problem warum geht dieses nicht?
Er macht gleich die Form größer wenn ich das Programm starte.

Delphi-Quellcode:
procedure TForm1.Timer4Timer(Sender: TObject);
begin
if SearchForText_AndSelect(RichEdit1, 'Whisper') then
label33.caption := 'You Got A Whisper';
form1.Width := 952;
end;
wenn ich es so schreibe

Delphi-Quellcode:
procedure TForm1.Timer4Timer(Sender: TObject);
begin
SearchForText_AndSelect(RichEdit1, 'Whisper')
end;
funktioniert das. Und das Wort wird auch markiert.
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

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

Re: Wort gefunden und markiert!

  Alt 17. Feb 2010, 19:59
Wo ist nun das Problem?

Ich bin mir nicht sicher, aber ich denke, Du willst das hier erreichen:

Delphi-Quellcode:
procedure TForm1.Timer4Timer(Sender: TObject);
begin
  if SearchForText_AndSelect(RichEdit1, 'Whisper') then
  begin
    label33.caption := 'You Got A Whisper';
    form1.Width := 952;
  end;
end;
  Mit Zitat antworten Zitat
Chakvour

Registriert seit: 6. Nov 2009
Ort: Kiel
21 Beiträge
 
RAD-Studio 2009 Pro
 
#3

Re: Wort gefunden und markiert!

  Alt 17. Feb 2010, 20:09
Ne funktioniert auch nicht.
Naja ich möchte erreichen das durch das Wort Whisper, sich die form vergrößert. Durch den Timer wird das die ganze Zeit alle 15s abgerufen.

Wenn ich das mit einem Button mache anstatt einem Timer funktioniert das.
Aber er soll es halt alle 15sec überprüfen ob es dort aufgetaucht ist, in der Richedit.
  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
 
#4

Re: Wort gefunden und markiert!

  Alt 17. Feb 2010, 21:32
Hast du dir den Code von Manuel genau angesehen? Er hat ein zusätzliches "begin" und "end" eingefügt. Dann werden beide Anweisungen nur dann ausgeführt, wenn die if-Abfrage zutrifft.

Dein bisheriger Code wird so interpretiert:

Delphi-Quellcode:
procedure TForm1.Timer4Timer(Sender: TObject);
begin
  if SearchForText_AndSelect(RichEdit1, 'Whisper') then
  begin
    label33.caption := 'You Got A Whisper';
  end;

  form1.Width := 952; // wird immer ausgeführt, ob "if" zutrifft oder nicht
end;
Grüße, Matze
  Mit Zitat antworten Zitat
Chakvour

Registriert seit: 6. Nov 2009
Ort: Kiel
21 Beiträge
 
RAD-Studio 2009 Pro
 
#5

Re: Wort gefunden und markiert!

  Alt 18. Feb 2010, 09:39
Ich weiss, aber ihr habt mich immernoch falsch verstanden

Die Form beträgt, wenn ich das Programm starte "594" in der länge.
Durch den Timer, wie gesagt soll er überprüfen ob das Wort "Whisper" in der Richedit auftaucht.
Dafür ist die function "SearchForText_AndSelect" zuständig.

Der Timer ist auf 10s eingestellt. Allerdings, wenn das Programm öffne führt er nach 10s trotzdem den kompletten timer.
Und die Form vergrösster sich obwohl das Wort Whisper garnicht in der RIchEdit aufgetaucht ist.

Und mit dem Button funktioniert es auch nicht Er findet zwar das WOrt aber der Rest danach wird nicht ausgeführt
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#6

Re: Wort gefunden und markiert!

  Alt 18. Feb 2010, 09:47
Dann setz doch einmal einen Haltepunkt und verfolge den Ablauf. Wenn es nicht das begin-end ist, kann das ja eigentlich nur heißen, dass Deine Funktion einen falschen Wert zurückgibt.
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
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Wort gefunden und markiert!

  Alt 18. Feb 2010, 10:42
Zitat von Chakvour:
Und die Form vergrösster sich obwohl das Wort Whisper garnicht in der RIchEdit aufgetaucht ist.
Und genau das hast Du ja auch programmiert!
lies Dir doch bitte einmal #2 und 4 genau durch!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von arc
arc

Registriert seit: 6. Nov 2009
Ort: Elbflorenz
62 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Wort gefunden und markiert!

  Alt 17. Feb 2013, 19:17
Lieber spät als nie, ich habe besagte Funktion auch entdeckt und festgestellt, daß das was da passiert sehr seltsam ist.

Typische Version im Netz:

Delphi-Quellcode:
function SearchForText_AndSelect(RichEdit: TRichEdit; SearchText: string): Boolean;
var
  StartPos, Position, Endpos: Integer;
begin
  StartPos := 0;
  with RichEdit do
  begin
    Endpos := Length(RichEdit.Text);
    Lines.BeginUpdate;
    while FindText(SearchText, StartPos, Endpos, [stMatchCase])<>-1 do
    begin
      Endpos := Length(RichEdit.Text) - startpos;
      Position := FindText(SearchText, StartPos, Endpos, [stMatchCase]);
      Inc(StartPos, Length(SearchText));
      SetFocus;
      SelStart := Position;
      SelLength := Length(SearchText);
    end;
    Lines.EndUpdate;
  end;
end;
Da ist einiges daneben.
- FindText wird stets doppelt ausgeführt
- Endpos ist keine absolute Position sondern eine relative Textlänge!
- die Funktion gibts nichts zurück
- Inc(StartPos, Length(SearchText)); ist selten dämlich, da FindText die Position des gefundenen Strings zurückliefert, ab da einfach weitersuchen

Das Resultat: Der Code funktioniert zwar, braucht aber EWIG. Meine Variante:

Delphi-Quellcode:
procedure RE_SearchForText_AndSelect(RichEdit: TRichEdit; SearchText: string);
var StartPos, Position, RemainingLength, WordCount, TextSize, SearchSize: Integer;
begin
  if SearchText = 'then Exit;
  
  with RichEdit do
  begin
    Lines.BeginUpdate;

    // reset colors...
    SelStart:=0;
    SelLength:=Length(RichEdit.Text) - 1;
    SelAttributes.Color:=$000000;

    WordCount:=0;
    StartPos:=0;
    TextSize:=Length(RichEdit.Text);
    SearchSize:=Length(SearchText);
    RemainingLength:=TextSize;
    Position:=FindText(SearchText, StartPos, RemainingLength, []);

    if Position <> -1 then
    repeat
      // selects the word and changes color
      SelStart:=Position;
      SelLength:=SearchSize;
      SelAttributes.Color:=$0000FF;
      inc(WordCount);

      // changes startpos to after the current word
      StartPos:=Position + SearchSize;
      // Remaining Text to search for
      RemainingLength:=TextSize - StartPos;
      // find again...
      Position:=FindText(SearchText, StartPos, RemainingLength, []);
    until Position = -1;

    SelLength:=0; // reset selection...
    Lines.EndUpdate;
  end;
  ShowMessage(SearchText + ' found ' + IntToStr(WordCount) + ' times.');
end;
Diese Prozedur ändert die Farbe aller gefundenen Wörter rot und zählt die Anzahl der Fundstellen mit. Ich habe versucht soweit es geht auf Laufzeit zu optimieren. stMatchCase brauche ich nicht. Die Funktion ist bereits recht speziell, aber läßt sich mit wenigen Handgriffen wieder verallgemeinern.

Aufruf z.B. so
Delphi-Quellcode:
  RE_SearchForText_AndSelect(
    RichEdit1,
    InputBox('Find', 'Find What:', '')
  );
Hauptunterschied ist StartPos:=Position + Length(SearchText); statt Inc(StartPos, Length(SearchText)); der Rest ist Geschmacksache. Ich hoffe es hilft dem einen oder anderen.

Viel Spaß!
Miniaturansicht angehängter Grafiken
bild1.png  

Geändert von arc (17. Feb 2013 um 19:22 Uhr)
  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 19:51 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