Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Processmessage (https://www.delphipraxis.net/111195-processmessage.html)

knolli 31. Mär 2008 13:19


Processmessage
 
Hi!
Ich habe mal wieder ein Problem. Ich sitze zur Zeit an einem Program, das mir Wörter und Links von Internetseiten sucht und in eine Datenbank einträgt.

Es funktionieren schon einige Dinge z.B.:
  • Starten der Suche
  • weiterverfolgen der gefundenen Links
  • Sortierung der gefundenen Wörter
  • eintragen in eine Datenbank

Nun würde ich aber gern noch eine Methode implementieren, mit der ich die Suche abbrechen kann.
Ein Kumpel von mir hat schon gesagt, dass man das mit Application.ProcessMessage machen kann.
Ich habe aber leider keine Ahnung wie das funktioniert.

Also nochmal konkret:

Ich verwende für die Suche nur wenige Schleifen(FOR) und wöllte gern wissen, wie ich die Suche unterbrechen kann.
Ich verwende zur Navigation auf die Seiten eine WebBrowser-Komponente.

Nuclear-Ping 31. Mär 2008 13:21

Re: Processmessage
 
Globale / klassenlokale Boolean-Variable anlegen, in deiner/deinen Schleife(n) auf diese Prüfen und wenn sie TRUE ist, Schleife(n) verlassen.

knolli 31. Mär 2008 13:39

Re: Processmessage
 
etwa so?

Delphi-Quellcode:
procedure TWortsuche.SonderZeichen(Sender: TObject);
var iLauf, i:integer;
begin
  For iLauf:=0 to Listbox_Seitenwoerter.Items.Count-1 do
  begin
    FOR i:=32 to 255 do
    Begin
    Application.ProcessMessages;
    IF bAbbruch=true then i:=255;
     CASE i OF
       32..64   : Listbox_Seitenwoerter.Items[iLauf]:=StringReplace(Listbox_Seitenwoerter.Items[iLauf],chr(i),'',[rfReplaceAll]);
       91..96   : Listbox_Seitenwoerter.Items[iLauf]:=StringReplace(Listbox_Seitenwoerter.Items[iLauf],chr(i),'',[rfReplaceAll]);
       123..195 : Listbox_Seitenwoerter.Items[iLauf]:=StringReplace(Listbox_Seitenwoerter.Items[iLauf],chr(i),'',[rfReplaceAll]);
       197..213 : Listbox_Seitenwoerter.Items[iLauf]:=StringReplace(Listbox_Seitenwoerter.Items[iLauf],chr(i),'',[rfReplaceAll]);
       215..219 : Listbox_Seitenwoerter.Items[iLauf]:=StringReplace(Listbox_Seitenwoerter.Items[iLauf],chr(i),'',[rfReplaceAll]);
       221..227 : Listbox_Seitenwoerter.Items[iLauf]:=StringReplace(Listbox_Seitenwoerter.Items[iLauf],chr(i),'',[rfReplaceAll]);
       229..245 : Listbox_Seitenwoerter.Items[iLauf]:=StringReplace(Listbox_Seitenwoerter.Items[iLauf],chr(i),'',[rfReplaceAll]);
       247..251 : Listbox_Seitenwoerter.Items[iLauf]:=StringReplace(Listbox_Seitenwoerter.Items[iLauf],chr(i),'',[rfReplaceAll]);
       253..255 : Listbox_Seitenwoerter.Items[iLauf]:=StringReplace(Listbox_Seitenwoerter.Items[iLauf],chr(i),'',[rfReplaceAll]);
     End;//case
    End;//for i
  end; //For iLauf
end;



procedure TWortsuche.BitBtn2Click(Sender: TObject);
begin
bAbbruch:=true;
end;
wenn ich es so mache, dann kommt eine Fehlermeldung:

Anweisung für FOR-Schleifenvariable 'i'

HHennig 31. Mär 2008 13:46

Re: Processmessage
 
hallo, anstatt
if abbruch = true the i := ...

nimm
if abbruch = true then Break;

Damit verlässt du sofort die for-Schleife

knolli 31. Mär 2008 13:51

Re: Processmessage
 
danke so funktionierts!

DeddyH 31. Mär 2008 13:52

Re: Processmessage
 
Aber bitte nicht auf true abfragen. Statt
Delphi-Quellcode:
 if abbruch = true then Break;
besser so schreiben:
Delphi-Quellcode:
if abbruch then Break;

Fussball-Robby 31. Mär 2008 13:58

Re: Processmessage
 
Außerdem solltest du break in der äußeren Schleife aufrufen, da imho die innere sonst nur kurz angehalten und dann sofort wieder von der äußeren aufgerufen wird.

Mfg

HHennig 31. Mär 2008 14:04

Re: Processmessage
 
...schließe mich meinen Vorrednern an...
:)

knolli 31. Mär 2008 14:09

Re: Processmessage
 
ok! das funktioniert sehr gut! danke für die schnelle hilfe!

shmia 31. Mär 2008 16:08

Re: Processmessage
 
Der Sourcecode oben ist ja sehr langsam.
so geht es deutlich schneller und eleganter:
Delphi-Quellcode:
function StrReplaceChars(const S: string; const Chars: TSysCharSet; Replace: Char): string;  // kopiert aus der JCL
var
  I: Integer;
begin
  Result := S;
  for I := 1 to Length(S) do
    if Result[I] in Chars then
      Result[I] := Replace;
end;

procedure TWortsuche.SonderZeichen(Sender: TObject);
var iLauf:integer;
begin
  For iLauf:=0 to Listbox_Seitenwoerter.Items.Count-1 do
  begin
    Application.ProcessMessages;
    IF bAbbruch then break;
    Listbox_Seitenwoerter.Items[iLauf] := StrReplaceChars(Listbox_Seitenwoerter.Items[iLauf], [#32..#64, #91..#96   {bitte selbst ergänzen}], ' ');
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 Uhr.
Seite 1 von 2  1 2      

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