Entwickler-Ecke

Dateizugriff - 1 Textdatei laden auf splitten in 3 Listboxen


F.Art - Do 09.01.03 01:21
Titel: 1 Textdatei laden auf splitten in 3 Listboxen
Wie macht man das eine Textdatei geladen wird und dann sortiert in drei Listboxen aufgeteilt wird.

Die Textdatei soll wie folgt aussehen.

Namen:
Mike
Dirk
Udo

Nachnahmen:
Müller
Schuster
Schmidt

Email Adresse:
1@xy.net
2@xy.net
3@xy.net


Und beim Laden sollen die jeweils richtig ein geordnet werden.


Keldorn - Do 09.01.03 08:14

Hallo

du kannst entweder die Datei mit reset öffnen oder du nimmst eine extra Stringliste und lädst die Datei mit loadfromfile ein. anschließend gehst du die items einzeln durch und fügst sie zu jeweiligen listbox zu.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  sl:=Tstringlist.create;
  sl.loadfromfile('blablabla')
  for i:=0 to sl.count-1 do
    begin
       if sl.items[i]='Namen:' then Mode:=0
        else if sl.items[i]='Nachnahmen:' then Mode:=1
         else if sl.items[i]='EMail Adresse:' then Mode:=2
          else
         begin
            case mode of
              0: Listbox1.items.add(sl.items[i]);
              1: Listbox2.items.add(sl.items[i]);
              2: Listbox3.items.add(sl.items[i]);
         end;              
    end;
  sl.free;

ungetestet aus dem Kalten, vielleicht noch n try-finally einbauen

Mfg Frank


F.Art - Do 09.01.03 13:42

Es läuft so nicht ganz und bekomme es nich alleine gängig.


smiegel - Do 09.01.03 13:53

Hallo,

kannst Du mal so eine Text-Datei genauer beschreiben. Was spricht dagegen, die Infos in der Form

Name;Vorname;Mail
Mike;Müller;1@xy.net

zu speichern?
Warum 3 Listboxen? Geht das nicht in einer Listview?


F.Art - Do 09.01.03 15:06

1. Die Liste sollte sortiert sein damit andere ganz einfach sie erweitern können.
2. Es sind schleifen drin die auf einzelne listboxen zugreifen und ich kann das nich in eine setzen.


Keldorn - Do 09.01.03 15:41

F.Art hat folgendes geschrieben:
Es läuft so nicht ganz und bekomme es nich alleine gängig.

was läuft nicht?

F.Art hat folgendes geschrieben:

1. Die Liste sollte sortiert sein damit andere ganz einfach sie erweitern können.

hängen die daten nicht zusammen? , wenn du 3LB´s hast, verlierst du die Zuordnung

Mfg Frank


Delete - Do 09.01.03 16:52

Keldorn hat folgendes geschrieben:

hängen die daten nicht zusammen? , wenn du 3LB´s hast, verlierst du die Zuordnung

Nicht mit viel Aufwand und krampfhaften Code. Man kann sich viel Arbeit ersparen, wenn man für den richtigen Zweck, das richtige Steuerelement nimmt.


F.Art - Do 09.01.03 17:52

Ich möchte die aufstellung der textdatei so haben damit andere ganz bequem was per texteditor hinzufügen können.ich möchte mir nicht die arbeit machen das ins prog einzubinden das man von dort aus speichern kann.ausserdem möchte ich auch selbst wissen wie man das mit meiner idee hin bekommt.


Keldorn - Do 09.01.03 18:13

smiegel hat folgendes geschrieben:
Hallo,
Was spricht dagegen, die Infos in der Form

Name;Vorname;Mail
Mike;Müller;1@xy.net


Zitat:

Ich möchte die aufstellung der textdatei so haben damit andere ganz bequem was per texteditor hinzufügen können

daten in so einem Format kannst du äußerst bequem im Excel in übersichtlicher Tabllenform erstellen und(anschließend z.B. als Text-datei Tabsgetrennt) speichern
Was das Trennzeichen Tab oder Semikolon ist, ist dabei egal, kannst deinen Code flexeibel gestalten. Du ließt einen String ein, suchst ein trennezeichen (Pos) und kopierst die TeilStrings (copy) und füllst die Listboxen oder halt gleich ein Listview.

was läuft denn nu nicht?

Frank


F.Art - Do 09.01.03 19:17


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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    ListBox2: TListBox;
    ListBox3: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i : word;
sl : Tstringlist;
begin
sl:=Tstringlist.create;
  sl.loadfromfile('test.txt');
  for i:=0 to sl.count-1 do
    begin 
       if sl.items[i]='Namen:' then Mode:=0 
        else if sl.items[i]='Nachnahmen:' then Mode:=1 
         else if sl.items[i]='EMail Adresse:' then Mode:=2 
          else 
         begin 
            case mode of 
              0: Listbox1.items.add(sl.items[i]); 
              1: Listbox2.items.add(sl.items[i]); 
              2: Listbox3.items.add(sl.items[i]); 
         end;              
    end; 
  sl.free; 

end;

end.

Der Fehler kommt
Zitat:
Undeclared identifier: 'items'
Undeclared identifier: 'Mode'


(10.01. 09:11 Tino) Code- & Quote-Tags hinzugefügt.


Keldorn - Fr 10.01.03 08:33

Hallo,

mode mußt du noch als word, integer deklarieren

das kommt davon, wenn man was direkt ins Forum schreibt
sl.strings[] :oops:

mfg Frank


smiegel - Fr 10.01.03 09:30

Hallo,

folgend ein Beispiel, wie es gehen könnte, wenn Du das von mir vorgeschlagene Verfahren benutzt:

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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
type
  TAdressen:array[0..2] of String;

function Zerlege(aStr:String; aTrenner:Char):TAdressen;
var i:Integer;
begin
  i:=System.Pos(aTrenner, aStr);
  if (i>0) then
  begin
    Result[0]:=System.Copy(aStr, 1, i-1);
    Delete(s, 1, i);
  end;
  i:=System.Pos(aTrenner, aStr);
  if (i>0) then
  begin
    Result[1]:=System.Copy(aStr, 1, i-1);
    Delete(s, 1, i);
  end;
  Result[2]:=aStr;
end; // Zerlege

procedure TForm1.Button1Click(Sender: TObject); 
var i  :Integer; 
      sl :TStringList; 
      adr:TAdressen;
begin 
  sl:=TStringList.Create;
  try
    sl.loadfromfile('test.txt'); 
    for i:=0 to sl.count-1 do
    begin
      adr:=Zerlege(sl.Strings[i], ';');
      Listbox1.items.add(adr[0]); 
      Listbox2.items.add(adr[1]); 
      Listbox3.items.add(adr[2]); 
    end; // for i
  finally
    sl.Free;
  end; // try
end;


F.Art - Fr 10.01.03 13:16

@ Smiegel
bei dir kommt da ein Fehler TAdressen:array[0..2] of String;

Und bei dem anderen Source kommt Undeclared identifier: 'items'


Keldorn - Fr 10.01.03 14:14

nobody is perfect.

aber ein wenig mitdenken ist nicht zu viel verlangt?. Du kannst nicht verlangen, daß du hier im Forum eine 100% zu dir passende und funktionierende Lösung bekommst. Alle Problem ließen sich mit einem Blick auf die Fehlermeldung/Onlinehilfe lösen.

items:
ein Blick in die OH würde dir reichen, um zu erkennen, daß ich mich von Listbox hab leiten lassen und die strings nicht mit items wie in der Listbox sondern sl.strings[index] angesprochen werden. War halt direkt ins Forum geklimpert - mein Fehler

array Fehler:
der Compiler wird meckern und dir sagen
Zitat:

[Fehler] Unit2.pas(20): '=' erwartet, aber ':' gefunden

also statt : ein = mal probieren ?


Mfg Frank


smiegel - Fr 10.01.03 16:37

Hallo,

@Kehldorn: Danke für die Korrektur meines Tippfehlers.


F.Art - Sa 11.01.03 13:22

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
ListBox1: TListBox;
ListBox2: TListBox;
ListBox3: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i : word;
Mode : word;
sl : Tstringlist;
begin
sl:=Tstringlist.create;
sl.loadfromfile('test.txt');
for i:=0 to sl.count-1 do
begin
if sl.strings[i]='Namen:' then Mode:=0
else if sl.strings[i]='Nachnahmen:' then Mode:=1
else if sl.strings[i]='EMail Adresse:' then Mode:=2
else
begin
case mode of
0: Listbox1.items.add(sl.strings[i]);
1: Listbox2.items.add(sl.strings[i]);
2: Listbox3.items.add(sl.strings[i]);
end;
end;
sl.free;

