Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Nummer der Datei um 1 erhöhen (https://www.delphipraxis.net/174089-nummer-der-datei-um-1-erhoehen.html)

AnfängerDelphi 2. Apr 2013 21:24

Nummer der Datei um 1 erhöhen
 
Hallo an alle,

ich habe folgenden Quellcode geschrieben:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var x : Integer;
    datei : TextFile;
      pfad : String;

begin
  pfad := JvDirectoryEdit1.Directory;
  x := 1;
  AssignFile(datei, pfad +'\'+ 'datei'+ IntToStr(x) + '.txt');
    If not FileExists(pfad +'\'+ 'datei'+ IntToStr(x) + '.txt') then
      begin
       Rewrite(datei);
       CloseFile(datei);      
      end
     else
      x := x+1;
      AssignFile(datei, pfad +'\'+ 'datei'+ IntToStr(x) + '.txt');
      Rewrite(datei);
      CloseFile(datei);

end;
Wenn ich den Button das erste Mal anklicke,wird datei1 erstellt.
Nach dem zweiten Klick,wird datei2 erstellt und das wars dann auch.
Es soll immer eine Datei mit fortlaufender Nummer erstellt werden,aber vorher zuerst prüfen,ob Datei schon vorhanden ist.
Wie muß ich meinen Quellcode abändern,das bei jedem weiteren Klick weiter gezählt wird (datei3,datei4....usw)???


Mfg

AnfängerDelphi

Uwe Raabe 2. Apr 2013 21:35

AW: Nummer der Datei um 1 erhöhen
 
Zitat:

Zitat von AnfängerDelphi (Beitrag 1209748)
Wie muß ich meinen Quellcode abändern,das bei jedem weiteren Klick weiter gezählt wird (datei3,datei4....usw)???

Den else-Zweig in begin/end einschließen, eine Schleife einbauen, die nicht nach dem ersten Vergleich abbricht, ...

Überleg dir besser erst eine Strategie, schreibe sie als Kommentar auf und setze sie danach erst danach in Programmcode um. Dann kann man auch erkennen, was du vorhast - und du selbst kannst eventuell erkennen, was du falsch machst.

Dalai 2. Apr 2013 21:36

AW: Nummer der Datei um 1 erhöhen
 
Mit einer sauberen Einrückung des Codes (auch wenn ich diesbzgl. schon Schlimmeres gesehen habe) wäre dir aufgefallen, dass der else-Block mit einem
Delphi-Quellcode:
begin... end;
umschlossen werden muss.

Davon abgesehen kann das gewünschte Ziel dennoch nicht erreicht werden, denn dazu fehlt irgendeine Art von Schleife (
Delphi-Quellcode:
while
bietet sich hier an, aber
Delphi-Quellcode:
for
ist ebenfalls möglich).

MfG Dalai

hathor 3. Apr 2013 06:43

AW: Nummer der Datei um 1 erhöhen
 
Vor 5 Jahren habe ich für Screenshots das gleiche Problem gehabt und so gelöst:
Die Funktion GetNextFreeFileName ist selbsterklärend.
Die Procedure ist nur beispielhaft.
Das Ergebnis ist dann: 001.bmp, 002.bmp, 003.bmp ...

Delphi-Quellcode:
function GetNextFreeFileName(const FileName: string;
const sFormat: string = '%.3d'): string;
var i: integer;
    sPath, sExt: string;
begin
  sPath := IncludeTrailingBackslash(ExtractFilePath(FileName));
  sExt := ExtractFileExt(FileName);
  i := 0;
  repeat
    inc(i);
    Result := sPath + Format(sFormat,[i]) + sExt;
  until not FileExists(Result);
end;

procedure TForm1.ButtonClick(Sender: TObject);
var B : TBitmap;
begin
Image2.Picture.Bitmap := NIL;
Application.ProcessMessages;
  B := TBitmap.Create;
  try
    GetScreenShot(B);
    Image2.Picture.Assign(B);
  B.SaveToFile(GetNextFreeFileName(ExtractFilePath(Application.ExeName) + '001.bmp'));
  finally
    B.Free; //B.Destroy;
  end;
end;

Perlsau 3. Apr 2013 06:49

AW: Nummer der Datei um 1 erhöhen
 
Zitat:

Zitat von AnfängerDelphi (Beitrag 1209748)
Es soll immer eine Datei mit fortlaufender Nummer erstellt werden,aber vorher zuerst prüfen,ob Datei schon vorhanden ist.

Es gibt hier grundsätzlich zwei Vorgehensweisen:

1. Im entsprechenden Ordner die Datei mit der höchsten Nummer suchen

1a. Wie häufig wird die Datei geschrieben?
1b. Feste Anzahl vorangestellter Nullen erleichtert die Übersicht
1c. Dateiliste des Ordners holen und in Stringlist sortieren
1d. Nummerierung am Anfang des Dateinamens statt am Ende erleichtert das Extrahieren des Teilstrings, der die Nummer enthält
1e. Extrahieren des Dateinamens:
Delphi-Quellcode:
DateiName := ExtractFileName(Datei);
1f. Angenommen, du verwendest 10 Zeichen für die Nummer, dann erhältst du die Nummer so:
Delphi-Quellcode:
MeineNummer := StrToInt(Copy(DateiName,1,10));
Bist du nicht sicher, daß sich im kopierten Teilstring eine Zahl befindet, dann verwende SysUtils.TryStrToInt.
1g. Nummer in der Integer-Variablen MeineNummer um 1 erhöhen.
1h. Datei mit dem neuen Nummernwert schreiben.

2. Eine globale Integer- oder LongInt-Variable für die Nummerierung einsetzen

Diese Globale Variable MeineNummer setzt du anstatt des X in deiner Procedure ein und erhöhst sie bei jedem Procedure-Aufruf. Die erste Vorgehensweise ist jedoch sicherer, da du dich hierbei exakt an die physikalischen Gegebenheiten (durchnummerierte Dateien auf der Platte richtest). Sollte einmal ein Schreibvorgang schiefgehen oder abgebrochen werden, weist deine Nummerierung bei der zweiten Vorgehensweise u.U. Lücken auf.

Ansonsten: Grundlagen lernen. So wird z.B., wie bereits von Uwe erwähnt, der Befehle, x um eins zu erhöhen – kann man übrigens auch als Inc(x) schreiben – nach dem else zwar ausgeführt, wenn die Else-Bedingung zutrifft, die danach folgenden Befehle aber immer, da sie nicht mehr zum Else-Block gehören, was du jedoch eigentlich wolltest. Daher gehört alles, was nach Else ausgeführt werden soll, ebenso in Begin-End eingeschlossen wie alles, was nach dem Then ausgeführt werden soll.

Furtbichler 3. Apr 2013 07:12

AW: Nummer der Datei um 1 erhöhen
 
Zitat:

Zitat von Perlsau (Beitrag 1209765)
...kann man übrigens auch als Int(x) schreiben...

Ich glaube, Du meinst 'INC' statt 'INT'.:stupid:

Perlsau 3. Apr 2013 09:39

AW: Nummer der Datei um 1 erhöhen
 
Zitat:

Zitat von Furtbichler (Beitrag 1209766)
Zitat:

Zitat von Perlsau (Beitrag 1209765)
...kann man übrigens auch als Int(x) schreiben...

Ich glaube, Du meinst 'INC' statt 'INT'.:stupid:

Wo du recht hast ... mal wieder der galopierende Alzheimer ... Sagte ich nicht bereits, daß du nicht der einzige bist? :lol:
Danke, hab's korrigiert.

AnfängerDelphi 3. Apr 2013 17:56

AW: Nummer der Datei um 1 erhöhen
 
Hallo an alle,

erst mal vielen Dank für die vielen Informationen.
Das mit dem Lernen ist die eine Seite,das Gelernte dann noch richtig umzusetzen,die andere Seite.
Ich werde jetzt die guten Tips mal ausprobieren.

Mit einer while-Schleife habe ich es schon ausprobiert,funktioniert aber nicht so richtig.
Es soll beim anklicken des Buttons eine Datei erstellt werden,die dann um 1 erhöht wird.

Mfg

AnfängerDelphi

Helmi 3. Apr 2013 20:01

AW: Nummer der Datei um 1 erhöhen
 
Hallo,

das Problem an deinem Code ist die Variable
Delphi-Quellcode:
x : Integer;
.

Da diese zur Procedure ButtonClick gehört, also local ist, passiert folgendes:

x wird auf 1 geschrieben, "Datei1.txt" existiert nicht, also wird es erzeugt und die Procedure beendet
Somit entsteht "Datei1.txt".

Beim zweiten Klick ist x wieder 1. Es wird geprüft, ob "Datei1.txt" existiert. Da es nun diese aber gibt
wird die Zeile
Delphi-Quellcode:
x := x+1;
"aktiv", dadurch wird x = 2 und die Datei "Datei2.txt" erstellt.
Und das wars.

Du musst x in den Private-Abschnitt packen und x einmal auf 1 setzen, z. B. im OnCreate der Form.
Das setzen auf 1 im Button muss dann raus (das x in der Variablendefinition im Button ebenfalls)

EWeiss 3. Apr 2013 20:13

AW: Nummer der Datei um 1 erhöhen
 
Zitat:

Da diese zur Procedure ButtonClick gehört, also local ist
??

Ist das nicht eher umgekehrt? public = global ?
Sie gehört zur Procedure ButtonClick aber privat.
Public wäre doch wohl wenn Sie für alle Proceduren und Functionen der aktuellen
Unit deklariert wäre.

Privat hebt sie sich immer wieder auf und zwar mit jeden Aufruf von ButtonClick.
Davon ab sollte man Aussagefähige Namen verwenden anstelle von x.. DateiCounter.
x Public zu deklarieren wäre eine schlechte Idee da man privat x sehr häufig verwendet.

Möglich das ich jetzt aber auch was verdrehe.

gruss

Helmi 3. Apr 2013 20:17

AW: Nummer der Datei um 1 erhöhen
 
Das local war auf die Procedure ButtonClick bezogen.
Weiss grad ned wie man das in der Delphi-Welt nennt

(bin momentan Siemens SPS-versaut und da heissen die Dinger Lokal-Variablen)

Perlsau 3. Apr 2013 20:18

AW: Nummer der Datei um 1 erhöhen
 
Zitat:

Zitat von EWeiss (Beitrag 1209903)
Sie gehört zur Procedure ButtonClick aber privat.

Nein. Variablen innerhalb von Prozeduren und Funktionen nennt man lokale Variablen, Variablen außerhalb derselben globale. Private und Public legen lediglich fest, ob die global definierten Bezeichner nur für die jeweilige Unit oder eben auch für andere Units, welche die aktuelle Unit eingebunden haben, sichtbar sind.

EWeiss 3. Apr 2013 20:21

AW: Nummer der Datei um 1 erhöhen
 
Ok dann hab ich da wohl was verdreht. :)

Dann halt im privaten abschnitt der classe TForm1 deklarieren
Aber wie schon gesagt mit Aussagekräftigen Namen.

Edit:
Destotrotz vom rein logischen Denken wäre eine Private Variable eine
die nur für die einzelne procedure/Function verwendet werden kann.

Selbst wenn diese im bereich der jeweiligen Classe in dem Fall TForm1
privat deklariert wäre könnte ich auf diese zugreifen wenn ich mich in einer
Procedure/Function die von dieser Classe erbt befinde.
Dann wäre sie aber wieder für diese Classe Public da ich innerhalb der vererbten proceduren darauf zugreifen kann.


Kuddelmuddel meiner Meinung nach.
Privat ist für mich wenn ich nur in dieser einen procedure von außen(public/öffentlich) nicht zugreifen kann.

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  x : Integer;
Kann man auf diese Variable von irgendwoher zugreifen?
Abgesehen innerhalb dieser procedure.
Nein! Also nicht Public/öffentlich sondern Privat/Versteckt oder wie auch immer.
Lokal wäre dann das selbe wie Privat.

gruss

Furtbichler 4. Apr 2013 08:44

AW: Nummer der Datei um 1 erhöhen
 
Zitat:

Zitat von EWeiss (Beitrag 1209906)
...vom rein logischen Denken wäre eine private Variable eine die nur für die einzelne procedure/Function verwendet werden kann...
Privat ist für mich wenn ich nur in dieser einen procedure von außen(public/öffentlich) nicht zugreifen kann.

'private' bezieht sich auf die Sichtbarkeit innerhalb der Klasse.
'lokal' bezieht sich auf die Sichtbarkeit innerhalb einer Methode.

Du scheinst dich an der Nomenklatur (privat vs. lokal) zu stören. Das muss man einfach so hinnehmen, wie es ist. Es ist 'per definitionem' so. Die Schlüsselwörter könnten auch 'rot' und 'gestreift' heißen.

'protected', also geschützt, sind Variablen schließlich auch nicht wirklich, selbst wenn sie so deklariert sind.

Zitat:

Selbst wenn diese ... privat deklariert wäre könnte ich auf diese zugreifen wenn ich mich in einer
Procedure/Function die von dieser Classe erbt befinde.
Aber auch nur, wenn sich der Quelltext der abgeleiteten Klasse in der gleichen Unit befindet: Ja. Ansonsten musst Du sie als 'protected' deklarieren.

AnfängerDelphi 8. Jun 2013 22:01

AW: Nummer der Datei um 1 erhöhen
 
Hallo an alle,

ich habe jetzt meinen Urlaub hinter mir und melde mich zurück.

Meine Zählervariable (x) habe ich global deklariert und initialisiert,und ich muß sagen,es hat funktioniert.

Warum funktioniert es nur dann,wenn die Variable global deklariert ist....???



Mfg

AnfängerDelphi

Volker Z. 8. Jun 2013 23:44

AW: Nummer der Datei um 1 erhöhen
 
Hallo,

Zitat:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var x : Integer;
    datei : TextFile;
      pfad : String;

begin
  pfad := JvDirectoryEdit1.Directory;
  x := 1;
  AssignFile(datei, pfad +'\'+ 'datei'+ IntToStr(x) + '.txt');
    If not FileExists(pfad +'\'+ 'datei'+ IntToStr(x) + '.txt') then
      begin
       Rewrite(datei);
       CloseFile(datei);
      end
     else
      x := x+1;
      AssignFile(datei, pfad +'\'+ 'datei'+ IntToStr(x) + '.txt');
      Rewrite(datei);
      CloseFile(datei);

end;

Zitat:

Meine Zählervariable (x) habe ich global deklariert und initialisiert,und ich muß sagen,es hat funktioniert.
Nö, glaube ich nicht, dass das funktioniert
Delphi-Quellcode:
var
  x : Integer; // hier rein

procedure TForm1.Button3Click(Sender: TObject);
var // x : Integer; hier raus
    datei : TextFile;
      pfad : String;
begin
  pfad := JvDirectoryEdit1.Directory;
  x := 1;
  AssignFile(datei, pfad +'\'+ 'datei'+ IntToStr(x) + '.txt');
    If not FileExists(pfad +'\'+ 'datei'+ IntToStr(x) + '.txt') then
      begin
       Rewrite(datei);
       CloseFile(datei);
      end
     else
      x := x+1;
      AssignFile(datei, pfad +'\'+ 'datei'+ IntToStr(x) + '.txt');
      Rewrite(datei);
      CloseFile(datei);
end;
Starte Dein Programm, wähle einen Ordern, der noch vollkommen jungfräulich ist (zur Not anlegen) und klick zweimal auf den Button. Im gewählten Ordner sollten nun die Dateien:
Datei1.txt
Datei2.txt
liegen.
Öffne die "Datei2.txt" mit einem Texteditor (z. B. mit Notepad). Schreibe einen beliebigen Text (gerne: "Hallo Welt!") und schließe den Texteditor - speichern nicht vergessen. Starte Dein Programm und klick einmal auf den Button. Öffne die Datei "Datei2.txt" und wundere Dich nicht, wenn da nix mehr drin steht.

Zitat:

Warum funktioniert es nur dann,wenn die Variable global deklariert ist....???
Es funktioniert bestens, wenn die Zählvariable lokal (und bitte nur lokal) deklariert wird! Uwe Raabe und hathor habe Dir bereits alle notwendigen Hinweise und auch Code geliefert. Du kannst Deine Methode Button3Click auch so oder ähnlich ändern:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  datei : TextFile;
  pfad : string;
  s : string;
  x : Integer;
begin
  pfad := JvDirectoryEdit1.Directory;
  x := 1;
  repeat
    s := pfad + '\' + 'datei' + IntToStr (x) + '.txt';
    if not FileExists (s) then
      begin
        AssignFile (datei, s);
        Rewrite (datei);
        CloseFile (datei);
        Break
      end;

    Inc (x)
  until False
end;
Gruß

AnfängerDelphi 26. Jun 2013 19:28

AW: Nummer der Datei um 1 erhöhen
 
Hallo Volker,

Deine Aussagen sind natürlich korrekt.
Fehler von mir,ich meinte damit die nachfolgende Prozedur,bei der ich eine Variable global definiert habe,Sorry.
Vorher wurde nur der Letzte Wert aus meinem ListView in die Datei geschrieben,obwohl mehrere Einträge vorhanden waren.
Jetzt werden alle ListView-Einträge in die Datei übernommen.
Ist doch eine recht einfache Lösung,oder gibt es noch einen anderen Weg???


Delphi-Quellcode:
var vListe : Smallint=1;
   

procedure TForm1.Button5Click(Sender: TObject);
var i : Smallint;
    ze,sp1,sp2,sp3 : String;

begin // dies ist nur ein Auszug von dieser Prozedur
 
  for i := 0 to ListView1.Items.Count -1 do
     begin
     ze := ListView1.Items[i].Caption;
     sp1 := ListView1.Items[i].SubItems[0]
     sp2 := ListView1.Items[i].SubItems[1]
     sp3 := ListView1.Items[i].SubItems[2]
     inc(vListe);
     end;

end;

Mfg

AnfängerDelphi

Volker Z. 27. Jun 2013 01:23

AW: Nummer der Datei um 1 erhöhen
 
Hallo,
Zitat:

Ist doch eine recht einfache Lösung,oder gibt es noch einen anderen Weg???
Naja, eine Lösung kann ich jetzt eigentlich nicht erkennen (liegt wohl auch daran, dass ich - anhand der gegebenen Code-Fragmente - das Problem nicht wirklich sehe).
Einen anderen Weg gibt es vermutlich schon.
Und eine Lösung, die ohne globale Variable auskommt gibt es vermutlich - nö, da bin ich mir fast sicher - auch. Was spricht gegen:
Delphi-Quellcode:
//var vListe : Smallint=1; <-- da weg
procedure TForm1.Button5Click(Sender: TObject);
var
  vListe : Smallint; // <-- da hin
  i : Smallint;
  ze,sp1,sp2,sp3 : String;

begin // dies ist nur ein Auszug von dieser Prozedur
  vListe := 1;
  for i := 0 to ListView1.Items.Count -1 do
     begin
     ze := ListView1.Items[i].Caption;
     sp1 := ListView1.Items[i].SubItems[0]
     sp2 := ListView1.Items[i].SubItems[1]
     sp3 := ListView1.Items[i].SubItems[2]
     inc(vListe);
     end;
end;
Solange Du uns nur zusammenhangslose Code-Krümelchen zur Verfügung stellst, wird das nix werden mit dem Aufzeigen anderer Wege. Aber: Wenn Du bis November warten möchtest, dann ist die Wahrscheinlichkeit für noch dunklere, noch trübere und vorallem mit dickem, zähem Nebel verhangene Tage doch deutlich höher als es dies im Moment der Fall ist; dann wird es vermutlich auch ein günstiger Zeitpunkt sein, mit der langen Stange in der milchigen Brühe herumzustochern, um vielleicht das passende (Weg oder Lösung) herauszupicken.

Nix für ungut! :wink:

Gruß

AnfängerDelphi 1. Jul 2013 21:31

AW: Nummer der Datei um 1 erhöhen
 
Hallo Volker,

bis November werde ich nicht warten...8-)
Ich habe leider nicht so viel Zeit,um mich jeden Tag mit programmieren zu beschäftigen.
Bei mir läuft es wirklich nur nebenher.

Das ist die komplette Prozedur.Soweit funktioniert es auch.
Ich kann dir aber nicht sagen,wo der Fehler lag.

Delphi-Quellcode:

procedure TForm1.Button5Click(Sender: TObject);
var
  pfad, ze, sp1, sp2, sp3 : String;
  excel : OleVariant;
  vListe, i : Smallint;

begin

 pfad := Form1.JvDirectoryEdit1.Directory;

  try
    excel := CreateOleObject('Excel.Application');
   
     if FileExists(pfad + '\Datei1.xls') then
        begin
         excel.Workbooks.open(pfad + '\Datei1.xls');
         vListe := 1;

           for i := 0 to ListView1.Items.Count -1 do
              begin
               ze := ListView1.Items[i].Caption;
               sp1 := ListView1.Items[i].SubItems[0]
               sp2 := ListView1.Items[i].SubItems[1]
               sp3 := ListView1.Items[i].SubItems[2]
               inc(vListe);
               excel.Cells[vListe, 3] := sp1;
               excel.Cells[vListe, 4] := sp2;
               excel.Cells[vListe, 5] := sp3;
              end;

           excel.Visible:= true;
        end;

  finally
      excel := Unassigned;
  end;
 
end;
Aber trotzdem Danke für deine Hilfe.

Mfg

AnfängerDelphi

Sir Rufo 1. Jul 2013 22:15

AW: Nummer der Datei um 1 erhöhen
 
Ähm, worum ging es hier in diesem Thread nochmal?

Eine Datei mit Excel öffen und eine Variable (völlig sinnlos) inkrementieren?
(ok, evtl. eine Zeitschleife gegen Timingprobleme)
Was hat das mit "Nummer der Datei um 1 erhöhen" zu tun? :gruebel:

AnfängerDelphi 4. Jul 2013 17:40

AW: Nummer der Datei um 1 erhöhen
 
Hallo Sir Rufo,

richtig,meine Frage wurde schon beantwortet.
Ich habe nur die Prozedur vervollständigt,wie es gewünscht wurde.

Zitat:

(ok, evtl. eine Zeitschleife gegen Timingprobleme)
Also eine Zeitverzögerung einbauen und das inc(vListe); weglassen?
Sowas in dieser Art z.B.:

Delphi-Quellcode:
procedure pause(zeit:longint);
var zeit1:longint;
begin
  zeit1:=GetTickCount;
  repeat
        application.ProcessMessages;
  until (GetTickCount-zeit1 > zeit);
end;

Mfg

AnfängerDelphi


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz