Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TStringlist wieder mit Trennzeichen speichern (https://www.delphipraxis.net/203164-tstringlist-wieder-mit-trennzeichen-speichern.html)

zaphood 19. Jan 2020 20:52

TStringlist wieder mit Trennzeichen speichern
 
Hallo Forum Gemeinde,
ich habe folgendes Problem das ich eine txt Datei mit Daten einlesen und verändern möchte. Die Datei ist mit Trennzeichen aufgebaut und muss auch wieder so gespeichert werden.
Momentan stehe ich auf dem Schlauch und glaube das TStringlist nicht dafür geeignet ist.

Gewünschtes Ziel ist:
String Eingang = 0193433020;2301000953;CNC-DB;3302060000;drehen01;300;;;;
String Ausgang = 2301000953;10;3302060000;1;1;;193433020;

Aufbau der Ausgabe was ich bisher geschafft habe:
2301000953 CR/LF
10 CR/LF
3302060000 CR/LF
1 CR/LF
1 CR/LF
; CR/LF
0193433020 CR/LF
;CR/LF
CR/LF
CR/LF
CR/LF
CR/LF

Das Umsortieren der Reihenfolge und hinzufügen von weiteren Daten hat geklappt aber leider mit Steuerzeichen und nicht wie gewünscht in einer Zeile.

Bitte um Tips ob ich mit TStringList das erreichen kann oder total falsch liege.
Danke und Gruß

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  sl : tstringlist;           //
begin
  sl := TStringList.Create;
  sl.Delimiter := ';';       //
  sl.DelimitedText := '0193433020;2301000953;CNC-DB;3302060000;drehen01;300;;;;';
  sl.delete(2);
  sl.delete(3);
  sl.Move(1,0);
  sl.insert(1,'10');
  sl.Move(3,2);
  sl.insert(3,'1');
  sl.insert(4,'1');
  sl.insert(5,' ');
  sl.SaveToFile('d:\SPC.dat');
  sl.Free;
end;

zaphood 21. Jan 2020 06:27

AW: TStringlist wieder mit Trennzeichen speichern
 
Das Problem ist gelöst, es wird alles in einer Zeile geschrieben und ohne Steuerzeichen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
  sl : tstringlist;
  s0, s1, s2, s3, s4, s5 : String;
  Datei   : TextFile;
  Filename : String;
  Datum   : String;

begin
  sl := TStringList.Create;
  sl.Delimiter := ';';       //
  sl.DelimitedText := '0193433020;2301000953;CNC-DB;3302060000;drehen01;300;';
  s0 := sl.Strings[0]; //1. Autragsnummer
  s1 := sl.Strings[1]; //2. Artikelnummer
  s2 := sl.Strings[2]; //3. Messtation
  s3 := sl.Strings[3]; //4. Kapazität
  s4 := sl.Strings[4]; //5. Prüfablauf
  s5 := sl.Strings[5]; //6. Anzahl Teile
  Datum   := FormatDateTime('yyyy_mm_dd__hh_mm_ss', Now);
  Filename := 'BDECN ' + Datum + '.dat';
  AssignFile(Datei, Filename);
  Rewrite(Datei);
  write(Datei, s1);
  write(Datei, ';');
  write(Datei, '10');
  write(Datei, ';');
  write(Datei, s3);
  write(Datei, ';');
  write(Datei, '1');
  write(Datei, ';');
  write(Datei, '1');
  write(Datei, ';');
  write(Datei, ';');
  write(Datei, s0);
  write(Datei, ';');
  CloseFile(Datei);
  sl.Free;
end;

mkinzler 21. Jan 2020 07:08

AW: TStringlist wieder mit Trennzeichen speichern
 
Da würde dann aber ein
Delphi-Quellcode:
WriteLn( sl.DelimitedText);
reichen

himitsu 21. Jan 2020 07:34

AW: TStringlist wieder mit Trennzeichen speichern
 
Und ein Ressourcenschutzblock, falls es beim Rewrite knallt, weil die Datei nicht geschrieben werden kann, und dann ein Speicherleck entsteht.

Ich weiß nicht ob es im FPC sowas gibt, aber warum sollte es sowas nicht geben.

In Delphi gibt es die IOUtils:
Delphi-Quellcode:
TFile.WriteAllText(Filename, SL.DelimitedText);

Und dann gibt es natürlich auch noch den TFileStream, welchen man ebenfalls gern benutzen darf.

zaphood 22. Jan 2020 06:37

AW: TStringlist wieder mit Trennzeichen speichern
 
Danke das jemand draufgeschaut hat und für die Tipps mit dem Ressourcenschutzblock usw. :) Das versuche ich noch einzubauen.
Jetzt knallt es tatsächlich und ich verstehe nicht warum.

