Avatar billede Slettet bruger
21. oktober 2006 - 12:50 Der er 21 kommentarer og
1 løsning

file defination

Jeg skal have gemt nogle filer på en anden placering.

Det at definere extension dur ikke da programmet genere nye filer med med en ændret extention.

Jeg vi stadig bruge en savedialog, men hvordan kan jeg definere filerne...

eks. programmet har nogle faste filer vis.mti, vis.mtd, vis.blb,

den generere andre filer som vis. ma1, ma2, ma3 så det smarteste er vel at definere dem som vis - hermed får du alle filer med også dem som senere bliver oprettet.

damm det er svært at forklare men spørg endelig
Avatar billede Slettet bruger
21. oktober 2006 - 18:13 #1
Det jeg bruger nu er en kopiering til a:drevet men hvordan gør jeg via en savedialog? til anden placering f.eks et usb stik som jo bare er et virtuel drev

var
FOS :TSHFileOpStruct;
begin
with FOS do
begin
Wnd  := 0;
wFunc := FO_COPY;
pFrom := 'c:\programmer\test\program\vis*'#0;
pTo  := 'a:\program\backup'#0;
fFlags:= FOF_NOCONFIRMATION;
end;
SHFileOperation(FOS);
begin
with FOS do
begin
Wnd  := 0;
wFunc := FO_COPY;
pFrom := 'c:\programmer\test\program\hist*'#0;
pTo  := 'a:\program\backup'#0;
fFlags:= FOF_NOCONFIRMATION;
end;
SHFileOperation(FOS);
Avatar billede hrc Mester
23. oktober 2006 - 10:51 #2
En SaveDialog kan sættes til "multiple files" så det må være noget i retningen dette:

var
  FOS : TSHFileOpStruct;
begin
  SaveDialog.Options := [ofHideReadOnly,ofAllowMultiSelect,ofFileMustExist,ofEnableSizing];
  SaveDialog.InitialDir := 'c:\programmer\test\program\vis';
  if SaveDialog.Execute then
  begin
    for i := 0 to SaveDialog.Files.Count - 1 do
    begin
      Filename := SaveDialog.Files[i];
      with FOS do
      begin
        Wnd := 0;
        wFunc := FO_COPY;
        pFrom := pchar(Filename);
        pTo  := 'a:\programmer\backup'#0;
        fFlags:= FOF_NOCONFIRMATION;
      end;
      SHFileOperation(FOS);
    end;
  end;

Det er ikke en SelectDirectory dialog til at sætte destinations-kataloget, du leder efter?

(Tillad mig i øvrigt at rette "generere". Det hedder "genererer").
Avatar billede Slettet bruger
23. oktober 2006 - 14:10 #3
måske det var nemmere det er...

alle backup filerne ligger i backup mappen, kan man med en savedialog gemme hele mappen på drev efter valg?

Så skal man ikke hen og definere de forskellige filer der skal gemmes via savedialog
Avatar billede hrc Mester
23. oktober 2006 - 17:34 #4
Det var nok den pæneste løsning (men min løsning virker nu ellers). I ShellApi'et er der den dialog til at vælge katalog.
Avatar billede Slettet bruger
23. oktober 2006 - 20:39 #5
du skulle vel ikke have et eksempel liggende ?
Avatar billede hrc Mester
24. oktober 2006 - 12:24 #6
procedure TForm1.Button1Click(Sender: TObject);
var
  Directory : string;
begin
  Directory := 'c:\windows';
  // Gammelt win3.11 layout.
  if SelectDirectory(Directory,[sdAllowCreate, sdPerformCreate, sdPrompt],0) then
    MessageDlg('Folder valgt: '+Directory, mtInformation, [mbOK], 0);

  // Nyt WinXP layout
  if SelectDirectory('Overskrift','c:\windows', Directory,[sdNewFolder, sdShowEdit, sdShowShares, sdNewUI, sdShowFiles, sdValidateDir],self) then
    MessageDlg('Folder valgt: '+Directory, mtInformation, [mbOK], 0);
end;

Hvis du vil kunne styre hvor dialogen skal stå på skærmen så læs her: http://delphi.about.com/od/windowsshellapi/l/aa122803a.htm
Avatar billede hrc Mester
24. oktober 2006 - 12:25 #7
Jeg har smækket alle options på dialogerne så man kan se dem - sandsynligvis har du ikke brug for ret mange om du bruger en af dialogerne.
Avatar billede Slettet bruger
24. oktober 2006 - 13:29 #8
skal der uses noget får en fejl på SelectDirectory og alle options
Avatar billede hrc Mester
24. oktober 2006 - 13:50 #9
FileCtrl er en god en at have med.

