Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sichern von Daten (https://www.delphipraxis.net/739-sichern-von-daten.html)

m-werk 30. Aug 2002 21:09


Sichern von Daten
 
Hallo Leute,

Ich habe in meinem Programm ein Menü, welches sich 'Datenbank sichern' nennt.

Nun möchte ich die Datenbank sichern. Der Path der Original-DB steht in der Registry. Nun möchte ich es so machen, dass wenn ich auf Datenbank sichern klicke, dass dann eine art Explorer erscheint, wo ich die Datenbank hinspeichern möchte.

Wie kann man das realisieren?

Luckie 30. Aug 2002 21:21

Hier mit kann´st du dir einen Ordner auswählen:
Code:
[b]uses[/b] shlobj;


[b]function[/b] TfrmMain.OpenFolder(root: Integer; Caption: [b]string[/b]): [b]string[/b]; [i]//Verzeichnis-Öffnen-Dialog-Funktion[/i]
[b]var[/b]
  bi: TBrowseInfo;
  lpBuffer: PChar;
  pidlPrograms, pidlBrowse: PItemIDList;
[b]begin[/b]
  [b]if[/b] ([b]not[/b] SUCCEEDED(SHGetSpecialFolderLocation(GetActiveWindow, root,
    pidlPrograms))) [b]then[/b]
    exit;
  lpBuffer := StrAlloc(MAX_PATH);
  bi.hwndOwner := GetActiveWindow;
  bi.pidlRoot := pidlPrograms;
  bi.pszDisplayName := lpBuffer;
  bi.lpszTitle := PChar(Caption);
  bi.ulFlags := BIF_RETURNONLYFSDIRS;
  bi.lpfn := [b]nil[/b];
  bi.lParam := 0;

  pidlBrowse := SHBrowseForFolder(bi);
  [b]if[/b] (pidlBrowse <> [b]nil[/b]) [b]then[/b]
    [b]if[/b] SHGetPathFromIDList(pidlBrowse, lpBuffer) [b]then[/b]
      Result := lpBuffer;
  StrDispose(lpBuffer);
[b]end[/b];

[b]procedure[/b] TfrmMain.cmdOpenClick(Sender: TObject);
[b]begin[/b]
  txtPath.Caption := OpenFolder(CSIDL_DRIVES, 'Verzeichnis wählen'); [i]//Übergabe des gewählten Verzeichnisses[/i]
[b]end[/b];
Und dann nur noch CopyFile.

Christian Seehase 30. Aug 2002 22:36

Moin m-werk,

und wenn Dir das zu aufwändig ist, schau Dir mal die Funktionen SelectDirectory aus der Unit Filectrl an.

Luckie 31. Aug 2002 12:31

Produziert die nicht diesen Win3.1-Oldstyle Dialog?

Christian Seehase 31. Aug 2002 12:39

Moin Luckie,

das hängt davon ab, welche der beiden Möglichkeiten man verwendet.
Die mit Caption als erstem Parameter tut das nicht.

Luckie 31. Aug 2002 12:44

:hi:

Danke, und wieder etwas schlauer geworden und das an meinem Geburtstag :mrgreen:.

m-werk 1. Sep 2002 16:55

Danke Luckie für den Code, aber mit dem hab ich leider nichts anfangen können aber er hat mein gedächnis einwenig auf die sprünge geholfen. Ich hab jetzt fast alles geschaft bis auf eine Sache noch.

Ich habe in der Registry den Ordner stehen, wo die Datei ist, welche ich sichern möchte. Diese Datei nennt sich 'Kundenverwaltung.mdb'

Ich kann zwar den Ordner auslesen und im Label anzeigen, was ich aber nicht kann aber möchte, ist dass die Datei, die in diesem Ordner liegt, in einem anderen Label erscheint.

Wie kann ich das noch machen?

Luckie 1. Sep 2002 17:05

Suchst du eventuell ExtractFilename?

m-werk 1. Sep 2002 17:10

Ja, könnte sein. Wie kann ich das mit extractfilename machen?

Luckie 1. Sep 2002 17:18

F1

Code:
lable1.Caption := ParamStr(0); // Programmpfad mit Anwendungsname
label2.Caption := ExtractFilename(ParamStr(0)); // nur Anwendungsname

m-werk 1. Sep 2002 17:25

hi, ich habs noch nicht ganz

Ich zeige den Pfad im label mit folgendem Code an:

Code:
Label2.Caption := a;
Ich lese ja aus der Registry den Pfad aus.
Und wenn ich jetzt den Code:
Code:
Label3.Caption:=ExtractFilename(ParamStr(0))
dazugebe, dann sehe ich im Label 3 nur die Datei, bei dem
Ordner, wo sich gerade mein Programm befindet.

Weiters soll die Datei mit der Ext. *.mdb angezeigt werden.

Luckie 1. Sep 2002 17:32

Witzbold, das mit ParamStr(0) war nur zu demonstrations Zwecken gedacht. Hattest du nicht gesagt, du hättest Pfad und Datei in der Registry?

m-werk 1. Sep 2002 17:34

Ich hab nur den Pfad in der Registry. Die Datei nicht.

Den Path lese ich ja schon im Label2 aus. Jetzt fehlt nur noch die datei in Label 3 dazu.

Daniel B 1. Sep 2002 17:37

Ich denke, er möchte im Label3 Kundenverwaltung.mbd drin haben. Er holt sich den Pfad aus der Reg, kann aber die Datei aus dem Ordner ncith rausfischen.

Probiers mal damit:

if (FileExists(ChangeFileExt(ParamStr(0), '.mbd'))) then Label3.Caption := 'Die Datei Kundenverwaltung.mbd, ist in dem Ordner sowieso...';

Grüsse, Daniel :hi:

Luckie 1. Sep 2002 17:39

Ja wenn du den Pfad hast, dann hast du doch auch die Datei. Oder heißt die immer anders? Dann mußt du in dem Order, dessen Pfad du hast, mit FindFirst und FindNext suchen. Wenn dort nur eine Datei steht, dann reicht eventuell schon FindFirst.

m-werk 1. Sep 2002 17:49

Es könnten mehrere Dateien in diesem Ordner sein, aber die Datei, die im Label 3 erscheinen soll, soll immer folgende sein 'Kundendaten.mdb'

Wie geht das mit dem FindFirst

Luckie 1. Sep 2002 17:53

Dann such immer mit FindFirst nach *.mdb oder wenn du dir absolut sicher sein kannst , dann mach doch:
Code:
Label3.Caption := 'Kundendaten.mdb';

m-werk 1. Sep 2002 18:01

Hi, ich hab das jetzt so gemacht. Nun, wenn ich jetzt genau diese Datei sichern möchte kommt die Meldung:
Datei 'Kundendaten.mdb' konnte nicht geöffnet werden.

So sieht mein Button beim Sichern aus
Code:
procedure TForm1.Button2Click(Sender: TObject);
var
  NewFileName: string;
  Msg: string;
  NewFile: TFileStream;
  OldFile: TFileStream;
begin
  NewFileName := ExtractFilePath(Label1.Caption + '\') + ExtractFileName(Label3.Caption);
  Msg := Format('Copy %s to %s?', [Label2.Caption + Label3.Caption, NewFileName]);
  if MessageDlg(Msg, mtConfirmation, mbOKCancel, 0) = mrOK then
  begin
    OldFile := TFileStream.Create(Label3.Caption, fmOpenRead or fmShareDenyWrite);
    try
      NewFile := TFileStream.Create(NewFileName, fmCreate or fmShareDenyRead);
      try
        NewFile.CopyFrom(OldFile, OldFile.Size);
      finally
        FreeAndNil(NewFile);
      end;
    finally
      FreeAndNil(OldFile);
    end;
  end;
end;
Und so sieht der Code aus, wo ich den Ordner und das Laufwerk auswähle, aufdem ich die Datei sichern möchte:

Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  Dir: string;
begin
  Dir := 'C:\Windows';
  if SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP) then
    Label1.Caption := Dir;
end;
Was mach ich da noch falsch?

m-werk 1. Sep 2002 18:04

ICH HABS JETZT. Es funktioniert.

Ich hab was vergessen.
Es muß so aussehen:
Code:
...
begin
    OldFile := TFileStream.Create(Label2.Caption + Label3.Caption, fmOpenRead or fmShareDenyWrite);
    try
....
Ich hab vergessen (Label2.Caption +
einzufügen.

DANKE FÜR EURE HILFE

Luckie 1. Sep 2002 19:26

Na siehst du, es hilft schon, wenn man nur mal darüber spricht. :mrgreen:


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