Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dateien in einer Stringliste oder TMemo importieren? (https://www.delphipraxis.net/50526-dateien-einer-stringliste-oder-tmemo-importieren.html)

Thanatos81 27. Jul 2005 13:00

Re: Dateien in einer Stringliste oder TMemo importieren?
 
So lange du keine Schriftart benutzt, bei der alle Zeichen exakt die gleich Breite haben, wirst du das auch nicht hinbekommen. Muss es denn zwangsweise ein Memo sein?

smart 27. Jul 2005 13:04

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Zitat:

Zitat von Thanatos81
So lange du keine Schriftart benutzt, bei der alle Zeichen exakt die gleich Breite haben, wirst du das auch nicht hinbekommen. Muss es denn zwangsweise ein Memo sein?

Nein, Es kann auch eine Stringliste sein, nur das Format muss stimmen da es vom einem fremden Programm so verarbeitet wird.

Sharky 27. Jul 2005 13:06

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Zitat:

Zitat von Thanatos81
So lange du keine Schriftart benutzt, bei der alle Zeichen exakt die gleich Breite haben, wirst du das auch nicht hinbekommen.

Auch wenn ein StrigGrid oder TreeView auf jeden fall besser ist.
Man kann bei einem Memo ja auch einfach die TabStops (in Pixeln) setzen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  ndx : integer;
  TabArray : Array [0..4] of integer;
begin
  Memo1.WantTabs := True;
  for ndx := 0 to 4 do
  begin
   TabArray[ndx] := 30 * ndx;
  end;
  SendMessage(Memo1.Handle,EM_SETTABSTOPS,5,LongInt(@TabArray));
end;
[Edit]
Hier noch ein Beispiel wie man das ganze parsen könnte:
Delphi-Quellcode:
procedure TForm1.LadenClick(Sender: TObject);
var
  sl1: TStringList;
  sl2: TStringList;
  ndx1: integer;
  ndx2: integer;
begin
  sl1 := TStringList.Create;
  sl2 := TStringList.Create;
  try
    sl2.Delimiter := ';';
    sl1.LoadFromFile(Dateiname);
    for ndx1 := 0 to Pred (sl1.Count) do
    begin
      sl2.DelimitedText := sl1.Strings[ndx1];
      for ndx2 := 0 to Pred(sl2.Count) do
      begin
        MacheEtwasMitJederZeile (sl2.Strings[ndx2]);
      end;
    end;
  finally
    sl2.Free;
    sl1.Free;
  end;
end;
Es wird jede Zeile der Textdatei durchlaufen (SL1) dann wird jeder "Teil" (mit dem Trennzeichen ";") als eine Zeile in SL2 bereitgestellt.

Thanatos81 27. Jul 2005 13:24

Re: Dateien in einer Stringliste oder TMemo importieren?
 
OK, wie Sharky bewiesen hat, hätte ich schreiben sollen "wirst du das auch nicht schön hinbekommen." :wink:

Hab ich das richtig? Du liest Dateien ein, die mit ; getrennt sind und musst die so aufbereiten, dass sie statt dessen mit Tab getrennt sind, damit ein drittes Programm das verarbeiten kann?

Dann würde ich auf visuelle Kompos verzichten, und einfach nur ';' durch Tab ersetzen und dann das ganze wieder wegspeichern.

€dit, also ungefähr so:
Delphi-Quellcode:
procedure ersetze(input,output: TFileName);
var sl : TStringList;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile(input);
    sl.Text := StringReplace(sl.Text,';',#9,[rfReplaceAll]);
    sl.SaveToFile(output);
  finally
    FreeAndNil(sl);
  end;
end;

smart 27. Jul 2005 14:02

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Zitat:

Zitat von Thanatos81
OK, wie Sharky bewiesen hat, hätte ich schreiben sollen "wirst du das auch nicht schön hinbekommen." :wink:

Hab ich das richtig? Du liest Dateien ein, die mit ; getrennt sind und musst die so aufbereiten, dass sie statt dessen mit Tab getrennt sind, damit ein drittes Programm das verarbeiten kann?

Dann würde ich auf visuelle Kompos verzichten, und einfach nur ';' durch Tab ersetzen und dann das ganze wieder wegspeichern.

€dit, also ungefähr so:
Delphi-Quellcode:
procedure ersetze(input,output: TFileName);
var sl : TStringList;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile(input);
    sl.Text := StringReplace(sl.Text,';',#9,[rfReplaceAll]);
    sl.SaveToFile(output);
  finally
    FreeAndNil(sl);
  end;
end;

Auf die Idee bin ich auch schon bekommen, aber dann habe ich kein Format. Das Format sieht so aus:
Zeile 1, Stelle 0 bis 13 = Nummer, Stelle 14 bis 24 = Bezeichnung, Stelle 25 bis 32 = Preis. Das ganze, Zeile für Zeile.

Sharky 27. Jul 2005 14:12

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Hai Heike,

das "formatieren" dürfte kein Problem sein;-)

Hier mal eine veränderte Form meines obigen Codes:
Delphi-Quellcode:
function PadR(aValue : string; aLen : byte; aFill: char): string;
  //right pads a string with spaces
begin
  Result := aValue + StringOfChar(aFill, aLen - Length(aValue));
end;

procedure TForm1.LadenClick(Sender: TObject);
var
  sl1:   TStringList;
  sl2:   TStringList;
  ndx1:  integer;
  nummer: string;
  preis: string;
  bezeichung: string;
begin
  sl1 := TStringList.Create;
  sl2 := TStringList.Create;
  try
    sl2.Delimiter := ';';
    sl1.LoadFromFile(Dateiname);
    for ndx1 := 0 to Pred(sl1.Count) do
    begin
      sl2.DelimitedText := sl1.Strings[ndx1];
      nummer     := PadR(sl2.Strings[0], 13, ' ');
      bezeichnung := PadR(sl2.Strings[1], 10, ' ');
      Memo1.Lines.add(nummer + bezeichnung + preis);
    end;
  finally
    sl2.Free;
    sl1.Free;
  end;
end;
Edit: Fehler im Code beseitigt

smart 27. Jul 2005 14:20

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Zitat:

Zitat von Sharky
Hai Heike,

das "formatieren" dürfte kein Problem sein;-)

Hier mal eine veränderte Form meines obigen Codes:

Hallo Stepahn!

Vielen Dank für Deine Mühe. Da bekomme ich Fehlermeldungen:
Delphi-Quellcode:
[Fehler] Unit1.pas(32): Undefinierter Bezeichner: 'aValue'
[Fehler] Unit1.pas(32): Undefinierter Bezeichner: 'aLen'
[Fehler] Unit1.pas(32): Inkompatible Typen
[Fehler] Unit1.pas(38): Anweisung erwartet, aber 'VAR' gefunden
[Fehler] Unit1.pas(54): Undefinierter Bezeichner: 'PadR'
[Fehler] Unit1.pas(56): Operator oder Semikolon fehlt
[Fehler] Unit1.pas(63): '.' erwartet, aber ';' gefunden
[Hinweis] Unit1.pas(17): Das private-Symbol 'PadR' wurde deklariert, aber nie verwendet
[Fataler Fehler] Project2.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden

marabu 27. Jul 2005 14:32

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das von Heike beschriebene Eingabeformat lässt sich aufgrund einer Design-Schwäche in der Komponente TStringList nicht über DelimitedText verarbeiten. Leerzeichen werden als Delimiter behandelt - ich hatte schonmal darauf hingewiesen...

Grüße vom marabu

ste_ett 27. Jul 2005 14:57

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Warum arbeitest du nicht mit einem Tabulator(#9)? :gruebel:

Pro 8 Zeichen nimmst du einen Tabulator für Zeilen, die kürzer sind.

Nimm einfach den String bei den ';' auseinander und prüfe für alle Zeilen einmal die Länge.
Anhand des längsten Strings setzt du dann die Gesamtlänge für die "Spalte" fest.
Bei zu kurzen Strings mit Tabulator auffüllen.

Sharky 27. Jul 2005 15:00

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Zitat:

Zitat von smart
...Vielen Dank für Deine Mühe. Da bekomme ich Fehlermeldungen:

Ups... da habe ich mich beim tippen der Funktion vertippelt ;-)

Delphi-Quellcode:
function PadR(aValue: string; aLen: byte; aFill: char): string;
  //right pads a string with spaces
begin
  Result := aValue + StringOfChar(aFill, aLen - Length(aValue));
end;
@marabu: Mist. Das Blank in dem einen Text habe ich übersehen. Ich dachte es wäre keine da. Dann würde es nämlich gehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 Uhr.
Seite 2 von 3     12 3      

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