Die Zeichenkette hatte ich für die ersten Testzwecke im Programm eingebaut
Delphi-Quellcode:
sl.DelimitedText := '0193433020;2301000953;CNC-DB;3302060000;drehen01;300;';


Nun möchte ich die Textdatei laden, welche exakt genauso aussieht und es kommt zu einem EStringListError - list index(1) out of bounds
Delphi-Quellcode:
sl.LoadFromFile('SPC.txt'); //Datei in Stringliste laden


Im Einzelschritt passiert es bei folgender Zeile.
Delphi-Quellcode:
Auftragsnummer := sl.Strings[0];


Mit ShowMessage(sl.DelimitedText) habe ich mir die Zeichenkette angesehen und mir ist aufgefallen, dass sie unterschiedlich aussieht.
0193433020;2301000953;CNC-DB;3302060000;drehen01;300; -> alles ok Zeichenkette im Programm
"0193433020;2301000953;CNC-DB;3302060000;drehen01;300;" -> mit LoadFromFile steht die Kette auf einmal in "...."


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  sl : tstringlist;
  Auftragsnummer, Artikelnummer, Messstation, Kapazitaet : String;
  Datei   : TextFile;
  Filename : String;
  Datum   : String;
  log     : String;

begin
  sl := TStringList.Create;
  sl.Delimiter := ';';
  sl.LoadFromFile('SPC.txt'); //Datei in Stringliste laden
  //sl.DelimitedText := '0193433020;2301000953;CNC-DB;3302060000;drehen01;300;';
  ShowMessage(sl.DelimitedText);
  Auftragsnummer := sl.Strings[0];
  Artikelnummer := sl.Strings[1];
  Messstation   := sl.Strings[2];
  Kapazitaet    := sl.Strings[3];
  ShowMessage(sl.DelimitedText);
  Datum   := FormatDateTime('yyyy_mm_dd__hh_mm_ss', Now);
  Filename := 'BDECN ' + Datum + '.dat';
  log := Datum+' '+sl.DelimitedText;
  if Messstation = 'RB' then
    begin
     Meldung.Caption := 'skip RB';
     logdatei(log);
    end
  else
    if Messstation = 'CNC-FB' then
    begin
     Meldung.Caption := 'skip CNC-FB';
     logdatei(log);
    end
  else
  begin
   Meldung.Caption := 'Datei ok';
   logdatei(log);
   AssignFile(Datei, Filename);
   Rewrite(Datei);
   write(Datei, Artikelnummer);
   write(Datei, ';');
   write(Datei, '10');
   write(Datei, ';');
   write(Datei, Kapazitaet);
   write(Datei, ';');
   write(Datei, '1');
   write(Datei, ';');
   write(Datei, '1');
   write(Datei, ';');
   write(Datei, ';');
   write(Datei, Auftragsnummer);
   write(Datei, ';');
   CloseFile(Datei);
   sl.Free;
  end;
end;
end.

Klaus01 22. Jan 2020 07:04

AW: TStringlist wieder mit Trennzeichen speichern
 
.. wenn Du die Datei mit loadFromFile in die StringList lädst
und Du anschliessend sl.delimitedText hast Du die ganze Datei dadrin ... ist dann der ganze Rest.

Was Du vielleicht möchtest ist die pro Zeile den delimited Text anschauen/bearbeite.
Dan musst Du pro TextZeile den Inhalt in eine andere StringList übergeben und diese dann verarbeiten.

Im Prinzip so:
Delphi-Quellcode:
for i:= 0 to sl.count -1 do
  begin
    slZeile := sl.create;
    try
      slZeile.delimitedText := sl[i];
      slZeile[0]...
      slZeile[1] ..
    finally
      slZeile.free;
    end;
  end;
