![]() |
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);
|
Re: Memo Durchsuchen & Fortschritsanzeige
Hast Du das getestet? Eigentlich müsste zumindest ein Indexfehler kommen.
|
Re: Memo Durchsuchen & Fortschritsanzeige
Delphi-Quellcode:
Etwas Sauberer und! vllt. will das jmd. in einem RichEdit verwenden...
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; nimm TStrings, ich habs schon eingefügt! mfg |
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: |
Re: Memo Durchsuchen & Fortschritsanzeige
Was ist denn Strings für eine Klasse? Und IMHO müsste es
Delphi-Quellcode:
heißen.
for i := 0 to ripping.count -1
|
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:
Aufruf:
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;
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; |
Re: Memo Durchsuchen & Fortschritsanzeige
Zitat:
- schlechte Code-Formatierung - unpassende Variablennamen - fast keine Gross/Kleinschreibung - und als Krönung sind auch noch Rechtschreibfehler in den Kommentaren :freak: :pale: :oops: |
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?
|
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. |
Re: Memo Durchsuchen & Fortschritsanzeige
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 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 by Thomas Breitkreuz