Delphi-PRAXiS

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.

littleDave 4. Jul 2008 00:18

Re: Memo Durchsuchen & Fortschritsanzeige
 
Zitat:

Zitat von Dax
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.

Also die Memo-Komponente an sich hat diese Funktion jetzt nicht direkt (hab gerade nachgeschaut; Delphi 7). Was ich aber jetzt nicht weiß ist, ob es eine SendMessage-Funktion dafür gibt.

[Edit]Hab gerade per Google mal gesucht und bin auf diesen Artikel gestoßen. Dort wird auch keine direkte Funktion von TMemo aufgerufen, sondern es wird "StrPos" zur Suche verwendet.[/Edit]

Dax 4. Jul 2008 00:19

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).

littleDave 4. Jul 2008 00:29

Re: Memo Durchsuchen & Fortschritsanzeige
 
Zitat:

Zitat von Dax
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).

Da hast du schon recht. Doch für einen Anfänger ist es sicherlich nicht einfach, diese Funktionen zu benutzen. Ich denke, wenn man die Funktion etwas umschreibt und leserlich macht (hab ich ja schon ein wenig versucht), ist es ein gutes Beispiel zur Anwendung dieser Funktion.
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.

Dax 4. Jul 2008 00:54

Re: Memo Durchsuchen & Fortschritsanzeige
 
Hm, ich weiss nicht.
Delphi-Quellcode:
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;
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 :)

littleDave 4. Jul 2008 01:23

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?

spaxxn 4. Jul 2008 07:14

Re: Memo Durchsuchen & Fortschritsanzeige
 
Sehe da kein CodeLib Potential.

RavenIV 7. Jul 2008 09:32

Re: Memo Durchsuchen & Fortschritsanzeige
 
Zitat:

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

Nein, ich meinte den ersten Beitrag von Noobix93.
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 03:28 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