Grüße
Klaus

Luckie 22. Jan 2020 08:01

AW: TStringlist wieder mit Trennzeichen speichern
 
Der Ressourcenschutzblock (try-finaly) fehlt aber immer noch.

Blup 22. Jan 2020 09:13

AW: TStringlist wieder mit Trennzeichen speichern
 
nicht getestet:
Delphi-Quellcode:
unit CSVHelper;

interface

uses
  Classes, SysUtils;

type
  TStringListCSVHelper = class helper for TStringList
  public
    procedure LoadFromCSVStream(Stream: TStream); overload; virtual;
    procedure LoadFromCSVStream(Stream: TStream; Encoding: TEncoding); overload; virtual;
    procedure LoadFromCSVFile(const FileName: string); overload; virtual;
    procedure LoadFromCSVFile(const FileName: string; Encoding: TEncoding); overload; virtual;
    procedure SaveToCSVStream(Stream: TStream); overload; virtual;
    procedure SaveToCSVStream(Stream: TStream; Encoding: TEncoding); overload; virtual;
    procedure SaveToCSVFile(const FileName: string); overload; virtual;
    procedure SaveToCSVFile(const FileName: string; Encoding: TEncoding); overload; virtual;
  end;

implementation

{TStringListCSVHelper]}

procedure TStringListCSVHelper.LoadFromCSVStream(Stream: TStream);
var
  Buffer: TBytes;
  Encoding: TEncoding;
begin
  Stream.ReadData(Buffer);
  TEncoding.GetBufferEncoding(Buffer, Encoding);
  DelimitedText := Encoding.GetString(Buffer);
end;

procedure TStringListCSVHelper.LoadFromCSVStream(Stream: TStream; Encoding: TEncoding);
var
  Buffer: TBytes;
begin
  Stream.ReadData(Buffer);
  DelimitedText := Encoding.GetString(Buffer);
end;

procedure TStringListCSVHelper.LoadFromCSVFile(const FileName: string);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName);
  try
    LoadFromCSVStream(Stream);
  finally
    Stream.Free;
  end;
end;

procedure TStringListCSVHelper.LoadFromCSVFile(const FileName: string; Encoding: TEncoding);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead);
  try
    LoadFromCSVStream(Stream, Encoding);
  finally
    Stream.Free;
  end;
end;

procedure TStringListCSVHelper.SaveToCSVStream(Stream: TStream);
begin
  SaveToCSVStream(Stream, Encoding);
end;

procedure TStringListCSVHelper.SaveToCSVStream(Stream: TStream; Encoding: TEncoding);
var
  Buffer: TBytes;
begin
  Buffer := Encoding.GetBytes(DelimitedText);
  Stream.WriteData(Buffer);
end;

procedure TStringListCSVHelper.SaveToCSVFile(const FileName: string);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenWrite);
  try
    SaveToCSVStream(Stream);
  finally
    Stream.Free;
  end;
end;

procedure TStringListCSVHelper.SaveToCSVFile(const FileName: string; Encoding: TEncoding);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenWrite);
  try
    SaveToCSVStream(Stream, Encoding);
  finally
    Stream.Free;
  end;
end;

end.
Delphi-Quellcode:
uses
  CSVHelper;
 
function BuildFilename(DateTime: TDateTime): string;
begin
  Result := 'BDECN ' + FormatDateTime('yyyy_mm_dd__hh_mm_ss', DateTime) + '.dat';
end;

procedure SaveData(MyCSV: TStringList);
begin
  MyCSV.Delimiter := ';';
  MyCSV.StrictDelimiter := True;
  MyCSV.SaveToCSVFile(BuildFilename(Now));
end;

procedure LoadData(MyCSV: TStringList);
begin
  MyCSV.Delimiter := ';';
  MyCSV.StrictDelimiter := True;
  MyCSV.LoadFromCSVFile(BuildFilename(Now));
end;

Luckie 22. Jan 2020 10:53

AW: TStringlist wieder mit Trennzeichen speichern
 
In wie fern löst das sein Problem?

einbeliebigername 22. Jan 2020 11:21

AW: TStringlist wieder mit Trennzeichen speichern
 
Hallo,

man kann das auch komplizierter machen als es ist.
Delphi-Quellcode:
program Dp203164Project1;
{$APPTYPE CONSOLE}
uses
  System.SysUtils,
  System.Classes;
var
  vSl: TStringList;
  vI: Integer;
begin
  vSl:= TStringList.Create;
  try
    vSl.LineBreak:= ';';
    vSl.LoadFromFile('Test1.txt');
    Writeln('vSl.Count: '+ vSl.Count.ToString);
    for vI:= 0 to vSl.Count- 1 do
      Writeln('vSl['+ vI.ToString+ ']: '+ vSl[vI]);
    vSl.delete(2);
    vSl.delete(3);
    vSl.Move(1,0);
    vSl.insert(1,'10');
    vSl.Move(3,2);
    vSl.insert(3,'1');
    vSl.insert(4,'1');
    vSl.insert(5,' ');
    vSl.SaveToFile('Test2.txt');
  finally
    vSl.Free;
  end;
  Readln;
end.
Mit dem Inhalt
Code:
0193433020;2301000953;CNC-DB;3302060000;drehen01;300;;;;
ohne Enter in Test1.txt gibt es die Ausgabe:
Code:
vSl.Count: 9
vSl[0]: 0193433020
vSl[1]: 2301000953
vSl[2]: CNC-DB
vSl[3]: 3302060000
vSl[4]: drehen01
vSl[5]: 300
vSl[6]:
vSl[7]:
vSl[8]:
und den Inhalt
Code:
2301000953;10;3302060000;1;1; ;0193433020;300;;;;
ohne Enter in Test2.txt. Noch nicht ganz was der TE will. Das liegt aber an:
Delphi-Quellcode:
    vSl.delete(2);
    vSl.delete(3);
    vSl.Move(1,0);
    vSl.insert(1,'10');
    vSl.Move(3,2);
    vSl.insert(3,'1');
    vSl.insert(4,'1');
    vSl.insert(5,' ');

zaphood 22. Jan 2020 12:53

AW: TStringlist wieder mit Trennzeichen speichern
 
@einbeliebigername:
bei Writeln('vSl.Count: '+ vSl.Count.ToString) steigt mein Lazarus aus mit einem Fehler.

@Klaus01:
Ja genau ich möchte gerne mit den einzelnen Zeilen arbeiten(z.B. Messstation := sl.Strings[2])
Damit ich die mit if abfragen kann und sehr leicht wieder zusammensetzen kann wie ich den String benötige.
Leider komme ich mit Deinem Tipp mit der zweiten Stringlist nicht weiter.
Bei der Zuweisung des Index0 mit slZeile[0]... hänge ich.

Luckie 22. Jan 2020 13:16

AW: TStringlist wieder mit Trennzeichen speichern
 
Zitat:

Zitat von zaphood (Beitrag 1455767)
@einbeliebigername:
bei Writeln('vSl.Count: '+ vSl.Count.ToString) steigt mein Lazarus aus mit einem Fehler.

Und welchem? :roll:

Klaus01 22. Jan 2020 13:22

AW: TStringlist wieder mit Trennzeichen speichern
 
was meinst Du mit hängt?

Mit der Routine bekomme ich alle Spalteneinträge im Memo angezeigt.

Delphi-Quellcode:
var
  sl: TStringList;
  slZeile: TStringList;
  zeile,spalte: Integer;
begin
 sl := TStringList.Create;
 try
   sl.LoadFromFile('e:\test.txt');
   for zeile:=0 to sl.Count -1 do
     begin
       slZeile := TStringList.Create;
       try
         slZeile.Delimiter := ';';
         slZeile.DelimitedText := sl[zeile];
         for spalte := 0 to slZeile.Count -1 do
           if slZeile[spalte] = '' then
             memo1.Lines.Add('----')
           else
             memo1.Lines.Add(slZeile[spalte]);
       finally
         slZeile.Free;
       end;
     end;
 finally
   sl.Free;
 end;
end;
Im Memo steht dann:
Code:
0193433020
2301000953
CNC-DB
3302060000
drehen01
300
----
----
----
----
Die Datei besteht aus der Zeile:
Code:
0193433020;2301000953;CNC-DB;3302060000;drehen01;300;;;;
Grüße
Klaus