Et tip er i øvrigt at gå ind i Delphis\Source katalog og søge efter eksempelvis "SelectDirectory". Et kommandolinjeværktøj som Grep eller søgefunktionen i Servant Salamander (som jeg bruger (købt licens)), <alt-f7>. Windows' elendige søgefunktion kan sikkert også bruges.
Avatar billede Slettet bruger
24. oktober 2006 - 14:10 #10
hmm får stadig fejl på alle options, too many parameteres
Avatar billede Slettet bruger
24. oktober 2006 - 14:11 #11
I delphi\source har jeg kun rtl og webmidas
Avatar billede hrc Mester
24. oktober 2006 - 14:39 #12
Nu kører du ikke en Delphi 1 på en Windows 3.11'er eller lignende, vel?

Jeg bruger D2006 Pro og der ligger FileCtrl.dcu i "\lib" og "\lib\debug" mens source-filen som du måske ikke har, ligger i "\source\Win32\vcl".

Hvis ikke dcu- og eventuelt pas-filen er der må du prøve at kalde den direkte (SHBrowseForFolder) sådan som About-Zarko beskriver.
Avatar billede Slettet bruger
24. oktober 2006 - 18:30 #13
jeg bruger d5 interprise
Avatar billede hrc Mester
24. oktober 2006 - 18:44 #14
Den skulle da også være rigeligt - men det kan være at filectrl ikke er kommet med i den  version. Prøv About's eksempel må rådet være.
Avatar billede Slettet bruger
24. oktober 2006 - 18:59 #15
jo filectrl.dcu findes eller ville jeg få en fejl når jeg user den
Avatar billede Slettet bruger
25. oktober 2006 - 00:18 #16
jeg har kigget rundt på about - men kan simpelhen ikke finde det jeg skal bruge
Avatar billede hrc Mester
25. oktober 2006 - 08:57 #17
Hvis du har filectrl så bør det også kunne virke; så stor forskel er der ikke på vcl-delen i D7 og D2006. Bruger du mit eksempel (som er testet) eller har du lavet dit eget? Den del med at Directory er en var-parameter drillede mit lidt - måske er du heller ikke opmærksom på den.

Mht. About. Hvad med det link som jeg lagde ved?
Avatar billede Slettet bruger
25. oktober 2006 - 13:56 #18
Jeg bruger dit eksempel... her får jeg en fejl (too many parameters) på alle options

[Error] Unit1.pas(49): Undeclared identifier: 'sdShowEdit'

Men fjerner jeg alle options så kører dit eksempel...
men den viser jo bare treestruktur på det valgte katalog og ikke alle tilgængelige drev - hvis jeg gerne vil have backup på et usb så er det jo nød til at blive vist i dialogen.

Jeg har kigget på about og kan ikke finde det jeg skal bruge,

som er: når koden køres så skal den kopiere mappen backup til det valgte sted i dialogen.
Avatar billede Slettet bruger
25. oktober 2006 - 18:53 #19
Jegt har siddet og leget lidt med savedialog og denne funktion og fået det næsten til at virke.

Der er bare det problem at man er nød til i savedialog at definerer filename som jeg har sat til backup, når jeg gemmer opretter den en mappe "backup" fint nok men næste gang jeg gemmer så opretter den igen en mappe"backup i mappen backup.

function CopyDir(const fromDir, toDir: string): Boolean;
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc  := FO_COPY;
    fFlags := FOF_FILESONLY;
    pFrom  := PChar(fromDir + #0);
    pTo    := PChar(toDir)
  end;
  Result := (0 = ShFileOperation(fos));
end;

//kalde function
if
savedialog1.Execute
then
CopyDir('c:\programmer\mitprogram\backup', Savedialog1.FileName);
Avatar billede Slettet bruger
07. december 2006 - 01:07 #20
giv lige et svar hrc...
Avatar billede hrc Mester
07. december 2006 - 10:24 #21
Hermed et svar. Fik du løst ovenstående problem?
Avatar billede Slettet bruger
07. december 2006 - 10:51 #22
har en funktion som tjekker om mappen allerede eksisterer - gør den det så skal filerne kun overskrives ellers skal backup mappen oprettes
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester