![]() |
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:
|
Re: Memo Durchsuchen & Fortschritsanzeige
Zitat:
[Edit]Hab gerade per Google mal gesucht und bin auf ![]() |
Re: Memo Durchsuchen & Fortschritsanzeige
Hm, dann hat mich meine Erinnerung wohl etwas in die Irre geführt. Aber es gibt trotzdem noch Pos, .Text und die .Sel*-Properties, die mit Offets ins .Text als Wert arbeiten (again, falls ich mich nicht irre).
|
Re: Memo Durchsuchen & Fortschritsanzeige
Zitat:
Ob es für einen Eintrag in der CodeLib reicht, weiß ich nicht (dafür bin ich noch nicht lange genug aktiv dabei), aber mir haben damals als Anfänger genau solche Beispiele extrem geholfen. |
Re: Memo Durchsuchen & Fortschritsanzeige
Hm, ich weiss nicht.
Delphi-Quellcode:
Persönlich finde ich das sogar einfacher als die hier gezeigten Wege - plus dem Fakt, dass man damit auch nach strings suchen kann, die Zeilenbrücke enthalten. Nun statt Pos noch PosEx, und schon hat inkrementelle Suche :)
procedure FindAndMark(inMemo: TMemo; word: string; caseSensitive: Boolean := false);
var foundIndex: Integer; begin if not caseSensitive then foundIndex := Pos(AnsiLowerCase(word), AnsiLowerCase(inMemo.Text)) else foundIndex := Pos(word, inMemo.Text); if foundIndex > 0 then begin inMemo.SelStart := foundIndex; inMemo.SelLength := 0; end; end; |
Re: Memo Durchsuchen & Fortschritsanzeige
Ich bezweifel nicht, dass das Beispiel hier nicht gerade extrem gut ist. Dein Beispiel versteh ich z.B. sofort. Doch für Anfänger ist sowas nicht einfach, daher finde ich, dass auch solche "banalen" Sachen vielleicht in die CodeLib hinzugefügt werden sollten. Ich weiß jetzt nicht, welches Nivea in der CodeLib herrscht, aber gerade solche Sachen finde ich persönlich für Anfänger sehr hilfreich.
Natürlich würde ich persönlich jetzt auch sagen, dass der Anfangs-Beitrag jetzt nicht so ganz das gelbe vom Ei ist (dieser von mir jetzt vielleicht auch nicht mehr so ganz, hab schon etwas Alkohol im Blut :drunken:), aber dennoch finde ich es sehr löblich, dass manche sich die Mühe geben, Vorschläge für die CodeLib hier hineinzustellen. Daher versuche ich gerade das beste daraus zu machen. Ich hoffe, dass das ankommt ;-) Als ich noch Anfänger war, hab ich z.B. extrem viel Sachen von den Programmier-Tips vom SwissDelphiCenter angeschaut. Daher glaube ich, dass wenn man den Code etwas umschreibt (deiner ist ein sehr guten Ansatz), dass dann neuer Beitrag für die CodeLib enstehen könnte. Mittlerweile sehe ich den ersten Beitrag eher als Denkanstoß für eine simple Suchfunktion und diesen Denkanstoß kann man doch ausnutzen, oder? |
Re: Memo Durchsuchen & Fortschritsanzeige
Sehe da kein CodeLib Potential.
|
Re: Memo Durchsuchen & Fortschritsanzeige
Zitat:
Das ist ja total chaotisch. Und ich sehe auch nicht die Dringlichkeit, das in die CodeLib zu stellen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:53 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