zaphood 22. Jan 2020 13:47

AW: TStringlist wieder mit Trennzeichen speichern
 
Danke Klaus das sieht sehr gut aus und wird heute Abend eingebaut. :-)

Es wird dann noch eine dritte Stringlist gebaut.
1.SL zum laden der txt Datei
2.SL zum Erstellen der Index[0...x] Möglichkeit
3.SL zum Erstellen der richtigen Reihenfolge und späteren speichern als txt Datei

Schöne Grüße

zaphood 22. Jan 2020 16:09

AW: TStringlist wieder mit Trennzeichen speichern
 
Das mit der dritten Stinglist war Quatsch von mir, da ja aus der zweiten indexfähigen Stinglist die Textdatei gebaut wird. Vielen Dank nochmal, es klappt prima.:-D

Das Tool soll eine Schnittstelle zwischen einem ERP und CAQ System realisieren. Wenn ein CNC Bediener einen neuen Auftrag beginnt wird ein Barcode gescannt um dann diese SPC Datei mit Infos über Auftragsnummer, Artikelnummer usw. erzeugen. Das CAQ System importiert diese Daten und erzeugt einen Prüfauftrag auf einem Messrechner mit angeschlossenen Messmitteln um die Teile zu vermessen und überprüfen. Das alte CAQ System wird abgelöst und das neue braucht die Daten in einer anderen definierten Reihenfolge und mit zusätzlichen Werten. Dies wird tatsächlich teilweise immer noch mit kleinen Textfiles realisiert.

Eigentlich bin ich Instandhalter/IT'ler und pflege nur den ERP/CAQ Server und repariere die CNC-Maschinen aber mich hat das Thema interessiert, da ich in meiner Technikerausbildung vor 15 Jahren mal mit Delphi programmiert habe. Leider bin ich wie beim Arduino/ESP eher der Codebettler- und klauer.
Das Tool schreibe ich in meiner Freizeit und bekomme keine Entlohnung dafür und ein Verbesserungswesen gibt es auch nicht. Ich sehe es als Hobby an wie Sodoku um nicht einzurosten und vielleicht hilft es ja mal jemand anderen der ein ähnliches Problem mit txt Schnittstellen hat.


Die nächste Hürde für heute Abend wird das Laden der realen Datei werden. Es soll ein Verzeichnis überwacht werden wo Dateien sporadisch ankommen welche einen Zähler im Dateinamen beinhalten. Also immer unterschiedlich heissen.
SPC0001.txt
SPC0002.txt
SPC0003.txt
Nach dem Bearbeiten wird die Quell-Datei gelöscht und die veränderte Ziel-Datei woanders geschrieben. Versuchen werde ich es mit FindFirst und FindNext bis das Verzeichnis leer ist.
Da es nicht zeitkritisch ist dachte ich an alle 2 Minuten für die Überprüfung ob was da ist.

Delphi-Quellcode:
procedure logdatei(Uebergabe: String);
var
  f   : TextFile;
begin
  AssignFile(f, 'SPC.log'); //SPC.log muss vorhanden sein vor dem ersten Start quick and dirty
  Append(f);
  writeln(f, Uebergabe);
  CloseFile(f);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  sl,slZeile : tstringlist;
  zeile     : Integer;
  Auftragsnummer, Artikelnummer, Messstation, Kapazitaet : String;
  Datei   : TextFile;
  Filename : String;
  Datum   : String;
  log     : String;

