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 beantortet

    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?

    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


Anmelden zum Antworten