AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Beim Suchen gefundene Elemente aus Memo löschen
Thema durchsuchen
Ansicht
Themen-Optionen

Beim Suchen gefundene Elemente aus Memo löschen

Ein Thema von Stamper · begonnen am 19. Jan 2008 · letzter Beitrag vom 22. Jan 2008
Antwort Antwort
Seite 1 von 3  1 23      
Stamper

Registriert seit: 19. Jan 2008
18 Beiträge
 
#1

Beim Suchen gefundene Elemente aus Memo löschen

  Alt 19. Jan 2008, 13:04
Hallo,

ich habe mir ein Programm geschrieben, mit dem ich eine Liste von Dateinamen in ein Memo kopieren kann. Diese Dateien werden dann im gewünschten Verzeichnis gesucht und auf Wunsch in ein anderes Verzeichnis kopiert. Ich möchte noch eine Funktion einbauen, die ich nicht hinbekomme. Vll kann mir jmd helfen. Und zwar hätte ich gerne, dass das Programm alle Dateinamen aus dem Memo löscht, wenn diese Datei gefunden wird. Ich habe folgende Zeile geschrieben, bei der beim Kompilieren ein Fehler ausgegeben wird:

[/delphi]if SR = 0 then form1.Memo1.Lines.Delete(gconst);[delphi]

var SR: TSearchRec;
gconst ist eine globale Variable, in die ich den Wert der Schleife reinkopiere, mit dem ich das Memo zeilenweise auslese.

mzwvar2 ist der String, mit dem ich das Element der Memo an die Suchprozedur übergeben. Vll muss ich ja auch das einsetzen.

Fehlermeldung: "Inkompatible Typen"

Danke im Vorraus.
Eric
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Beim Suchen gefundene Elemente aus Memo löschen

  Alt 19. Jan 2008, 13:43
Hallo und Willkommen in der DP

Versuch es doch mal so:
Delphi-Quellcode:
procedure DeleteExistingFilesFromList(sPath: string; const FileList: TStrings);
var i: Integer;
begin
  FileList.BeginUpdate;
  sPath := IncludeTrailingPathDelimiter(sPath);
  for i := FileList.Count - 1 downto 0 do
    if FileExists(sPath + FileList[i]) then
      FileList.Delete(i);
  FileList.EndUpdate;
end;
Beispielaufruf:
Delphi-Quellcode:
procedure TForm1.btnClearClick(Sender: TObject);
begin
  DeleteExistingFilesFromList('C:',mmoFiles.Lines);
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Beim Suchen gefundene Elemente aus Memo löschen

  Alt 19. Jan 2008, 14:01
Hallo Eric,

es ist etwas unglücklich, dass du Hilfe bei einem Datentypfehler suchst, aber die Deklarationen der fraglichen Variablen nicht zeigst. Dein erster Fehler ist wahrscheinlich der Vergleich einer Struktur (SR) mit einer Zahl (0), aber da sind wohl noch mehrere. Mein Code-Vorschlag zu dem geschilderten Anwendungsfall würde so aussehen:

Delphi-Quellcode:
uses
  FmUtils;

procedure CopyFiles(files: TStrings; srcDir, tgtDir: TFileName);
var
  i: Integer;
  fn: TFileName;
begin
  srcDir := IncludeTrailingPathDelimiter(srcDir);
  tgtDir := IncludeTrailingPathDelimiter(tgtDir);
  files.BeginUpdate;
  for i := Pred(files.Count) downto 0 do
  begin
    fn := srcDir + files[i];
    if FileExists(fn) then
      if CopyFile(fn, tgtDir + files[i]) >= 0 then
        files.Delete(i);
  end;
  files.EndUpdate;
end;
Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Beim Suchen gefundene Elemente aus Memo löschen

  Alt 19. Jan 2008, 14:13
Stimmt, ich habe das Kopieren übersehen
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Stamper

Registriert seit: 19. Jan 2008
18 Beiträge
 
#5

Re: Beim Suchen gefundene Elemente aus Memo löschen

  Alt 19. Jan 2008, 15:28
Hm, der Kompiler mag kein "FmUtils".

was soll ich denn als Aufruf in die OnKlick-Prozedur schreiben?

Ich kopier mal die relevanten Quellcode für das bessere Verständnis.

Delphi-Quellcode:
var gcount, gconst: integer;

uses StrUtils;
Meine aus dem Inet geklaute Suche. Also eig brauche ich keine rekursive Suche. Aber da ich nicht so der Crack in Programmierung bin, hab ich was genommen, was ich ohne größere Mühe einbinden konnte. Denn die ganz einfach Suchfunktion, die Delphi bietet, hat keine Unterverzeichnisse durchsucht bzw. ich wusst nicht, wie ich das anstellen sollte.
Delphi-Quellcode:
procedure GetFilesInDirectory(Directory: String; mzwvar2: String;
                              List: TStrings;
                              WithSubDirs, ClearList: Boolean);