begin
  sl := TStringList.Create;
    try
      sl.LoadFromFile('SPC.txt');
      for zeile:=0 to sl.Count -1 do
        begin
          slZeile := TStringList.Create;
          try
            slZeile.Delimiter := ';';
            slZeile.DelimitedText := sl[zeile];
            Auftragsnummer := slZeile.Strings[0];
            Artikelnummer := slZeile.Strings[1];
            Messstation   := slZeile.Strings[2];
            Kapazitaet    := slZeile.Strings[3];
          finally
            Datum   := FormatDateTime('yyyy_mm_dd__hh_mm_ss', Now);
            Filename := 'bdecn.' + Datum + '.dat';
            log := Datum+' '+slZeile.DelimitedText;
            if Messstation = 'RB' then
                begin
                 Meldung.Caption := 'skip RB';//zu Testzweck später löschen
                 logdatei(log);
                end
            else
              if Messstation = 'CNC-FB' then
                 begin
                  Meldung.Caption := 'skip CNC-FB';//zu Testzweck später löschen
                  logdatei(log);
                 end
            else
              begin
               Meldung.Caption := 'Datei ok';//zu Testzweck später löschen
               logdatei(log);
               AssignFile(Datei, Filename);
               Rewrite(Datei);
               write(Datei, Artikelnummer);
               write(Datei, ';');
               write(Datei, '10');
               write(Datei, ';');
               write(Datei, Kapazitaet);
               write(Datei, ';');
               write(Datei, '1');
               write(Datei, ';');
               write(Datei, '1');
               write(Datei, ';');
               write(Datei, ';');
               write(Datei, Auftragsnummer);
               write(Datei, ';');
               CloseFile(Datei);
               slZeile.Free;
             end;
          end;
       end;
    finally
      sl.Free;
  end;
 end;

himitsu 22. Jan 2020 17:34

AW: TStringlist wieder mit Trennzeichen speichern
 
Diese vielen WRITE lassen kaum erkennen was wo steht.
Wie wäre es, wenn man eine Zeile im Code mit einer Spalte in der Datei gleichsetzt? :zwinker:
Delphi-Quellcode:
write(Datei, Artikelnummer, ';');
write(Datei, '10', ';');
write(Datei, Kapazitaet, ';');
write(Datei, '1', ';');
write(Datei, '1', ';');
write(Datei, '', ';');
write(Datei, Auftragsnummer, ';');
write(Datei, '');
Aber da dieser Code wohl eh bald gelöscht wird ... naja.

PS: Delphi-Referenz durchsuchenTFile.WriteAllLines
Delphi-Quellcode:
// schade dass hier dieses blöde TStringDynArray als Parameter verwendet wird
//uses IOUtils; // im Delphi, aber FPC hat bestimmt auch irgendwo sowas
TFile.WriteAllLines(Filename, [Artikelnummer, ';', '10', ';', Kapazitaet,
  ';', '1', ';', '1', ';', ';', Auftragsnummer, ';']);

// aber niemand verbietet dir, dass du dir selbst eine Hilfsfunktion schreibst ;)
//procedure WriteToCSV(Filename: string; Columns: array of const);
WriteToCSV(Filename, [Artikelnummer, 10, Kapazitaet, 1, 1, '', Auftragsnummer]);



"slZeile" und "Datei" haben auch noch kein Finally.

PS: man kann auch verschachteltn.
Delphi-Quellcode:
A := TXyz.Create;
try
  B := TXyz.Create;
  try
    ...
  finally
    B.Free;
  end;
finally
  A.Free;
end;
Delphi-Quellcode:
A := TXyz.Create;
B := TXyz.Create; // wenn es im Cnstructor nicht knallen kann
try
  ...
finally
  B.Free; // natürlich nur, wenn das Free hier auch nie knallen wird
  A.Free;
end;
Delphi-Quellcode:
B := nil;
A := TXyz.Create;
try
  B := TXyz.Create;
  ...
  //FreeAndNil(B); // wenn erwünscht, ABER kein B.Free; hier drin
  ...
finally
  B.Free;
  A.Free;
end;

Luckie 22. Jan 2020 21:14

AW: TStringlist wieder mit Trennzeichen speichern
 
Für ein neues Problem erstelle bitte auch einen neuen Thread.

zaphood 23. Jan 2020 05:22

AW: TStringlist wieder mit Trennzeichen speichern
 
Danke für die Delphi Tips mit
Delphi-Quellcode:
TFile.WriteAllText
und
Delphi-Quellcode:
TFile.WriteAllLines
. Das ist natürlich sehr übersichtlich im code und mal gar nicht fehleranfällig. :-) Für Lazarus habe ich das noch nicht gefunden.
Die Delphi 10.3 habe ich auch hier und kann das testen. Weil ein Lazarus begeisteter Kollege mit Linux mitprogrammiert bin ich erst einmal dort gelandet.

Die try/finally Mechanismen habe ich noch nicht so auf dem Schirm. Aber kommen noch reinn wo sie hingehören.
Zitat:

