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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!