end;
end;
end.




Wenn ich dann die EXE starte und den Button klicke kommt
Acces violation at adress 00000000. Read of adress 0000000.
und die erste listbox wird nur Name: eingetragen.


wulfskin - Sa 11.01.03 13:53

Hallo F.Art!

Kann es sein das bei dir die Datei "test.txt" nicht existiert?

Gruß Hape!


F.Art - Sa 11.01.03 14:11

doch die ist da


smiegel - Sa 11.01.03 15:02

Hallo,

es kann schon sein, dass die Datei da ist. Aber weiss Dein Programm, wo sich die Datei befindet?

Mit

Quelltext
1:
2:
3:
4:
5:
6:
if FileExists('test.txt') then 
begin
  sl.loadfromfile('test.txt');
  ...
  ...
end else ShowMessage('Datei nicht gefunden');

kannst Du feststellen, ob die Datei auch wirklich geladen wird.


wulfskin - Sa 11.01.03 15:39

Hallo F.Art!

Mir fällt gerade kein fehler mehr auf! Sinnvoll wäre es jedoch am Anfang Mode auf -1 zu setzen, damit leere Zeilen am Anfang ignoriert werden!

Zum Fehler: Am besten du setzt mal eine Haltepunkt an den Anfang dieser Prozedur und führst danach die einzelnen Befehle mit F8 einzeln aus!

Gruß Hape!


F.Art - Sa 11.01.03 17:09

@ Smiegel
Ich habe deine Idee eingebaut und die Datei wird gefunden.

@Wulfskin
Ich verstehe nicht wie du das mit Mode meinst.

ICh habe leider nicht soviel Ahnung von Delphi deswegen tuh ich mich schwer damit.


wulfskin - Sa 11.01.03 17:31

Hallo F.Art!

Da du Mode nicht initalisierst (also keinen Startwert zuweist), macht das Delphi (glaub ich) automatisch mit 0. So, wenn jetzt die erste Zeile leer ist, dann trifft die Else-Bedinung zu und es wird, da Mode = 0 ist, die Zeile hinzugefügt!

Gruß Hape!


Keldorn - Sa 11.01.03 19:48

Hallo,
der Fehler liegt woanders
da ist in meinem Source noch n kleiner Fehler drin:
bei case hat das end gefehlt. passiert halt,wenn man was direkt ins Forum klimpert. das End hast du zwar hinzugefügt, leider aber an der falschen Stelle

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
         begin
            case mode of
              0: Listbox1.items.add(sl.items[i]);
              1: Listbox2.items.add(sl.items[i]);
              2: Listbox3.items.add(sl.items[i]);
             end;  //hat hier gefehlt :oops: 
         end;             
    end;
  sl.free;
end;

So wie du das end; hinzugefügt hast, steht das sl.free in der for Schleife. damit gibts du am Ende des ersten Durchlaufes die Stringliste wieder frei und dann scheitert natürlich der nächste Aufruf mit sl.strings[i] da nix mehr da ist und du siehst die exception. Deswegen steht auch nur ein Eintrag in der Listbox.
Dieser sollte natürlich nicht dort sein, da es ja die "Überschrift" sein soll


Quelltext
1:
2:
3:
 if sl.strings[i]='Namen:' then Mode:=0
else if sl.strings[i]='Nachnahmen:' then Mode:=1
else if sl.strings[i]='EMail Adresse:' then Mode:=2

diese 3 Strings müssen genauso sein, wie in der Datei. Wenn in der Datei nun aufeinmal "Name:" statt "Namen:" steht funzt das ganze nicht, da dann Mode nciht gesetzt wird. Du mußt auch die Groß/Kleinschreibnung beachten! Das ist halt das Problem dabei, deswegen ist der Textdateiaufbau von Smiegel auch besser geeignet.

Frank


F.Art - Sa 11.01.03 20:30

OK so läufts.