AW: Volltextsuche mit Delphi
Wenn Du hier
Delphi-Quellcode:
die gefundenen Dateien in eine Listbox einträgst, dann kannst Du ebensogut hier Deine Suche starten
if MatchesMask( Rec.Name, FileName) then
Listbox1.Items.Add(Path + Rec.Name);
Delphi-Quellcode:
eine weitere Möglichkeit wäre es om OnClick-Event der Listbox (hoffentlich gibt's das) die Textsuche einzubinden.if MatchesMask( Rec.Name, FileName) then begin Listbox1.Items.Add(Path + Rec.Name); PositionofText:=FindTextinFile(Filename,Texttofind); end; Gruß K-H |
AW: Volltextsuche mit Delphi
Zitat:
|
AW: Volltextsuche mit Delphi
Welches Problem denn? Seit Delphi 4(?) werden DFM standardmäßig im Textformat gespeichert. Solltest Du doch auf eine binäre stoßen, wirst Du es daran merken, dass Du nur "Zeichensalat" ausliest. In dem Fall kannst Du dann die genannte Methode anwenden und solltest anschließend wieder lesbaren Text vor Dir haben.
|
AW: Volltextsuche mit Delphi
Ich meine das Problem mit den Umbrüchen im Bezeichner einer langen Textzeile. Kann natürlich sein das ich da nicht ganz auf dem aktuellen Stand bin und das mittlerweile nicht mehr so ist.
|
AW: Volltextsuche mit Delphi
Auch Umlaute usw. werden codiert. Du müsstest die DFM Datei parsen und Dir ein "Art" DOM aufbauen, um das gewohle zu erhalten.
|
AW: Volltextsuche mit Delphi
Zitat:
|
AW: Volltextsuche mit Delphi
|
AW: Volltextsuche mit Delphi
Ich dreh noch am Rad. :evil:
Seit über einer Woche versuche ich die Sonderzeichen (ä,ö,ü,ß usw.) mit in die Suche einzubeziehen und bekomme es einfach nicht hin. Habe verschiedene Tipps aus dem Internet probiert aber nichts hat wirklich funktioniert. Wie bekomme ich das in dieser Source gebacken:
Code:
Ich weiß echt nicht mehr weiter.
procedure TMainSuche.FileSearch(const PathName, FileName: string);
var Rec : TSearchRec; Path: string; slist: TStringList; begin Path := IncludeTrailingBackSlash(PathName); slist := TStringList.Create; try if FindFirst (Path + '*', faAnyFile, Rec) = 0 then begin repeat if (Rec.attr in [faDirectory, (faDirectory+faArchive)]) then begin if Checkbox1.Checked then begin if (Rec.Name <> '.') and (Rec.Name <> '..') then FileSearch( Path+Rec.Name , FileName); end; end else if MatchesMask( Rec.Name, FileName) then begin slist.LoadFromFile(Path + Rec.Name); if pos(cbSucheT.Text, slist.Text)>0 then Listbox1.Items.Add(Path + Rec.Name); end; until FindNext(Rec) <> 0; end; finally FindClose (Rec); slist.free; end; end; |
AW: Volltextsuche mit Delphi
Wie meinst Du das? Pos müsste auch Umlaute finden oder meinst Du Alternativen ( ae für ä usw.)?
|
AW: Volltextsuche mit Delphi
Wenn ich zum Beispiel in einer Textdatei nach einem Wort mit 'ä' Suche bringt er mir die Meldung:
"Keine Zuordnung für Unicode-Zeichen in der Multibyte-Zielcodeseite vorhanden." Da ich ja die "Volltextsuche" sowieso auf Unicode Basis machen wollte und alles bisher auch funktioniert nur das hier nicht, würde ich das wenn es geht auch noch irgendwie hinbekommen. |
AW: Volltextsuche mit Delphi
Wer bringt diese Meldung? (wo)
Bei den Codes auf dieser Seite 5 kann ich nichts erkennen, wo ich soeine Fehlermeldung vermuten würde. [edit] auf der vorherrigen Seite 5 :stupid: |
AW: Volltextsuche mit Delphi
Sry für die späte Meldung. Habe mittlerweile das Programm zu 95% lauffähig gemacht so wie ich es mir vorgestellt habe (Danke hierfür für die ganze Hilfe). Nur ein einziges Problem bleibt noch übrig:
Das am Anfang dieses Threads angesprochene Problem mit den .dfm Dateien. Habe den Code zwar mittlerweile so das er die Umbrüche und die Zeichen (z.B. " '+ " oder " +") vor der Suche rausnimmt, nur mein Problem ist das es bei mir vorkommen kann das zum Beispiel bei " Caption= ...." ein Wort mit Umlaut stehen kann und das wird ja in delphi zum Beispiel in #228 umgewandelt und damit hat das Programm irgendwie Probleme es umzusetzen. Mit .txt und .pas Dateien funktioniert alles ohne Probleme (z.B suche mit Umlauten, Umbrüchen usw.) Hier mal der Code für die Suche in den Dateien:
Code:
Habt ihr vielleicht eine Lösung wie ich das Problem noch lösen kann? Und bitte seit gnädig mit mir was die bisherigen Befehle betrifft.:oops:
procedure TMainSuche.FileSearch(const PathName, FileName: string);
var Rec : TSearchRec; Path: string; slist: TStringList; begin Path := IncludeTrailingBackSlash(PathName); slist := TStringList.Create; try if FindFirst (Path + '*', faAnyFile, Rec) = 0 then begin repeat if (Rec.attr in [faDirectory, (faDirectory+faArchive)]) then begin if Checkbox1.Checked then begin if (Rec.Name <> '.') and (Rec.Name <> '..') then FileSearch( Path+Rec.Name , FileName); end; end else if MatchesMask( Rec.Name, FileName) then begin slist.LoadFromFile(Path + Rec.Name); slist.Text := UTF8Encode(slist.Text); slist.Text := StringReplace(slist.Text,'''+', '',[rfReplaceAll]); slist.Text := StringReplace(slist.Text,'''', '',[rfReplaceAll]); slist.Text := StringReplace(slist.Text,#13#10, '',[rfReplaceAll]); if pos(cbSucheT.Text, slist.Text)>0 then Listbox1.Items.Add(Path + Rec.Name); end; until FindNext(Rec) <> 0; end; finally FindClose (Rec); slist.free; end; end; |
AW: Volltextsuche mit Delphi
Also du hast XE7 und du hast System.IOUtils und baust dir tatsächlich die Datei-Suche noch selber und darüberhinaus willst du alles in einer Methode abarbeiten?
Trenn den Mist doch mal voneinander, dann ist das Testen auch erheblich einfacher. Dann wäre da noch
Delphi-Quellcode:
WÜrde ich ja mal in die Doku TStringList.LoadFromFile schauen und anders schreiben als
slist.LoadFromFile(Path + Rec.Name);
slist.Text := UTF8Encode(slist.Text);
Delphi-Quellcode:
// gleich richtig laden
slist-LoadFromFile( Path + Rec.Name, TEncoding.UTF8 ); |
AW: Volltextsuche mit Delphi
Zitat:
|
AW: Volltextsuche mit Delphi
Dann ist das wohl kein UTF-8 und somit ist es falsch diese Umwandlung vorzunehmen.
Und UTF8Encode UTF8Decode gibt einfach einen Leerstring zurück, wenn es kein valides UTF-8 ist, während TEncodiung korrekt einen Fehler wirft. Außerdem ist slist.Text ein UnicodeString und UTF8Encode an der Stelle sowas von sinnlos. slist.Text ist Unicode (slist.LoadFromFile hat UTF-8 bereits übersetzt, wenn das BOM vorhanden war), UTF8Encode wandelt es nach UTF-8 um, Delphi erkennt bei der Zuweisung, daß slist.Text ein UnicodeString ist und wandelt das UTF-8 vom UTF8Encode wieder nach Unicode um ... es ändert sich also nichts. |
AW: Volltextsuche mit Delphi
Liste der Anhänge anzeigen (Anzahl: 1)
Manchmal kann es durchaus vorkommen, daß man nicht weiß, welche Codierung eine Textdatei enthält, insbesondere dann, wenn die Datei kein Byte Order Mark (BOM) enthält. In solchen Fällen öffne ich die jeweilige Text-Datei mit PsPad – einem unicode-fähigen Freeware-Editor – und kann dann unter dem Menüpunkt Format leicht feststellen, wie die Datei codiert wurde.
|
AW: Volltextsuche mit Delphi
Zitat:
Bei mir bekommt der Spruch: "Doppelt gemobbelt hält besser" eine ganz neue Bedeutung. Kein Wunder das es mit den .dfm Dateien nicht funktioniert. So langsam glaube ich das die Suche in .dfm Dateien soviel Sinn macht wie einer Kuh das Fahrrad fahren bei zu bringen. |
AW: Volltextsuche mit Delphi
Ich würde mir diese Dateien dann mal explizit anschauen, warum die eben nicht UTF8 kodiert sind und evtl. ein Fallback implementieren (Exception-Behandlung).
Hier mal ein Beispiel, wie man das mit der Suche nach den Dateien mit XE7 Hausmitteln lösen kann und nicht alles in eine dicke Wurst packt:
Delphi-Quellcode:
unit Form.Main;
interface uses System.IOUtils, System.Types, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class( TForm ) ListBox1: TListBox; Button1: TButton; PathEdit: TEdit; SearchTextEdit: TEdit; procedure Button1Click( Sender: TObject ); private procedure FindMyFiles; /// <summary> /// Lädt den Inhalt aus der DFM Datei in einen String /// </summary> function GetDfmContentFromFile( const AFilename: string ): string; /// <summary> /// Überarbeitet den DfmContent für die einfachere Suche nach dem Text /// </summary> function PrepareDfmContentForSearch( const ADfmContent: string ): string; /// <summary> /// Durchsucht den DfmContent nach dem Suchtext /// </summary> function DfmContentContainsText( const ADfmContent, ASearchText: string ): Boolean; /// <summary> /// Erzeugt den Such-Filter /// </summary> function BuildDirectoryFilterPredicate( ASearchText: string ): TDirectory.TFilterPredicate; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.Button1Click( Sender: TObject ); begin FindMyFiles; end; procedure TForm1.FindMyFiles; var LFiles: TStringDynArray; LStrs: TStringList; LValue: string; begin ListBox1.Clear; LFiles := TDirectory.GetFiles( {Path} PathEdit.Text, {SearchPattern} '*.dfm', {SearchOption} TSearchOption.soAllDirectories, {Predicate} BuildDirectoryFilterPredicate( SearchTextEdit.Text ) ); ListBox1.Items.BeginUpdate; try for LValue in LFiles do begin ListBox1.Items.Add( LValue ); end; finally ListBox1.Items.EndUpdate; end; end; function TForm1.BuildDirectoryFilterPredicate( ASearchText: string ): TDirectory.TFilterPredicate; begin Result := function( const Path: string; const SearchRec: TSearchRec ): Boolean begin Result := DfmContentContainsText( PrepareDfmContentForSearch( GetDfmContentFromFile( TPath.Combine( Path, SearchRec.Name ) ) ), ASearchText ); end; end; function TForm1.GetDfmContentFromFile( const AFilename: string ): string; begin Result := TFile.ReadAllText( AFilename ); end; function TForm1.PrepareDfmContentForSearch( const ADfmContent: string ): string; begin Result := ADfmContent; end; function TForm1.DfmContentContainsText( const ADfmContent, ASearchText: string ): Boolean; begin Result := ADfmContent.Contains( ASearchText ); end; end. |
AW: Volltextsuche mit Delphi
@ Sir Rufo
wenn ich mir dein Code so anschaue, fühl ich mich gerade naja besch***. Ich habe es mir komplizierter gemacht als es sein muss. Danke für das Beispiel. |
AW: Volltextsuche mit Delphi
@ Sir Rufo
was mir bei deinem Code aufgefallen ist, du benutzt ein TStringDynArray für die Ergebnisse der Suche. In meiner Variante hatte ich ja dafür eine TStringList und hatte diese dafür genutzt die Umbrüche die in *.dfm Dateien vorkommen mit StringReplace zu entfernen. Meine Frage ist nun, da ich mich mit Arrays überhaupt nicht auskenne, gibt es dafür so etwas ähnliches damit ich die Umbrüche entfernt bekomme bei der Suche? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:05 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