Textdatei auslesen!
-
Hi!
Bin noch ziemlich neu in Programmieren und möchte trotz allem folgendes realisieren.
Habe eine ListBox erstellt, und möchte die nun nicht manuell füllen, sondern möchte das der Inhalt aus einer Textdatei ausgelesen wird!
Habe es nun schon mit TStringList probiert nur irgendwie geht das nicht so wirklich.
Hat jemand einen Vorschlag? Würde mich über Hilfe freuen!
Hier noch meine *.cpp Datei
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "info.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "trayicon" #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Info1Click(TObject *Sender) { AboutBox->ShowModal(); } //--------------------------------------------------------------------------- void __fastcall TForm1::ffnen1Click(TObject *Sender) { TOpenDialog *DurchsuchDialog = new TOpenDialog(this); if (DurchsuchDialog) { DurchsuchDialog->Filter = "Alle Dateien (*.*)|*.*"; DurchsuchDialog->FileName = "*.*"; if (DurchsuchDialog->Execute()) { AnsiString dieAusgewaehlteDatei = DurchsuchDialog->FileName; } } if (DurchsuchDialog) delete DurchsuchDialog; } //--------------------------------------------------------------------------- void __fastcall TForm1::Beenden1Click(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::ListBox1Click(TObject *Sender) { } //---------------------------------------------------------------------------
Und die *.h Datei
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <Dialogs.hpp> #include <Menus.hpp> #include <ActnList.hpp> #include <ActnMan.hpp> #include <ActnCtrls.hpp> #include <ActnMenus.hpp> #include <ToolWin.hpp> #include <StdActns.hpp> #include <ComCtrls.hpp> #include <ExtCtrls.hpp> #include "trayicon.h" #include <jpeg.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten TMainMenu *MainMenu1; TMenuItem *Dati1; TMenuItem *Bearbeiten1; TMenuItem *Ansicht1; TMenuItem *Datenbank1; TMenuItem *ffnen1; TMenuItem *Speichern1; TMenuItem *Schlieen1; TMenuItem *Beenden1; TMenuItem *Kopieren1; TMenuItem *Einfgen1; TMenuItem *Eintraglschen1; TMenuItem *Eintraghinzufgen1; TMenuItem *Datenbertragen1; TMenuItem *Hilfe1; TMenuItem *F2FHilfe1; TMenuItem *Info1; TListBox *ListBox1; TStatusBar *StatusBar1; TBevel *Bevel1; TListBox *ListBox2; TProgressBar *ProgressBar1; TBevel *Bevel2; TImage *Image1; void __fastcall Info1Click(TObject *Sender); void __fastcall ffnen1Click(TObject *Sender); void __fastcall Beenden1Click(TObject *Sender); void __fastcall ListBox1Click(TObject *Sender); private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
-
Also wenn du ne Textdatei verwendest, solltest du doch eigentlich die Funktion GetLine() nutzen können. Wenn du jeden Eintrag für die ListBox in einer einzelnen Zeile in der textdatei hast, kannst du es somit ganz einfach an deine LB übergeben.
EDIT: schau dir den Link an
-
Ja das Problem ist in meinem Borland 6 gibt es in der Hilfe kein GetLine()
In den Büchern die ich habe auch nicht wirklich...haste vielleicht ein Beispiel?
Danke
-
void __fastcall TForm1::Button1Click(TObject *Sender) { TOpenDialog *DurchsuchDialog = new TOpenDialog(this); if (DurchsuchDialog) { DurchsuchDialog->Filter = "Alle Dateien (*.*)|*.*"; DurchsuchDialog->FileName = "*.*"; if (DurchsuchDialog->Execute()) { //Hier wird die Listbox befüllt ListBox1->Items->LoadFromFile(DurchsuchDialog->FileName); } } if (DurchsuchDialog) delete DurchsuchDialog; }
-
Funktion "fread"
Header-Datei stdio.h Kategorie Ein-/Ausgaberoutinen Syntax #include <stdio.h> size_t fread(void *ptr, size_t size, size_t n, FILE *stream); Beschreibung Liest Daten aus einem Stream. fread liest n Datenelemente, die jeweils die Größe size Bytes haben, aus dem angegebenen Stream in den Speicherbereich, auf den ptr zeigt. Es werden insgesamt (n * size) Bytes gelesen. Rückgabewert fread liefert bei fehlerfreier Ausführung die Anzahl der gelesenen Datenelemente (nicht Bytes) zurück. Im Falle eines Fehlers oder am Dateiende wird die Anzahl von Elementen (möglicherweise 0) zurückgeliefert, die noch fehlerfrei gelesen werden konnten.
Funktion "fseek"
Header-Datei stdio.h Kategorie Ein-/Ausgaberoutinen Syntax #include <stdio.h> int fseek(FILE *stream, long offset, int whence); Beschreibung Setzt den Dateizeiger eines Streams auf eine neue Position. fseek setzt den zu stream gehörenden Dateizeiger auf die neue Position, die offset Bytes von der durch whence angegebenen Dateiposition entfernt ist. Für Streams im Textmodus sollte offset 0 sein oder ein Wert, der von ftell geliefert wurde. Die Art der Positionierung wird über drei in stdio.h definierte Konstanten für whence festgelegt: Konstante whence Dateiposition SEEK_SET (Wert 0) Relativ zum Dateianfang SEEK_CUR (Wert 1) Relativ zur aktuellen Position SEEK_END (Wert 2) Relativ zum Dateiende Mit ungetc zurückgestellte Zeichen sind nach fseek nicht mehr erreichbar. Benutzen Sie fseek für Stream-Ein-/Ausgabe und lseek für Datei-Handle-Ein-/Ausgabe. In Dateien, die für Lese- und Schreiboperationen geöffnet worden sind, kann nach fseek zwischen "Lesen" und "Schreiben" gewechselt werden. Rückgabewert fseek liefert bei fehlerfreier Ausführung den Wert 0 zurück, ansonsten einen Wert ungleich Null. Es ist möglich, daß fseek 0 zurückliefert, obwohl bei der Ausführung der Funktion ein Fehler aufgetreten ist. Dies liegt daran, daß der Zeiger letztendlich von DOS gesetzt und das Ergebnis der Positionierung nicht überprüft wird. fseek gibt nur für ungeöffnete Dateien oder Geräte einen Fehlercode zurück. Im Fehlerfall wird die globale Variable errno auf einen der folgenden Werte gesetzt: EBADF Ungültiger Dateizeiger EINVAL Ungültiges Argument ESPIPE Suche auf diesem Gerät nicht möglich
-
Das ist ja schonmal super, aber das problem liegt ja darin das er das beim Start des Programms auslesen soll....
-
das findest du bestimmt selbst raus, wie du die listbox
gleich nach dem programmstart füllen kannst.schau dir dazu die ereignisse deine form an
-
BorlandNewbie schrieb:
das problem liegt ja darin das er das beim Start des Programms auslesen soll....
Dann Versuchs doch ma, indem du dem code, in das Ereignis "OnCreate" deiner Hauptform schreibst. Dann haste beim Start deiner Anwendung!
-
Wunderbar danke! Es funktioniert! Tja man sollte doch nicht immer gleich aufgeben
Habe es so gelöst: (Auch für andere!
)
//--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ListBox1->Items->LoadFromFile("C:\\Cars.txt"); } //---------------------------------------------------------------------------
-
Aber jetzt habe ich ein anderes Problem:
Jetzt läd er ja in die erste ListBox den Inhalt der Datei, das ist ja super! Jetzt soll er aber bei einer bestimmten Auswahl in Listbox2 einen weiteren Inhalt ausgeben.
Also bei Click in auf ein Punkt von ListBox1 ausgabe Textdatei in Listbox2!
Mein Code sieht momentan so aus, aber da läd er ja bei jedem Klick in ListBox1 den Inhalt von 2!
//--------------------------------------------------------------------------- void __fastcall TForm1::ListBox1Click(TObject *Sender) { ListBox2->Items->LoadFromFile("C:\\seller.txt"); } //---------------------------------------------------------------------------
Vorschläge werden gerne angenommen :p
-
BorlandNewbie schrieb:
Also bei Click in auf ein Punkt von ListBox1 ausgabe Textdatei in Listbox2!
Was ist Bedeutung von dies?
Gruß,
Alexander
-
Alexander Kempf schrieb:
BorlandNewbie schrieb:
Also bei Click in auf ein Punkt von ListBox1 ausgabe Textdatei in Listbox2!
Was ist Bedeutung von dies?
Gruß,
Alexander
Aus meiner Textdatei in ListBox1 werden 5 Beschreibungen augelesen und untereinander in ListBox1 eingefügt!
Jetzt möchte ich durch klick auf die erste Beschreibung in ListBox1, in ListBox2 weitere Auswahlmöglichkeiten haben die auch aus einer Datei geladen werden!OK?
-
Du willst also in Abhängigkeit von dem ausgewählten Item der ersten ListBox
die zweite mit dem Inhalt einer Datei füllen. Wenn Du das nur über den Index
(ItemIndex) machst, mußt Du schon vor dem Laden der ersten Datei wissen, was
in der Datei steht - was sinnlos wäre. Sinnvoll wäre nur, wenn Du den ausge-
wählten Inhalt des Items betrachtest und danach entscheidest, welche Datei
in die zweite ListBox eingelesen wird. Also z.B. der Inhalt der ersten Datei
sind Dateinamen und ein Click auf ein Item lädt die entsprechende Datei in
die zweite ListBox.
Also ItemIndex ist der aktuell ausgewählte Index, über diesen kannst Du mit
Items->Strings[ItemIndex] auf den Inhalt zugreifen.Gruß,
Alexander
-
Alexander Kempf schrieb:
Du willst also in Abhängigkeit von dem ausgewählten Item der ersten ListBox
die zweite mit dem Inhalt einer Datei füllen. Wenn Du das nur über den Index
(ItemIndex) machst, mußt Du schon vor dem Laden der ersten Datei wissen, was
in der Datei steht - was sinnlos wäre. Sinnvoll wäre nur, wenn Du den ausge-
wählten Inhalt des Items betrachtest und danach entscheidest, welche Datei
in die zweite ListBox eingelesen wird. Also z.B. der Inhalt der ersten Datei
sind Dateinamen und ein Click auf ein Item lädt die entsprechende Datei in
die zweite ListBox.
Also ItemIndex ist der aktuell ausgewählte Index, über diesen kannst Du mit
über Items->Strings[ItemIndex] auf den Inhalt zugreifen.Gruß,
Alexander
Was?
Ich versteh nur Bahnhof!
Vielleicht ein Beispiel zur Veranschaulichung? Danke!
Hier meine *.cpp in der es steht wie ich es momentan habe!!!
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "info.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "trayicon" #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ListBox1->ItemIndex->LoadFromFile("C:\\Cars.f2f"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Info1Click(TObject *Sender) { AboutBox->ShowModal(); } //--------------------------------------------------------------------------- void __fastcall TForm1::ffnen1Click(TObject *Sender) { TOpenDialog *DurchsuchDialog = new TOpenDialog(this); if (DurchsuchDialog) { DurchsuchDialog->Filter = "Alle Dateien (*.*)|*.*"; DurchsuchDialog->FileName = "*.*"; if (DurchsuchDialog->Execute()) { } } if (DurchsuchDialog) delete DurchsuchDialog; } //--------------------------------------------------------------------------- void __fastcall TForm1::Beenden1Click(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::ListBox1Click(TObject *Sender) { ListBox2->Items->LoadFromFile("C:\\seller.f2f"); Image1->Picture->LoadFromFile("C:\\Astra.jpg"); } //--------------------------------------------------------------------------- void __fastcall TForm1::ListBox2Click(TObject *Sender) { ListBox3->Items->LoadFromFile("C:\\cardetail.f2f"); } //-------------------------------------------------------
-
... diese Art eine Listbox zufüllen kann man das nicht auch die Werte aus einer DB nehmen? oder geht das nicht und wenn das geht wie ? ...
-
Sicher kann man das auch aus eine DB holen, aber für das wo ich es brauche, geht auch eine Textdatei!
Hat jemand eine Beispiel für meine Frage eben?
-
Ich kann anhand des Quelltextes leider immer noch nicht so richtig Dein Ziel
erkennen. Abgesehen davon, kann ich mir nur schwer vorstellen, daß dieser
Code kompiliert:BorlandNewbie schrieb:
ListBox1->ItemIndex->LoadFromFile("C:\\Cars.f2f");
Versuche doch mal, Deine Gedanken zu sortieren und dann hier klar zu
formulieren. Vielleicht erledigt sich dann schon einiges von selbst oder
es kann Dir hier jemand helfen.Gruß,
Alexander
-
Ne der funktioniert ja auch nicht
War falsch eingestellt!
Also nochmal
In der 1. Listbox steht der Inhalt den ich geladen habe! Sieht wie folgt aus:
ListBox1:
--------------
|Opel |
|VW |
--------------ListBox2:
--------------
| |
| |
--------------ListBox2 ist leer!
Jetzt möchte ich bei Klick auf Opel das in der 2. Listbox ein anderer Inhalt geladen wird, so zb.:
ListBox1:
--------------
|Opel |
|VW |
--------------ListBox2:
--------------
|Räder |
|Tuning |
--------------Jetzt alles klar? :p
-
Meine Frage ist: Wenn ich in der ersten ListBox Opel wähle, wird dann die
zweite ListBox mit anderen Einträgen gefüllt, als wenn ich VW wähle?
Und, wenn ja, wovon hängt das ab?Gruß,
Alexander
-
Alexander Kempf schrieb:
Meine Frage ist: Wenn ich in der ersten ListBox Opel wähle, wird dann die
zweite ListBox mit anderen Einträgen gefüllt, als wenn ich VW wähle?
Und, wenn ja, wovon hängt das ab?Gruß,
Alexander
Ja genau es werden immer andere Einträge eingefügt!
Abhäng? Ist doch klar, hast du dir doch oben beantortetWenn ich in der ersten ListBox Opel wähle, wird dann die
zweite ListBox mit anderen Einträgen gefüllt, als wenn ich VW wähle?Hilft dir das?
-
Mal konkret: Ich wähle den ersten Eintrag (ItemIndex=0) der ersten ListBox.
Dieser Eintrag trägt die Beschriftung "Opel" (ListBox1->Items->Strings[0] =
"Opel").
Jetzt soll die zweite ListBox aus einer Datei gefüllt werden. Wovon hängt es
ab, welche Datei gelesen wird?1. Möglichkeit: Zuordnung über ItemIndex. Erster Eintrag gewählt (ItemIndex=0)
heißt >>lade Datei "xyz"<<. Zweiter Eintrag gewählt heißt >>lade Datei "abc"<<2. Möglichkeit: Zuordnung über die Beschriftung. Erster Eintrag ("Opel") ge-
wählt heißt >>lade Datei "Opel"<<. Zweiter Eintrag gewählt heißt >>lade Datei
"VW"<<Bei der ersten Möglichkeit, mußt Du vor dem Laden der ersten ListBox bereits
wissen, welche Einträge in der Datei sind. Das ist recht sinnlos, denn dann
kannst Du auch alles direkt im Objektinspektor eintragen.
Die zweite Möglichkeit ist flexibler, da hier die Einträge in der ersten Datei
als Dateinamen interpretiert werden.Wie findest Du raus, wie Du die zweite ListBox füllen mußt?
Gruß,
Alexander