Aber da dieser Code wohl eh bald gelöscht wird ... naja.
@himitsu: Wie meinst Du das?

@Luckie: Ja, das werde ich machen.

Luckie 23. Jan 2020 07:40

AW: TStringlist wieder mit Trennzeichen speichern
 
Vor dem Create ein try und vor dem Free das finally. Was gibt es da auf dem Schirm zu haben? :?

p80286 23. Jan 2020 08:58

AW: TStringlist wieder mit Trennzeichen speichern
 
Zitat:

Zitat von Luckie (Beitrag 1455815)
Vor dem Create ein des und vor dem Free das finally. Was gibt es da auf dem Schirm zu haben? :?

Er hat noch keine Ahnung wofür Try..Finally gut ist, und was noch unangenehmer ist, er hat noch keine Ahnung wieviel Aufwand getrieben werden muß um mögliche Fehler zu behandeln.

Gruß
K-H

himitsu 23. Jan 2020 11:20

AW: TStringlist wieder mit Trennzeichen speichern
 
Upps, hatte auf die Schnelle nur einmal dieses
Delphi-Quellcode:
//zu Testzweck später löschen
gesehen und es auf den ganzen ELSE-Block bezogen, anstatt nur auf die Debugging-Label-Ausgabe :oops:

zaphood 23. Jan 2020 11:25

AW: TStringlist wieder mit Trennzeichen speichern
 
Doch ich habe mir das Try..Finally angelesen nur wann ich es einsetzen kann/muss ist noch nicht ganz klar.
Bis jetzt habe ich durch Euch gelernt das es bei:
1. Stinglist
2. Dateioperationen
angewendet wird.

@himitsu: ok und ich dachte mein Thema wird hier bald gelöscht:-D

himitsu 23. Jan 2020 11:48

AW: TStringlist wieder mit Trennzeichen speichern
 
Try-Except, wenn du selbst Fehler behandeln willst, bzw. bei gewissen Fehlern anders reagieren möchtest.
z.B. abhängig von Exception-Klasse oder Fehlertext/Fehlercode nur bei bestimmten Fehlern etwas soundso machen und sonst anders.

Try-Finally: wenn du Klassen erstellst, Speicher reservierst oder sonstwas machst, was sich am Ende nicht "selbstständig" aufräumt.
Delphi-Quellcode:
C := TIrgendwas.Create;
...
// hier eine Exception/Fehler und schon wird Free nicht aufgerufen und du hast ein Speicherleck
...
C.Free;
Delphi-Quellcode:
C := TIrgendwas.Create;
try
  ...
finally
  C.Free; // egal was im ... passiert, das Free wird immer ausgeführt
end;
Nja, wie schon genannt wurde, wenn du es deteilierter wissen möchtest, dann neuer Thread oder eines der vielen Tutorials suchen :)

TurboMagic 23. Jan 2020 18:43

AW: TStringlist wieder mit Trennzeichen speichern
 
Für die Änderungsüberwachung des Verzeichnisses gibt es auch ein API in Windows. Habe nur den Namen vergessen... Dann wird man nämlich informiert statt per Timer zu Pollen.

Luckie 23. Jan 2020 19:12

AW: TStringlist wieder mit Trennzeichen speichern
 
Lass ihn dazu bitte einen neuen Thread aufmachen, sonst geht es hier drunter und drüber.

zaphood 27. Jan 2020 04:53

AW: TStringlist wieder mit Trennzeichen speichern
 
Der code ist ein wenig kleiner geworden:)

Aus
Delphi-Quellcode:
write(Datei, Artikelnummer, ';');
write(Datei, '10', ';');
write(Datei, Kapazitaet, ';');
write(Datei, '1', ';');
write(Datei, '1', ';');
write(Datei, '', ';');
write(Datei, Auftragsnummer, ';');
write(Datei, '');
wurde
Delphi-Quellcode:
write(Datei, Artikelnummer+';'+'10'+';'+Kapazitaet+';'+'1'+';'+'1'+';'+';'+Auftragsnummer+';');

hoika 27. Jan 2020 05:03

AW: TStringlist wieder mit Trennzeichen speichern
 
Hallo,
und damit viel unübersichtlicher ...


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