Autor Beitrag
thommy f
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows 2K pro
Delphi 5 Enterprise
BeitragVerfasst: Sa 23.07.05 15:53 
Habe aus einem eigentlich sehr guten Delphi-Buch ein paar Funktionen abgetippt, die ich in meinem Programm verwenden möchte. dennoch funktioniert irgendwas nicht.

Ziel:
Ich möchte beim Programmstart (Mache das über onCreate des Hauptformulars) aus dem aktuellen Datum das Jahr und das Monat ermitteln, anschließend kontrollieren, ob es in meinem Programmverzeichnis den Ordner

\Rechnungen\[Jahreszahl]\[Monat]\
schon gibt und diesen falls er nicht existiert anlegen.

Ich poste jetzt hier einfach mal meinen Source, vielleicht kann mir jemand sagen, warum er keinerlei Verzeichnisse anlegt?


Diese Funktion kontrolliert, ob ein Verzeichnis schon existiert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
    function DirExists(s: string): Boolean;
    var i : integer;
    begin
    i :=GetFileAttributes(PChar(s));
    Result := (i<> -1) and (FILE_ATTRIBUTE_DIRECTORY and i <> 0);
    end;



Diese Funktion ermöglicht das gleichzeitige Anlegen mehrerer Unterverzeichnisse:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
    function MkDirEx(bez: string): boolean;
    var
      verz : string;
      er : integer;
    begin
      if copy(bez,length(bez),1)<>'\' then
      begin
        bez := bez +'\';
      end;
      result := false;
      verz := copy(bez,1,2);
      delete(bez,1,3);
      while length(bez) > 0 do
      begin
        verz := verz + '\' + copy(bez,1,pos('\',bez)-1);
        delete(bez,1,pos('\',bez));
        {$i-}
          mkdir(verz);
        {$i+}
        case IOresult of
        0, 183 :
        begin
        end;
        else exit;
        end;
      end;
      result := true;
    end;



und in meinem OnFormCreate mach ich dann folgendes:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure TF_Haupt.FormCreate(Sender: TObject);
var
  x, y : integer;
  s_Directory : string;
begin
  Scaled := true;
  x := Screen.Width;
  y := Screen.Height;
  if (y <> ScreenHeightDev) or (x <> ScreenWidthDev) then
  begin
    F_Haupt.Height := (F_Haupt.ClientHeight * y div ScreenHeightDev) + F_Haupt.Height-F_Haupt.ClientHeight;
    F_Haupt.Width := (F_Haupt.ClientWidth * x div ScreenWidthDev) + F_Haupt.Height-F_Haupt.ClientHeight;
    ScaleBy (x, ScreenWidthDev);
  end;

  Datum := now;
  Monat := FormatDateTime('mmm',Datum);
  Jahr := FormatDateTime('yyyy',Datum);
  if not DirExists('Rechnungen\' + Jahr) then
  begin
    s_Directory := '\Rechungen\' + Jahr;
    MKDirEx(s_Directory);
  end;
  if not DirExists('\Rechnungen\' + Jahr +'\' + Monat) then
  begin
    s_Directory :='\Rechnungen\' + Jahr +'\' + Monat;
    MkDirEx(s_Directory);
  end;
end;


das müsste doch eigentlich funktionieren, oder?

Danke wiedermal für eure Hilfe!

_________________
Der Mensch wächst mit seinen Aufgaben *** Wer kämpft kann verlieren, wer nicht kämpft hat schon verloren
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 23.07.05 15:58 
Wieso so umständlich. Das letzte MkDirEx alleine reicht - wenn das Verzeichnis schon existiert wird es einfach belassen wie es ist ;). Also

user profile iconthommy f hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TF_Haupt.FormCreate(Sender: TObject);
var
  x, y : integer;
  s_Directory : string;
begin
  Scaled := true;
  x := Screen.Width;
  y := Screen.Height;
  if (y <> ScreenHeightDev) or (x <> ScreenWidthDev) then
  begin
    F_Haupt.Height := (F_Haupt.ClientHeight * y div ScreenHeightDev) + F_Haupt.Height-F_Haupt.ClientHeight;
    F_Haupt.Width := (F_Haupt.ClientWidth * x div ScreenWidthDev) + F_Haupt.Height-F_Haupt.ClientHeight;
    ScaleBy (x, ScreenWidthDev);
  end;

  Datum := now;
  Monat := FormatDateTime('mmm',Datum);
  Jahr := FormatDateTime('yyyy',Datum);
  s_Directory :='Rechnungen' + '\' + Jahr + '\' + Monat;
  MkDirEx(s_Directory);
end;


Ode? Btw. hast du die \ vergessen (markiert)

AXMD
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Sa 23.07.05 16:00 
gugg dir einfach mal Suche in: Delphi-Forum, Delphi-Library FORCEDRIECTORIES an, das legt automatisch die Verzeichnisse und alle benötigten unterverzeichnissen an, deine eigene Funktion benötigst du nicht.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Sa 23.07.05 16:07 
Benutze die Delphi Funktion ForceDirectories aus der Unit SysUtils oder die Win32 API Funktion Suche im MSDN MAKESUREDIRECTORYPATHEXISTS. MakeSureDirectoryPathExists ist in der Unit ImageHlp deklariert.

_________________
Ciao, Sprint.
thommy f Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows 2K pro
Delphi 5 Enterprise
BeitragVerfasst: Sa 23.07.05 16:08 
Habe den Source so übernomen, wie du Ihn gepostet hast. Das Verzeichnis wird aber beim Programmstart trotzdem nicht angelet. Starte mein Programm und beende es wieder. Auf meinem gesamten Rechner kann ich dennoch kein verzeichnis

\Rechnungen\2005\Jul\

finden und so müsste es ja eigentlich heißen, wenn ich keinen groben Denkfehler habe, oder?

_________________
Der Mensch wächst mit seinen Aufgaben *** Wer kämpft kann verlieren, wer nicht kämpft hat schon verloren
thommy f Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows 2K pro
Delphi 5 Enterprise
BeitragVerfasst: Sa 23.07.05 16:18 
Wo finde ich die Unit sysutils denn?

Mein Delphi (Delphi 5 Enterpries english) kennt diese Unit scheinbar nicht. :x

_________________
Der Mensch wächst mit seinen Aufgaben *** Wer kämpft kann verlieren, wer nicht kämpft hat schon verloren
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Sa 23.07.05 16:19 
ausblenden Delphi-Quelltext
1:
2:
uses
  ImageHlp;

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.FormCreate(Sender: TObject);
var
  Datum: TDateTime;
  Jahr, Monat: String;
  NeuerOrdner: String;
begin

  Datum := Now;
  Jahr := FormatDateTime('yyyy', Datum);
  Monat := FormatDateTime('mm', Datum);
  NeuerOrdner := IncludeTrailingBackslash(ExtractFilePath(ParamStr(0)));
  NeuerOrdner := NeuerOrdner + Jahr + '\' + Monat + '\';
  if not MakeSureDirectoryPathExists(PChar(NeuerOrdner)) then
    Application.MessageBox(PChar(SysErrorMessage(GetLastError)), nil, MB_OK or MB_ICONEXCLAMATION);

end;

_________________
Ciao, Sprint.
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Sa 23.07.05 16:21 
user profile iconthommy f hat folgendes geschrieben:
Wo finde ich die Unit sysutils denn?

Mein Delphi (Delphi 5 Enterpries english) kennt diese Unit scheinbar nicht. :x

Bei Delphi 5 befindet sich ForceDirectories noch in der Unit FileCtrl.

_________________
Ciao, Sprint.
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Sa 23.07.05 16:32 
@thommy f

Beschäftige dich nicht groß mit Funktionen aus Büchern. Die haben gelegentlich nur den Zweck zu zeigen wie man programmiert und gehen nicht unbedingt den einfachsten Weg. Gutes Beispiel ist DirectoryExists aus der Unit FileCtrl. Die Funktion gibt es bereits fertig. Auch das Anlegen von mehreren Ordnern mit ForceDirectories ist einfacher als selbst eine Funktion zu schreiben.

Tipp: ForceDirectories gibt es in zwei Varinaten. Die eine ist in FileCtrl und ist eine Prozedur. Seit Delphi 6 (oder früher) gibt es auch ForceDirectories als Funktion in der SysUtils. Hab leider gerade kein Delphi 6 installiert und kann somit nicht überprüfen ob es wirklich in der SysUtils ist, aber soweit ich mich erinnere ist das so. Die SysUtils gehört zu den Grund-Units, muß also nicht extra eingebunden werden. Der Unterschied zwischen den beiden ForceDirectories ist, das die neuere Version eine Funktion ist und eine Info zurückgibt ob alles geklappt hat.

_________________
Popov
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Sa 23.07.05 16:40 
Tipp an @Sprint und andere die es wissen wollen: ExtractFilePath liefert IMMER ein Pfadstring mit einem Backslash ("\") am Ende. Ein IncludeTrailingBackslash ist somit bei ExtractFilePath NIE nötig.

Anders sieht es mit ExtractFileDir aus. Der gibt IMMER den Pfad ohne das Backslash aus.

_________________
Popov
thommy f Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows 2K pro
Delphi 5 Enterprise
BeitragVerfasst: Sa 23.07.05 16:42 
Danke, ForceDirectories funzt einwandfrei!

_________________
Der Mensch wächst mit seinen Aufgaben *** Wer kämpft kann verlieren, wer nicht kämpft hat schon verloren