Autor Beitrag
m-werk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Fr 19.07.02 20:41 
Hi Leute,

Ich hab ein kleines Formular erstellt, mit den Buttons: Suchen, Aktualisieren und Beenden.

Weiters habe ich noch ein Label mit den Namen "Pfad" drinn.

Wie kann ich es machen damit, wenn ich auf Suchen gehe, im Label dann der genaue Pfad drinn steht, wo die Datei liegt. Ich möchte aber nicht die Datei eingeben, nach der gesucht wird, denn diese Datei hat einen Fixen Namen "Kundendaten.mdb". Es soll einfach nach dieser Datei im "ARBEITSPLATZ" gesucht werden. Es ist doch so, dass dann die ganzen Festplatten automatisch durchsucht werden.

Das Ergebnis soll dann im Label ersichtlich sein. Sollte die Datei nicht gefunden werden, so soll eine Messagebox erscheinen wo dann drinn steht: "Leider konnte die Datenbank auf Ihrem PC nicht gefunden werden".

Beim Button "Aktualisieren" soll dann der Path der in der Label steht dann in die Registry unter HKEY_CURRENT_USER\Software\AriusDB\SettingsDB gespeichert werden.

Kann mir da jemand helfen?

_________________
Grüße, m-werk
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Fr 19.07.02 20:55 
Was ist denn jetzt das Problem? Weißt Du nicht wie man das Dateisystem nach einer Datei durchsucht? Oder vielleicht wie man in der Registry schreibt oder wie man MessageBoxen ausgibt.

Gruß
Tino
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 19.07.02 20:58 
Titel: Re: Nach einer Datei suchen u. Pfad in die Registry schreibe
m-werk hat folgendes geschrieben:
Ich möchte aber nicht die Datei eingeben, nach der gesucht wird, denn diese Datei hat einen Fixen Namen "Kundendaten.mdb". Es soll einfach nach dieser Datei im "ARBEITSPLATZ" gesucht werden. Es ist doch so, dass dann die ganzen Festplatten automatisch durchsucht werden.

Nein! Der "Arbeitsplatz" ist sozusagen ein virtueller Ordner, der nicht wirklich existiert. Wenn du eine Datei auf allen Festplatten suchen willst, dann musst du in dieser Reihenfolge vorgehen:


  • die Anzahl der Festplatten herausfinden
  • mit FindFirst/FindNext/FindClose nach der Datei suchen


Zitat:
Das Ergebnis soll dann im Label ersichtlich sein. Sollte die Datei nicht gefunden werden, so soll eine Messagebox erscheinen wo dann drinn steht: "Leider konnte die Datenbank auf Ihrem PC nicht gefunden werden".

Das ergibt sich dann durch das Suchen der Datei.

Zitat:
Beim Button "Aktualisieren" soll dann der Path der in der Label steht dann in die Registry unter HKEY_CURRENT_USER\Software\AriusDB\SettingsDB gespeichert werden.

Im Prinzip hast du deine eigene Frage bereits beantwortet. Registry-Zugriffe hast du durch deine 30-Tage-Ideen usw. bereits geübt.
m-werk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Fr 19.07.02 21:15 
Hi, das mit der Registry werd ich schon schaffen. Ich hab nur keinen
ahnung, wie ich das mit dem suchen der Datei hinbekomme.

_________________
Grüße, m-werk
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 19.07.02 22:28 
In der Code-Bibliothek der Delphi-Praxis findest du zwei Funktionen von sakura, mit denen du herausbekommen kannst, wieviele Laufwerke welchen Typs es im PC gibt.

Als kleine Hilfe meinerseits schlage ich folgende Typ-Funktion vor:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  function IsHD(DriveByte: Byte): boolean;
  begin
    case GetDriveType(pchar(CHR(DriveByte + BYTE('A')) + ':\')) of
      // Festplatten
      DRIVE_FIXED,
      // gemappte Netzlaufwerke
      DRIVE_REMOTE,
      // CD-ROM-Laufwerke
      DRIVE_CDROM:
        Result := true;
      else
        Result := false;
    end;
  end;

Auch wenn man davon ausgehen könnte, dass sie nur Festplatten zurückmeldet, habe ich zusätzlich auch CD-ROM-Laufwerke und Netzlaufwerke berücksichtigt, für den Fall, dass deine Datenbank z.B. auf einer CD ist.

In Kombination mit der Funktion "DriveExists" von sakura kannst du dann herausfinden, welche Laufwerke es gibt:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  i : integer;
begin
  // da üblicherweise die Buchstaben A & B für Disketten
  // reserviert sind, kann die Schleife bei C beginnen
  // 2 + 65 (ASCII-Code für A) = 67 (ASCII-Code für C)
  for i := 2 to 25 do
    // Laufwerk muss existieren und dem
    // gewünschten Typ entsprechen
    if(DriveExists(i)) and (IsHD(i)) then
      // es muss möglich sein, auf das Laufwerk
      // zu wechseln
      if(SetCurrentDir(CHR(i + BYTE('A')) + ':\')) then
        begin
          // hier geht dann die Suche los!
        end;
end;

Zur Suche selbst schlage ich vor, dass du dich mit den Funktionen FindFirst, FindNext und FindClose auseinandersetzt. Du brauchst eine sog. rekursive Funktion, die sich quasi vom Root-Ordner nach unten durchwühlt.

Ich habe davon inzwischen mehrere Varianten gesehen. Welche nun die effizienteste ist, weiß ich nicht. Meine Testfunktion ist recht fix. Oder es liegt am 1GHz-Athlon. Wer weiß das heutzutage denn schon? :wink:

Natürlich solltest du die Suche abbrechen, sobald du die Datei gefunden hast. Ich habe das mit einer Bool-Variablen gemacht, die dann mit Hilfe von break automatisch die while-Schleife meiner Suchfunktion und die for-Schleife (s. Codebeispiel) verlässt. Das spart auch ein bisschen Zeit.