AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Volltextsuche mit Delphi

Ein Thema von Balosh · begonnen am 21. Apr 2015 · letzter Beitrag vom 22. Mai 2015
Antwort Antwort
Seite 6 von 6   « Erste     456   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#51

AW: Volltextsuche mit Delphi

  Alt 7. Mai 2015, 10:57
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Balosh

Registriert seit: 21. Apr 2015
31 Beiträge
 
Delphi 10 Seattle Professional
 
#52

AW: Volltextsuche mit Delphi

  Alt 21. Mai 2015, 08:59
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:
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;
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#53

AW: Volltextsuche mit Delphi

  Alt 21. Mai 2015, 09:21
Also du hast XE7 und du hast Delphi-Referenz durchsuchenSystem.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:
            slist.LoadFromFile(Path + Rec.Name);
            slist.Text := UTF8Encode(slist.Text);
WÜrde ich ja mal in die Doku Delphi-Referenz durchsuchenTStringList.LoadFromFile schauen und anders schreiben als
Delphi-Quellcode:
// gleich richtig laden
slist-LoadFromFile( Path + Rec.Name, TEncoding.UTF8 );
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Balosh

Registriert seit: 21. Apr 2015
31 Beiträge
 
Delphi 10 Seattle Professional
 
#54

AW: Volltextsuche mit Delphi

  Alt 21. Mai 2015, 09:44
// gleich richtig laden
slist-LoadFromFile( Path + Rec.Name, TEncoding.UTF8 );
Habe ich schon probiert. Wenn ich das so mache bringt er mir die Fehlermeldung: "Keine Zuordnung für Unicode-Zeichen in der Multibyte-Zielcodeseite vorhanden." Mit dem Befehl von mir bringt er mir die Meldung nicht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#55

AW: Volltextsuche mit Delphi

  Alt 21. Mai 2015, 09:57
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (21. Mai 2015 um 10:03 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#56

AW: Volltextsuche mit Delphi

  Alt 21. Mai 2015, 10:10
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.
Miniaturansicht angehängter Grafiken
pspadformat.jpg  
  Mit Zitat antworten Zitat
Balosh

Registriert seit: 21. Apr 2015
31 Beiträge
 
Delphi 10 Seattle Professional
 
#57

AW: Volltextsuche mit Delphi

  Alt 21. Mai 2015, 10:22
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.
Man bin ich doof. Danke für die Erleuchtung.
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#58

AW: Volltextsuche mit Delphi

  Alt 21. Mai 2015, 10:22
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Balosh

Registriert seit: 21. Apr 2015
31 Beiträge
 
Delphi 10 Seattle Professional
 
#59

AW: Volltextsuche mit Delphi

  Alt 21. Mai 2015, 10:30
@ 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.
  Mit Zitat antworten Zitat
Balosh

Registriert seit: 21. Apr 2015
31 Beiträge
 
Delphi 10 Seattle Professional
 
#60

AW: Volltextsuche mit Delphi

  Alt 22. Mai 2015, 11:12
@ Sir Rufo

was mir bei deinem Code aufgefallen ist, du benutzt ein Delphi-Referenz durchsuchenTStringDynArray für die Ergebnisse der Suche. In meiner Variante hatte ich ja dafür eine Delphi-Referenz durchsuchenTStringList und hatte diese dafür genutzt die Umbrüche die in *.dfm Dateien vorkommen mit Delphi-Referenz durchsuchenStringReplace 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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 6   « Erste     456   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:12 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