AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Nummer der Datei um 1 erhöhen
Thema durchsuchen
Ansicht
Themen-Optionen

Nummer der Datei um 1 erhöhen

Ein Thema von AnfängerDelphi · begonnen am 2. Apr 2013 · letzter Beitrag vom 4. Jul 2013
Antwort Antwort
Seite 1 von 3  1 23      
AnfängerDelphi

Registriert seit: 20. Mai 2010
25 Beiträge
 
#1

Nummer der Datei um 1 erhöhen

  Alt 2. Apr 2013, 22:24
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: Nummer der Datei um 1 erhöhen

  Alt 2. Apr 2013, 22:35
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#3

AW: Nummer der Datei um 1 erhöhen

  Alt 2. Apr 2013, 22:36
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 begin... end; umschlossen werden muss.

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

MfG Dalai
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#4

AW: Nummer der Datei um 1 erhöhen

  Alt 3. Apr 2013, 07:43
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;

Geändert von hathor ( 3. Apr 2013 um 07:49 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: Nummer der Datei um 1 erhöhen

  Alt 3. Apr 2013, 07:49
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: DateiName := ExtractFileName(Datei); 1f. Angenommen, du verwendest 10 Zeichen für die Nummer, dann erhältst du die Nummer so: 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.

Geändert von Perlsau ( 3. Apr 2013 um 10:37 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: Nummer der Datei um 1 erhöhen

  Alt 3. Apr 2013, 08:12
...kann man übrigens auch als Int(x) schreiben...
Ich glaube, Du meinst 'INC' statt 'INT'.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#7

AW: Nummer der Datei um 1 erhöhen

  Alt 3. Apr 2013, 10:39
...kann man übrigens auch als Int(x) schreiben...
Ich glaube, Du meinst 'INC' statt 'INT'.
Wo du recht hast ... mal wieder der galopierende Alzheimer ... Sagte ich nicht bereits, daß du nicht der einzige bist?
Danke, hab's korrigiert.
  Mit Zitat antworten Zitat
AnfängerDelphi

Registriert seit: 20. Mai 2010
25 Beiträge
 
#8

AW: Nummer der Datei um 1 erhöhen

  Alt 3. Apr 2013, 18:56
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

Geändert von AnfängerDelphi ( 3. Apr 2013 um 19:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#9

AW: Nummer der Datei um 1 erhöhen

  Alt 3. Apr 2013, 21:01
Hallo,

das Problem an deinem Code ist die Variable 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 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)
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Nummer der Datei um 1 erhöhen

  Alt 3. Apr 2013, 21:13
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 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