Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Memo Durchsuchen & Fortschritsanzeige (https://www.delphipraxis.net/115824-memo-durchsuchen-fortschritsanzeige.html)

Noobix93 18. Jun 2008 15:17


Memo Durchsuchen & Fortschritsanzeige
 
Mit dieser Procedur möchte ich ich Leuten helfen die eine kleine Suchfunktion in ihr Programm einbauen möchten.

Uses: ...,Math
Delphi-Quellcode:
function RoundToPointPosition(Number : Extended; PointPos : Byte): Extended;
Var
  Multi:Integer;
begin
  Multi:=Trunc(IntPower(2,PointPos));
  Result := Round(Number * Multi)/Multi;
end;
Delphi-Quellcode:
procedure searchfunc(const Anzeige:Tmemo; Ripping:Tmemo; Input:Tedit; Progressbar:Tprogressbar; Percent:Tlabel; Found:Tlabel );
var i,poss:integer;
percents:extended;
searchline,strclear:string;
begin
Anzeige.lines.Clear;                                     // Die Anzeige säubern
for i := 1 to ripping.Lines.count do
 begin
  searchline:=Ripping.lines[i];                          // Die Zeilen zuweisen indenen gesucht werden soll
  poss := Pos(''+input.text+'', searchline);             // Überprüfen ob richtiger Wer gefunden wurde
  Application.ProcessMessages;                           // Prozess-Messages damit das Programm reagiert
  percents:=i*100/Ripping.lines.count;                   // Prozentsatz mit 3-Satz ausrechnen
  percents:=RoundToPointPosition(percents,0);            // Runden der % Zahl auf ganze Zahlen
  strclear:=floattostr(percents);                        // Umwandlung der FLot-Zahl in einen String
  ProgressBar.Position:=strtoint(strclear);              // Umwandlung in einen Integer Wert für die Progressbar
  Percent.caption:=''+floattostr(percents)+'%';          // Vortschrits% Label
  Found.caption:=''+inttostr(Anzeige.lines.count)+' results for '+input.text+'';// Anzeige der gefundenen Resultate für "input"
  if Poss <> 0 then
    Anzeige.lines.add(searchline);                       // Wenn gefunden wird nun die Zeile hinzugefügt wo der Wert gefunden wurde
 end;
 if Anzeige.lines.count=0 then
  Anzeige.lines.add('No results found for '+input.text+'');
end;

Aufruf:
Delphi-Quellcode:
searchfunc(Anzeige,Ripping,edit35,progressbar4,label309,label310);

DeddyH 18. Jun 2008 15:21

Re: Memo Durchsuchen & Fortschritsanzeige
 
Hast Du das getestet? Eigentlich müsste zumindest ein Indexfehler kommen.

MSSSSM 18. Jun 2008 15:23

Re: Memo Durchsuchen & Fortschritsanzeige
 
Delphi-Quellcode:
procedure searchfunc(const Anzeige:TStrings; Ripping:Strings; Input:string; Progressbar:Tprogressbar; Percent:Tlabel; Found:Tlabel );
var i,poss:integer;
percents:extended;
searchline,strclear:string;
begin
  Anzeige.Clear;                                     // Die Anzeige säubern
  for i := 1 to ripping.count{-1} do
  begin
    searchline:=Ripping[i];                          // Die Zeilen zuweisen indenen gesucht werden soll
    poss := Pos(''+input.text+'', searchline);             // Überprüfen ob richtiger Wer gefunden wurde
    Application.ProcessMessages;                           // Prozess-Messages damit das Programm reagiert
    percents:=i*100/Ripping.count;                   // Prozentsatz mit 3-Satz ausrechnen
    percents:=RoundToPointPosition(percents,0);            // Runden der % Zahl auf ganze Zahlen
    strclear:=floattostr(percents);                        // Umwandlung der FLot-Zahl in einen String
    ProgressBar.Position:=strtoint(strclear);              // Umwandlung in einen Integer Wert für die Progressbar
    Percent.caption:=''+floattostr(percents)+'%';          // Vortschrits% Label
    Found.caption:=''+inttostr(Anzeige.count)+' results for '+input.text+'';// Anzeige der gefundenen Resultate für "input"
    if Poss <> 0 then
      Anzeige.add(searchline);                       // Wenn gefunden wird nun die Zeile hinzugefügt wo der Wert gefunden wurde
  end;
  if Anzeige.lines.count=0 then
    Anzeige.add('No results found for '+input.text+'');
end;
Etwas Sauberer und! vllt. will das jmd. in einem RichEdit verwenden...
nimm TStrings, ich habs schon eingefügt!
mfg

Noobix93 18. Jun 2008 15:25

Re: Memo Durchsuchen & Fortschritsanzeige
 
Ist getestet, keine Probleme.
Mein Programm benutzt es um Dateien zu durchsuchen bisher hat sich noch keiner der über 300 Benutzern über irgendetwas beschwert.

Danke dir :wink:

DeddyH 18. Jun 2008 15:26

Re: Memo Durchsuchen & Fortschritsanzeige
 
Was ist denn Strings für eine Klasse? Und IMHO müsste es
Delphi-Quellcode:
for i := 0 to ripping.count -1
heißen.

littleDave 18. Jun 2008 16:05

Re: Memo Durchsuchen & Fortschritsanzeige
 
Ich hab das ganze mal etwas umgeschrieben um es allgemeiner anwenden zu können (ungetestet da Delphi nicht offen)

Delphi-Quellcode:
type
  TProgressEvent = procedure(aWorkPos, aWorkMax, aResultsFound: integer) of object;

procedure SearchFunc(const aTarget, aRipping: TStrings; SearchStr: string;
                     CaseSensitive: boolean; aCallBackEvent: TProgressEvent);
var i                    : integer;
    iTexPos              : integer;

    iWorkPos, iWorkMax   : integer;
    iResultsFound        : integer;
    sCurrentLine         : string;
begin
  // Ergebnis leeren und Variablen initialisieren
  aTarget.Clear;
  iWorkMax      := aRipping.Count;
  iResultsFound := 0;
 
  for i := 0 to aRipping.Count-1 do
  begin
    sCurrentLine := aRipping[i];
    if CaseSensitive then
       iTexPos := Pos(SearchStr, sCurrentLine)
    else
       iTexPos := Pos(AnsiLowerCase(SearchStr), AnsiLowerCase(sCurrentLine));
   
    // falls der Such-String gefunden wurde
    if iTexPos > 0 then
    begin
      // Ergebniss in Liste hinzufügen und Zähler erhöhen
      aTarget.Add(sCurrentLine);
      inc(iResultsFound);
    end;

    // Aktuelle Position (+1 da Zeile schon durchsucht)
    iWorkPos := i + 1;

    // Call-Back-Event auslösen
    if Assigned(aCallBackEvent) then
       aCallBackEvent(iWorkPos, iWorkMax, iResultsFound);
  end;
end;
Aufruf:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    procedure SearchCallBack(aWorkPos, aWorkMax, aResultsFound: integer);
   
  end;

implementation

{ .... }
 
procedure TForm1.SearchCallBack(aWorkPos, aWorkMax, aResultsFound: integer);
begin
  lbPercentDone.Caption := FloatToStrF(aWorkPos / aWorkMax * 100, ffNumber, 8, 0)+'%';
  lbResultsFound.Caption := IntToStr(aResultsFound);
  Application.ProcessMessages;
end;

procedure TForm1.StartSearch;
begin
  SearchFunc(ErgebnissMemo.Lines, SuchMemo.Lines, SuchEdit.Text,
             CaseSensitiveCheckBox.Checked, SearchCallBack);
end;

RavenIV 18. Jun 2008 16:15

Re: Memo Durchsuchen & Fortschritsanzeige
 
Zitat:

Zitat von Noobix93
Mit dieser Procedur möchte ich ich Leuten helfen die eine kleine Suchfunktion in ihr Programm einbauen möchten.

Also ehrlich gesagt, ich würde mich schämen, einen solch grauenhaften Code hier einzustellen. :(

- schlechte Code-Formatierung
- unpassende Variablennamen
- fast keine Gross/Kleinschreibung
- und als Krönung sind auch noch Rechtschreibfehler in den Kommentaren

:freak: :pale: :oops:

Dax 3. Jul 2008 23:41

Re: Memo Durchsuchen & Fortschritsanzeige
 
Die Idee ist nett, aber braucht man das? Eine Suche mit Fortschrittsanzeige macht erst bei solchen Datenmengen Sinn, die mit normalen Controls nichts mehr vernünftig darstellbar ist. Solche Controls, die das aber können, werden aber vermutlich eine entsprechende Funktion eingebaut haben?

littleDave 3. Jul 2008 23:58

Re: Memo Durchsuchen & Fortschritsanzeige
 
Jetzt wo ich gerade die Antwort von RavenIV sehe: meinst du meinen Beitrag :shock: (hoffentlich nicht ;-)) [ist nicht vorwerfend gemeint sondern nur nachfragend]

@Dax:
Ich glaube auch, dass diese Fortschrittsanzeige nicht so sehr brauchbar ist. Aber vielleicht hilft es dem ein oder anderen, Fortschrittsanzeigen genauer zu verstehen - jetzt nicht vielleicht mit dem Quelltext aus dem ersten Beitrag, aber so grob ist das keine all zu schlechte Idee.
Oder man blendet die "Fortschrittsanzeige" aus und sieht es als eine einfache und schnelle Möglichkeit, Text in einem Memo zu suchen. Die Kombination an sich ist nicht so gut, da beide Teile im ersten Post nicht sehr ausgereift wirken, doch die einzelnen Teile, Suche und Fortschrittsanzeige, sind vielleicht doch zu gebrauchen.

Dax 4. Jul 2008 00:11

Re: Memo Durchsuchen & Fortschritsanzeige
 
Zitat:

Zitat von littleDave
Oder man blendet die "Fortschrittsanzeige" aus und sieht es als eine einfache und schnelle Möglichkeit, Text in einem Memo zu suchen.

Wenn ich mich recht erinnere, hat das Memo bereits entsprechende Funktionen - leider hab' ich aber grad kein Delphi da, um das zu überprüfen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr.
Seite 1 von 2  1 2      

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