Verschiedene Quelltextdateien



  • Hallo Leute,
    Ich arbeite erst seit kurzem mit dem Borland C++ Builder und nun wundere ich mich sehr darüber, was für eine Fülle an Dateien, der Builder anlegt.
    Welcher von all diesen Dateien sind überhaupt zum Programmieren wichtig?
    Zudem wollte ich vor kurzem einen Thread machen und da hab ich gesehen, dass als ich das getan habe direkt ne neue Unit angelegt habe.
    Nun kann ich in dieser Unit garnicht mehr mit Objecten aus anderen Units arbeiten 😞
    Warum steht nicht aller Code einfach in einer Datei? Ich finde das alles sehr unübersichtlich und verstehe auch nicht den Zusammenhang der Dateien.
    Aus diesem Grund frage ich hier jetzt einfach mal nach.
    Kann mir eventuell jemand helfen?
    Vielen Dank für alle Antworten im Vorraus 🙂
    cya
    David

    PS: 🙂 🙂 🙂 🙂 🙂 🙂



  • Hallo

    Welcher von all diesen Dateien sind überhaupt zum Programmieren wichtig?

    .bpr - Die Projekt-Datei
    .cpp,.h,.dfm - Die Dateien der Units, mitsamt Form-Definition

    alle anderen sind temporäre Dateien, die zum Kompilieren angelegt werden, aber danach auch gelöscht werden können.

    Zudem wollte ich vor kurzem einen Thread machen und da hab ich gesehen, dass als ich das getan habe direkt ne neue Unit angelegt habe.
    Nun kann ich in dieser Unit garnicht mehr mit Objecten aus anderen Units arbeiten

    Ja, das ist allgemein in C++ so. Dafür gibs das Schlüsselwort include.
    Bitte aber keine globalen Objekte verwenden, sondern mit Paramtern und Membern arbeiten.

    Warum steht nicht aller Code einfach in einer Datei? Ich finde das alles sehr unübersichtlich und verstehe auch nicht den Zusammenhang der Dateien.

    Ich arbeite gerade an einem Projekt, das mehr als 100 Dateien umfasst. Ich will gar nicht vorstellen, wenn als das in einer einzelnen Datei stehen würde...

    bis bald
    akari



  • Wenn ich also zwei Units habe. Und oben in jeder Unit steht dann include "anderer Unitname"- dann kann ich mit allen Objecten der anderen Unit arbeiten?



  • Hi,

    *.tds lösche ich immer bevor ich mein Projekt zippe (komprimiere).
    Bei einer Widerherstellung geht alles wieder nur das er etwas länger
    kompiliert. (BCB5)

    Grüsse



  • Ich geb mal nen einfaches Beispiel, was bei mir zum Beispiel mit dem include nicht geht.
    Ich habe vier Quelltextdateien:

    Unit1.h
    Unit1.cpp
    Unit2.h
    Unit2.cpp

    Unit1.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    
    }
    //---------------------------------------------------------------------------
    

    Unit1.h

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *Button1;
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Unit2.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit2.h"
    
    #pragma package(smart_init)
    #include "Unit1.h"
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    
    __fastcall Thread::Thread(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall Thread::Execute()
    {
        Button1->Caption="HI";
    }
    //---------------------------------------------------------------------------
    

    Unit2.h

    //---------------------------------------------------------------------------
    
    #ifndef Unit2H
    #define Unit2H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    //---------------------------------------------------------------------------
    class Thread : public TThread
    {
    private:
    protected:
            void __fastcall Execute();
    public:
            __fastcall Thread(bool CreateSuspended);
    };
    //---------------------------------------------------------------------------
    #endif
    

    In Unit1.h ist das Objekt Button1 definiert.
    In Unit2.cpp kann ich jedoch trotz includieren nicht auf Button1 zugreifen 😞

    Woran liegt das?



  • Hi,

    Ich weis nicht ob es dir bewust ist, dass Unit2 eine Thread ist.
    Ein Thread muss erst mit new gebildet werden, um aus ihm heraus ein Element von Form1 zu verwenden.

    Wenn der Thread angelegt (inizialisiert) ist.
    Kannst du aus Ihm heraus das machen.

    Form1->Button1->Click();

    Grüsse



  • Hallo

    Das du da einen Fehler hast ist klar. Aber der kommt nicht, weil du mit zwei verschiedenen Units arbeitest, der würde auch kommen, wenn du das Prinzip in einer Unit zusammenfasst.
    Stattdessen fehlen dir Grundlagen in der Objekt-Orientierung, die du erstmal beherschen sollltest.

    Deinen Fehler auf die Schnelle beheben könntest du mittels

    Form1->Button1->Caption="HI";
    

    allerdings ist das mit den Thread nicht so einfach. Die Ausgabe müßte gegebenenfalls synchronisiert werden.

    bis bald
    akari



  • Hallo

    Ein Thread muss erst mit new gebildet werden, um aus ihm heraus ein Element von Form1 zu verwenden.

    Das ist nicht ganz korrekt. Natürlich kann auch die Methode eines Threads die Member einer anderen Klasse benutzen.
    Allerdings um dann zur Laufzeit wirklich etwas zu sehen, muß sehr wohl erstmal eine Instanz des Threads erzeugt werden.

    bis bald
    akari



  • Ich werde mir mal den Link ansehen und versuchen das zu verstehen...



  • Dateien die du löschen kannst sind:

    .tds(meist die größte Datei
    und alle Dateien mit einer ~ davor.


Anmelden zum Antworten