procedure ScanDir(const Directory: String);
var
  SR: TSearchRec;
begin
  screen.Cursor := crHourglass;
  if FindFirst(Directory + mzwvar2, faAnyFile and not faDirectory, SR) = 0 then try
    repeat
      List.Add(Directory + SR.Name);
      gcount := gcount + 1;
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;

  if WithSubDirs then begin
    if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try
      repeat
        if ((SR.attr and faDirectory) = faDirectory) and
           (SR.Name <> '.') and (SR.Name <> '..') then
          ScanDir(Directory + SR.Name + '\');
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  end;
  Screen.Cursor := crDefault;
end;

begin
  List.BeginUpdate;
  try
    if Directory = 'then Exit;
    if Directory[Length(Directory)] <> '\then
      Directory := Directory + '\';
    ScanDir(Directory);
  finally
    List.EndUpdate;
  end;
end;
Meine OnKlick-Prozdur:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var mzwvar : string;
    lcount, highcount : byte;
begin
  gcount := 0;
  Progressbar1.Max:= Memo1.Lines.Count;
  highcount := memo1.Lines.Count;
  For lcount := 0 to highcount-1 do
  begin
    gconst := lcount;
    mzwvar := memo1.Lines[lcount];
    GetFilesInDirectory(shelltreeview1.SelectedFolder.PathName, mzwvar, Listbox1.Items, True, True);
    Progressbar1.Position:= lcount + 1;
    label1.Caption := format('Es wurde(n) %d Datei(en) gefunden.',[gcount]);
  end;
  CopyFiles('C:',memo1.Lines);
end;
Also folgender Code ist bestimmt falsch ... aber ich habe ihn vorläufig in der OnKlick-Prozedur stehen lassen:
CopyFiles('C:',memo1.Lines); Noch eine Frage @DeddyH: Wofür steht das 'C:' in deiner Aufrufprozedur?

So, schon mal vielen Dank. Ich weiß, es ist immer schlimm, sich mit Anfänger rumzuschlagen. ^^

Schöne Grüße
Eric
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Beim Suchen gefundene Elemente aus Memo löschen

  Alt 19. Jan 2008, 15:37
Hallo Eric, könntest Du noch einmal erklären, wie das genau ablaufen soll? Du sagst, Du brauchst keine Rekursion, setzt diese aber beim Aufruf der Suchprozedur auf true. Sollen nun alle Dateien aus allen Unterverzeichnissen gelistet werden, oder nur die aus dem angegebenen Verzeichnis (ohne Unterverzeichnisse)?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Stamper

Registriert seit: 19. Jan 2008
18 Beiträge
 
#7

Re: Beim Suchen gefundene Elemente aus Memo löschen

  Alt 19. Jan 2008, 15:47
Wie gesagt, ich habe das procedure für die Suche aus dem Inet genommen. Ich versteh auch nur teilweise, was sich darin abspielt. Ich hab mal Programmierung in der Schule gelernt. Aber damit kann ich mom wenig anfangen, weil das nicht mal richtiges Basiswissen ist.

Ich erzähl dir kurz, wofür ich das Programm brauche: Ich habe eine Sammlung von MP3s und ich habe eine Liste mit Dateinamen, die ich in dieser Ansammlung finde. Im Programm kopiere ich die Liste in das Memo und lasse die Dateien dann suche - auch in den Unterverzeichnissen. Danach kopiere ich die gefundenen Dateien an einen bestimmten Ort. Soweit funktioniert das Programm. Da die Liste Dateinamen enthält, die nicht in der Sammlung vorhanden sind, hätte ich gerne, dass das Programm die gefundenen Dateinamen löscht, so dass ich hinterher sehe, welche Dateien ich mir anders besorgen muss.
  Mit Zitat antworten Zitat
Stamper

Registriert seit: 19. Jan 2008
18 Beiträge
 
#8

Re: Beim Suchen gefundene Elemente aus Memo löschen

  Alt 19. Jan 2008, 15:50
Hab noch was vergessen: Sobald die Routine die erste Datei gefunden hat, kann die Suche nach dieser Datei abgebrochen werden und die Suche nach der nächsten Datei begonnen werden.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Beim Suchen gefundene Elemente aus Memo löschen

  Alt 19. Jan 2008, 15:52
Stehen in der Liste nur die Dateinamen oder sind die komplett mit Pfad?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Stamper

Registriert seit: 19. Jan 2008
18 Beiträge
 
#10

Re: Beim Suchen gefundene Elemente aus Memo löschen

  Alt 19. Jan 2008, 16:29
Nur Dateinamen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 05:29 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