Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei suchen u. Path dann in die Registry schreiben (https://www.delphipraxis.net/426-datei-suchen-u-path-dann-die-registry-schreiben.html)

m-werk 19. Jul 2002 19:44


Datei suchen u. Path dann in die Registry schreiben
 
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?

MathiasSimmack 19. Jul 2002 19:59

Re: Datei suchen u. Paht dann in die Registry schreiben
 
Zitat:

Zitat von m-werk
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.

RomanK 20. Jul 2002 12:35

Hier ein kleines Tut über die Arbeit mit der Registry 1:1 aus dem EDH
Zitat:

Mit der Registry arbeiten


Was ist die Registry?

Die Registry ist die zentrale Datenbank eines Windows-Betriebssystems

In der Registry werden die meisten Einstellungen und Informationen des Betriebssystems gespeichert. Dazu gehören unter anderem der Dateiname des Hintergrundbildes, Informationen über installierte Software und vieles mehr. Diese Werte/Informationen lassen sich ohne große Umstände aus der Datenbank auslesen und abändern.

ACHTUNG! Beachte, dass durch die Manipulation der Registry tief ins System eingegriffen wird. Lege zuvor ein Backup Deiner persönlichen Dateien an, um Datenverlust vorzubeugen.


Eine Instanz des Objektes erstellen

Delphi kapselt den Registryzugriff in einem Objekt namens TRegistry. Es befindet sich in der Unit Registry, welche Du der uses-Klausel hinzufügen musst. Bevor Du mit diesem Objekt arbeiten kannst, musst Du es deklarieren und eine Instanz davon erstellen:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  Registry: TRegistry;
begin
  with TRegistry.Create do
Die Registrierungsdatenbank hat einen hierarchischen Aufbau. Am Anfang dieser Hierarchie stehen mehrere Hauptschlüssel, die wiederum weitere Unterschlüssel enthalten. Alle Schlüssel die Deine Anwendung erzeugt, öffnet oder liest sind Unterschlüssel von diesen vordefinierten Hauptschlüsseln. Die Eigenschaft Rootkey definiert diesen Hauptschlüssel für das TRegistry-Objekt. Standardgemäß wird die Eigenschaft Rootkey bei der Erzeugung des Objekts auf den Wert HKEY_CURRENT_USER gesetzt.

Mögliche Werte von Rootkey:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_PERFORMANCE_DATA
HKEY_CURRENT_CONFIG
HKEY_DYN_DATA



Bevor Du jetzt einen Schlüssel erzeugst oder einen Wert aus einem Schlüssel lesen kannst, muss dieser geöffnet werden. Dies geschieht mit dem Aufruf von Openkey:
Code:
function OpenKey(const Key: string;
  CanCreate: Boolean): Boolean;
Die Funktion erwartet zwei Parameter: Erstens den Schlüssel, welcher geöffnet werden soll (immer relativ von bisher geöffneten Schlüsseln) und zweitens einen booleschen Parameter, welcher steuert, ob ein Schlüssel, wenn er noch nicht existiert erstellt werden soll (True) oder nicht (False). Jeder weitere Aufruf von Openkey öffnet den Schlüssel relativ vom bisher geöffnetem Schlüssel. Bevor man also einen anderen Schlüssel öffnen möchte ist der Aufruf CloseKey; notwendig.



Lesen/Schreiben von Werten

Das Objekt ist jetzt bereit in die Registry Werte zu schreiben und auch aus dieser zu lesen. Dies geschieht mit der Methode WriteString bzw. mit ReadString. Die beiden Parameter, die WriteString erwartet, müssen Sie mit Angaben zum Namen (Typ String) und zum Wert (auch vom Typ String), welcher gespeichert werden soll, füllen. Ist der Name bereits vorhanden, wird dieser überschrieben.

ReadString erwartet nur einen Parameter, nämlich den Namen des zu lesenden Werts. Als Result wird der Wert mit diesem Namen zurückgegeben. Man hat auch die Möglichkeit direkt einen Integer-Wert, einen booleschen Wert oder eine Gleitkommazahl in die Registry zu schreiben/lesen. Für diese Aufgabe gibt es die Methoden WriteInteger, WriteBool und WriteFloat, bzw. ReadInteger, ReadBool und ReadFloat. Die Parameter sind bei diesen Methoden identisch mit Ihren Verwandten WriteString und ReadString. Natürlich muss der übergebene Wert bzw. der Rückgabewert vom entsprechenden Typ sein.

Da für das Objekt Speicher reserviert wurde, muss dieser mit Free wieder freigegeben werden.


Beispiel

Es folgt jetzt ein Beispiel, welches einen String (Edit1.Text) und einen Integer (SpinEdit1.Value) in den Schlüssel "HKEY_CURRENT_USER\Software\TestFirma\TestProd ukt" schreibt. Zur Sicherheit kommt das ganze in einen try-finally-Block.
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TRegistry.Create do
  begin
    try
      Rootkey:=HKEY_CURRENT_USER; //Hauptschlüssel
      OpenKey('Software\TestFirma\TestProdukt',True); //Unterschlüssel öffnen
      WriteString('TestString',Edit1.Text);
      WriteInteger('TestInteger',SpinEdit1.Value);
    finally
      Free;
    end;
  end;
end;
Tipp: Sollte der Eintrag nicht sofort in RegEdit erscheinen, einfach mal F5 drücken.

Das Lesen der Werte aus der Registry ist nicht viel schwieriger. Der Wert "TestString" wird in das Edit-Feld eingelesen und die Integer-Zahl "TestInteger" wird SpinEdit1 übergeben. Zur Speichersicherheit wird das ganze in einem try-finally-Block gekapselt.
Code:
procedure TForm1.Button2Click(Sender: TObject);
begin
  with TRegistry.Create do
  begin
    try
      Rootkey:=HKEY_CURRENT_USER;
      OpenKey('Software\TestFirma\TestProdukt',True);
      Edit1.Text:=ReadString('TestString');
      SpinEdit1.Value:=ReadInteger('TestInteger');
    finally
      Free;
    end;
  end;
end;


Weitere Befehle des Objekts TRegistry

TRegistry bietet noch viele weitere Möglichkeiten, die Registry zu bearbeiten.


Einen Wert löschen (im aktuell geöffnetem Schlüssel):
Code:
DeleteValue('NameDesWertes');
Einen Schlüssel löschen (im aktuell geöffneten Hauptschlüssel - Rootkey):
Code:
DeleteKey('Software\TestFirma\TestProdukt');
Testen, ob ein Schlüssel (relativ vom geöffnetem Schlüssel) oder ein Wert existiert:
Code:
Checkbox1.Checked:=KeyExists('TestProdukt');
Checkbox2.Checked:=ValueExists('TestString');

Weitere Befehle findest Du in der OH unter dem Stichwort "TRegistry". Es ist auch ein sehr ausfürhliches Beispiel dabei. Die Erklärungen sind größtenteils verständlich.



--
Name: Philipp Frenzel
E-Mail: webmaster@delphi-treff.de
Homepage: http://www.delphi-treff.de

MathiasSimmack 20. Jul 2002 18:32

Zitat:

Zitat von FuckRacism
Hier ein kleines Tut über die Arbeit mit der Registry 1:1 aus dem EDH ...

Also, der Link hätte sicher auch gereicht. Entweder auf die Online-Version, oder auf den Download der alten EDH2000-Version.

Außerdem hat m-werk in AUQ.de bereits geschrieben, dass er die Registry-Sache wahrscheinlich auch allein hinbekommt. Nur mit dem Suchen der Datei hat er Probleme.

Luckie 20. Jul 2002 21:37

Zitat:

Zitat von MathiasSimmack
Außerdem hat m-werk in AUQ.de bereits geschrieben, dass er die Registry-Sache wahrscheinlich auch allein hinbekommt. Nur mit dem Suchen der Datei hat er Probleme.

Wir sind hier leider keine Hellseher und regelmäßgi die Postings auf auq.de kontrollieren wir auch nicht.

RomanK 20. Jul 2002 23:40

Danke. Luckie.

MathiasSimmack 21. Jul 2002 07:43

Ich bin auch kein Hellseher. Und wenn ich z.B. eine Frage habe, dann poste ich sie nicht gleichzeitig in mehreren Foren. Ich frage erst mal in einem Forum, und wenn ich dann in - sagen wir mal - einer Woche keine Antwort habe, dann wende ich mich an das nächste.

Oder (wenn es so dringend ist, dass ich doch in zwei Foren gleichzeitig frage) ich informiere die Leute in beiden Foren über den Stand der Dinge. Damit halt alle wissen, dass ich Problem A bereits gelöst habe und nun noch eine Lösung für Problem B brauche.

Das gehört IMHO zu den viel (und gern auch falsch) zitierten Netiquetten und verhindert, dass die interessierten Helfenden zu Hellsehern oder "regelmäßigen Kontrolleuren" mutieren müssen. :idea:
Außerdem verhindert es Zornesausbrüche, wenn sich jemand die Arbeit macht und dem Fragenden eine adäquate Lösung schreibt, die dieser dann mit den Worten "Ach, ich hab´ schon was aus einem anderen Forum" quittiert.

Aber bei mir ist es in der Tat so, dass bei einem Online-Ausflug auch automatisch 3 Browserfenster mit Foren zu sehen sind: die Delphi-Praxis, das Entwickler-Forum und auch AUQ.de.

m-werk 22. Jul 2002 10:25

Hi!

Der grund, warum ich diesen Beitrag in 2 Foren gestellt habe ist der, dass das Tool schon dringenst benötigt wird. Ich komm mit dem Suchen der Datei nicht klar. Ich hab wirklich keine Ahnung, wie ich das mache. Ich habe mir mal die Hilfe angesehen und nach FindFirst usw. gesucht. Ich hab auch was gefunden, aber ich komm nicht dahinter, wie ich Daten suchen kann.
Darum bitte ich um eure hilfe!

MathiasSimmack 22. Jul 2002 11:16

Zitat:

Zitat von m-werk
Darum bitte ich um eure hilfe!

Kein Problem, ich kann dir meine Suchfunktion geben. Du musst nur sagen, wo du sie gern hin hättest ... :wink: ... also, ich meine jetzt die Delphi-Praxis oder AUQ. Upps, wie doppeldeutig.

Daniel 22. Jul 2002 11:31

@MathiasSimmack: Hier in der Delphi-PRAXiS wäre Deine Suchfunktion schon nicht schlecht aufgehoben... :wink:

Grüße,
Daniel

MathiasSimmack 22. Jul 2002 11:50

Wirklich? Ich kam mir schon so ausgeschlossen vor:
Zitat:

Wir sind hier leider keine Hellseher ...
So, als würde ich gar nicht mehr dazu gehören.

Also, m-werk -

Mein Vorschlag wäre, dass du die eigentliche Suchroutine in eine eigene Prozedur einklammerst. Das ist der beste Weg, da sich diese Prozedur für jedes Unterverzeichnis wieder selbst aufrufen muss. Schließlich willst du ja nicht nur das Hauptverzeichnis C:\ sondern auch C:\Programme usw. durchsuchen?!

Ich schlage vor, dass du dieser Prozedur den Root-Pfad immer mit übergibst und diesen Wert nie änderst. Das passiert natürlich programmtechnisch und würde z.B. (s. for-Schleife in meinem letzten AUQ-Posting) so aussehen:
Code:
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
        // rekursive Suchfunktion aufrufen
        scanit(CHR(i + BYTE('A')) + ':\');

        // die Suche abbrechen, wenn die Datei
        // gefunden wurde
        if(found) then break;
      end;
In der Suchprozedur stellst du dann als erstes fest, wie das aktuelle Verzeichnis heißt, und in der letzten Zeile der Funktion vergleichst du das aktuelle Verzeichnis mit dem übergebenen Root-Pfad. Sind sie unterschiedlich, springst du wieder eine Ebene nach oben.

Wozu?

Das hat mit der Funktion an sich zu tun. Deine Suche startet z.B. in C:\, und die Funktion findet jetzt z.B. das Programme-Verzeichnis. Also wechselt sie in diesen Ordner und ruft sich selbst wieder auf, um die Suche fortzusetzen.
Jetzt mal angenommen, es gäbe keine Unterordner mehr. Wenn die Funktion die gesuchte Datei nicht findet, steckt sie im Programme-Ordner fest, und die Suche würde nicht mehr weitergehen, bzw. keine Ergebnisse mehr liefern. Du musst also wieder eine Ebene nach oben ins Hauptverzeichnis C:\ springen, damit dann z.B. der Windows-Ordner gefunden und durchsucht werden kann. usw. usw.
Code:
procedure scanit(orgPath: string);
var
  path : string;
begin
  path := GetCurrentDir;

  // Suchfunktion
  // kommt gleich, und muss HIER REIN!!!

  if(Path <> orgPath) then ChDir('..');
end;
Nun zur Suche. Grundlegend kann (!) eine FindFirst/FindNext-Suche so aussehen:
Code:
var
  res : integer;
  ds : TSearchRec;
begin
  res := FindFirst('*.*',faAnyFile,ds);
  while(res = 0) do
    begin
      // Anzeige des aktuellen Dateinamens/Verzeichnisses
      // im Label der Form
      Form1.Label1.Caption := path + '\' + ds.Name;

      // ist der Dateiname mit dem Suchnamen identisch?
      if(lowercase(ds.Name) = lowercase(szSearchFile)) and
        (ds.Attr and faDirectory = 0) then
      begin
        // Ja!
        Found := true;
      end
      // Nein, es ist aber ein Unterverzeichnis.
      // Also, rein da, & weitersuchen!
      else if(ds.Attr and faDirectory <> 0) and
        (ds.Name <> '.') and (ds.Name <> '..') then
      begin
        SetCurrentDir(ds.Name);
        scanit(orgPath);
      end;

      // die Suche ist beendet!
      if(Found) then break;

      res := FindNext(ds);
    end;
    FindClose(ds);

  {mal empfehlenswert ->} Application.ProcessMessages;
end;
Es gibt auch noch andere Varianten mit repeat-until, aber ich persönlich benutze seit vergangenen TurboPASCAL-Tagen diese while-Konstruktion.
Du siehst hier auch gleich meine Bool-Variable. Wenn sie auf TRUE gesetzt wird, wird die Schleife verlassen. Logisch! Die Datei wurde ja gefunden, jede weitere Suche wäre Zeitverschwendung. Du solltest wirklich auch break verwenden, damit FindClose in jedem Fall aufgerufen wird. exit wäre zum Verlassen der Schleife zwar möglich, aber nicht empfehlenswert. Übrigens darf die Bool-Variable keine lokale Variable der Prozedur "scanit" sein!

Übrigens, schöner Nebeneffekt: bei mir benötigte die Funktion beim ersten Durchlauf ca. 10 Sekunden, um auf einem Athlon mit 1GHz die Laufwerke C-H mit insgesamt 26.685 Dateien und 2.206 Ordnern zu durchsuchen. (Ich habe extra mal nach einem Programm auf der H-Partition suchen lassen!)
Das Ganze scheint irgendwie und irgendwo gecacht zu werden, denn jeder weitere Durchlauf benötigte nur noch ca 1.6 Sekunden.

Gruß,
Mathias.

m-werk 23. Jul 2002 09:03

Danke für die ausführliche beschreibung. Ich hab nur ein kleines Problem damit.
In welche Procedure setze ich den 1. und den 3. Code?

Ich habe den 3 Code in den Button 'Suchen' gesetzt. Ich bin mir aber nicht sicher, ob das auch richtig ist.

MathiasSimmack 23. Jul 2002 10:36

Also ich habe eine Funktion geschrieben, die "Suchen" heißt und so deklariert ist:
Code:
procedure Suchen(const szSearchFile: string);
In dieser ... hm, eigentlich ist´s ja eine: Prozedur stecken die Routinen
  • DriveExists
  • IsHD
  • scanit
als untergeordnete Funktionen/Prozeduren. Ach was soll´s. So sieht sie komplett aus:
Code:
procedure Suchen(const szSearchFile: string);
var
  Found           : boolean;
  iFiles, iFolders : integer;

  function DriveExists(DriveByte: Byte): Boolean;
  begin
    Result := GetLogicalDrives and (1 shl DriveByte) <> 0;
  end;

  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;

  procedure scanit(orgPath: string);
  var
    path : string;
    res : integer;
    ds  : TSearchRec;
  begin
    path := GetCurrentDir;
    res := FindFirst('*.*',faAnyFile,ds);
    while(res = 0) do
      begin
        // Anzeige des aktuellen Dateinamens/Verzeichnisses
        // im Label der Form
        Form1.Label1.Caption := path + '\' + ds.Name;

        // ist der Dateiname mit dem Suchnamen identisch?
        if(ds.Attr and faDirectory = 0) then
          begin
            inc(iFiles);
            if(lowercase(ds.Name) = lowercase(szSearchFile)) then Found := true;
          end
        // Nein, es ist aber ein Unterverzeichnis.
        // Also, rein da, & weitersuchen!
        else if(ds.Attr and faDirectory <> 0) and
          (ds.Name <> '.') and (ds.Name <> '..') then
        begin
          inc(iFolders);
          SetCurrentDir(ds.Name);
          scanit(orgPath);
        end;

        // die Suche ist beendet!
        if(Found) then break;

        res := FindNext(ds);
      end;
    FindClose(ds); Application.ProcessMessages;

    if(path <> orgPath) then ChDir('..');
  end;

var
  i      : integer;
  dwTime : dword;
begin
  found        := false;
  iFiles       := 0;
  iFolders     := 0;
  Screen.Cursor := crHourglass;

  dwTime       := GetTickCount;

  // 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
          // rekursive Suchfunktion aufrufen
          scanit(CHR(i + BYTE('A')) + ':\');

          // die Suche abbrechen, wenn die Datei
          // gefunden wurde
          if(found) then break;
        end;

  dwTime              := GetTickCount - dwTime;
  Form1.Label2.Caption := inttostr(dwTime) + ' msec';
  Form1.Label3.Caption := inttostr(iFiles) + ' Dateien, ' +
    inttostr(iFolders) + ' Ordner durchsucht';

  Screen.Cursor := crDefault;
  // nichts gefunden, Label leeren
  if(not(found)) then Form1.Label1.Caption := '';
  Form1.Button2.Enabled := found;
end;
Und du rufst bei deinem Suchen-Button nur diese Funktion auf:
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Suchen('Kundendaten.mdb');
end;
Ich habe noch drei Labels. Label1 ist das, wo bei dir dann wohl auch der Name angezeigt werden soll. Die beiden anderen sind nur zur Anzeige der Zeit und der Anzahl der Dateien/Ordner, weil ich halt wissen wollte, wie lange das dauert.

m-werk 24. Jul 2002 07:43

Hi, vielen Dank für deine bemühungen.

Code:
procedure TForm1.SuchenClick(Sender: TObject);
begin
  Suchen('Kundendaten.mdb');
end;
Bei diesem Code kommen folgende Fehlermeldungen:
Bei 'Suchen(' steht der Cursor nach der Klammer und die fehlermeldung lautet:
Operator oder Semikolon fehlt

Und zum Schluss dieser Zeile 'Anweisung erforderlich, aber Ausdruck vom Typ 'TButton' gefunden'

Ich habe dann bei 'Suchen:=('Kundendaten.....' eingegeben

Nun kommt nur mehr eine Meldung:
[Fehler] DBsuche.pas(171): Inkompatible Typen: 'TButton' und 'String'

Mit dieser kann ich leider nichts anfangen

MathiasSimmack 24. Jul 2002 09:27

Zitat:

Zitat von m-werk
Mit dieser kann ich leider nichts anfangen

Ich schon. Es liegt auf der Hand, wenn du dir mal deinen Code ansiehst:
Code:
// Der Button, auf den du klickst, heißt "Suchen"
procedure TForm1.SuchenClick(Sender: TObject);
begin
  // Die Funktion, die du aufrufst, heißt AUCH "Suchen"
  Suchen('Kundendaten.mdb');
end;
Da ich ja nicht wissen konnte, wie du deinen Button nennst, habe ich meiner Funktionen einen recht eindeutigen Namen gegeben, der nun -sinnigerweise- mit dem deines Buttons identisch ist. Also kommen sich beide in die Quere.

Zwei Möglichkeiten:
  • Du nennst den Button um, etwa "SuchenBtn", "Search", "SearchBtn" ...
  • Du gibst der Prozedur "Suchen" einen neuen Namen, etwa
    Code:
    procedure DatenbankSuchen(const szSearchFile: string);
    Du musst dann natürlich im "OnClick"-Ereignis des Buttons dann auch den neuen Prozedurnamen benutzen, sonst ändert sich an der Fehlermeldung nichts. :wink:

m-werk 30. Jul 2002 07:43

Hi, danke, das mit dem Suchen funktioniert jetzt prima.

Ich hab nur noch ein kleines anliegen. Wenn ich jetzt auf Aktualisieren klicke, dann wird jetzt der Wert, der im Label steht richtig in die Registry geschrieben.
Dabei ist mir jetzt eines aufgefallen.
Im Label steht z.B. C:\Arius\Datenbank\Kundendaten.mdb

Wenn ich jetzt den Label in die Registry hineinstelle, dann steht dort auch der Wert C:\Arius\Datenbank\Kundendaten.mdb

Ich möchte aber jetzt nur in der Registry stehen haben C:\Arius\Datenbank

Wie kann ich das jetzt noch machen, dass die Datei nicht mit übernommen wird?

MrSpock 30. Jul 2002 08:26

Hallo m-werk,

dazu gibt es die Funktion:

Code:
function ExtractFilePath(const FileName: string): string;
diese gibt als Ergebnis nur den Pfad zurück, der in FileName enthalten ist.

m-werk 30. Jul 2002 08:37

Hi, und wo baue ich diesen code ein?

Zum Aktualisieren sieht mein Code so aus:

Code:
procedure TForm1.AktualisierenClick(Sender: TObject);
var
REG:TRegistry;
b:string;
begin
b:=Form1.Label4.Caption;
  REG:=TRegistry.Create;
  try
    REG.RootKey := HKEY_CURRENT_USER;
    if REG.OpenKey('Software\AriusDB\SettingsDB', True) then
      begin
      REG.WriteString('DBPath', b);
      end;
    finally
      REG.CloseKey;
      REG.Free;
    end;
end;

MrSpock 30. Jul 2002 08:52

Hallo m-werk,

Code:
...
begin
  b:=Form1.Label4.Caption;
  REG:=TRegistry.Create;
  try
    REG.RootKey := HKEY_CURRENT_USER;
    if REG.OpenKey('Software\AriusDB\SettingsDB', True) then
      begin
      REG.WriteString('DBPath', ExtractFilePath(b));
      end;
    finally
      REG.CloseKey;
      REG.Free;
    end;
end;
oder

Code:
...
begin
  b:=ExtractFilePath(Form1.Label4.Caption);
  REG:=TRegistry.Create;
  try
    REG.RootKey := HKEY_CURRENT_USER;
    if REG.OpenKey('Software\AriusDB\SettingsDB', True) then
      begin
      REG.WriteString('DBPath', b);
      end;
    finally
      REG.CloseKey;
      REG.Free;
    end;
end;
Dabei sollte aber sicher gestellt sein, dass Label4 immer einen gültigen Dateinamen (inkl. Pfad) enthält.

m-werk 30. Jul 2002 09:37

Hi, danke und was ist jetzt mit dieser Funktion:

Code:
function ExtractFilePath(const FileName: string): string;
Benötige ich diese auch noch? Wenn ja, wo setze ich diese hinein?

MrSpock 30. Jul 2002 10:04

Hallo m-werk,

das war nur die Deklaration aus der Unit SysUtils.

Wenn du also
Code:
uses SysUtils
in deiner Anwendung verwendest, kannst du die Codebeispiele problemlos übersetzen. Dort habe ich ja den Aufruf eingebaut.

m-werk 31. Jul 2002 07:40

Hi, ich danke dir für die Hilfe.
Jetzt funktioniert alles.

m-werk 31. Jul 2002 08:51

Hi, ich danke dir für die Hilfe.
Jetzt funktioniert alles.

Eine Sache habe ich da aber noch.

Ich habe in dieser Form auch ein Infofenster mit einem Label drinn.
In diesem Label wird mir angezeigt, wo die Datenbank liegen soll, wenn schon in der
Registry ein eintrag vorhanden ist.

Im Anderen Label (Label4) wird mir der Pfad der Datenbank angezeigt, wo wirklich
die Datenbank dann ist.

Es kann jetzt so sein, dass die beiden Pfade, von Label 1 und Label 4 gleich sind.
Ich möchte eine überprüfung nach dem Suchen starten.
Wenn Label1 = Label4 dann soll der Button 'Aktualisieren.Enabled := False' sein.

Wie kann ich noch diese Überprüfung in meinem Suchen Button einbauen?
Es soll aber wieder nur der Pfad und nicht mit der Datei überprüft werden!

MrSpock 31. Jul 2002 11:02

Hallo m-werk,

der Code dazu wäre:

Code:
Aktualisieren.Enabled := (ExtractFilePath(Label1.Caption) = ExtractFilePath(Label4.Caption));
Du musst aber noch die korrekte Stelle finden, an der diese Anweisung eingefügt werden soll. Es muss eine Stelle sein, an der sowohl Label1 als auch Label4 ihre Werte korrekt anzeigen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:10 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