eigene Klasse einbinden
-
Ich habe in einer Header-Datei eine eigene Klasse erstellt. Und möchte sie jetzt in mein Unit1(Form1) einbinden. Wenn ich sie in einer Methode der TForm1 Klasse deklariere z.B Button1Click, funktioniert es.
Nur das Problem ist ich brauche sie Global und wenn ich sie jetzt direkt unter den befehle TForm1 *Form1 einbinden möchte und ihr die Adresse meines TQuery Zeiger übergeben will, bekomme ich die Fehlermeldung undiffinertes Symbol Query1.
Ich habe sie auch versucht unter public der TForm1 Klasse zu deklarieren aber das funktioniert auch nicht.
-
hmmmm... verstehe nicht genau wo das Problem liegt.. evtl solltest du etwas code zeigen. da sieht man bestimmt mehr
-
Ja gut es ist schon etwas verwirrend gefragt.
Eigentlich wollte ich nur wissen wo man am besten eine eigene Klasse( die in einer Header-Datei geschrieben ist) deklariet, so das sie global ist!
Vielen Dank im Voraus!
-
also ich habe meine zusätzlichen Klassen selten in einer Form-Unit.
du kannst zB eine Neue Unit erstellen, dort deine ganze Klasse reinschmeisen (wie zB bei einer "Form"-Klasse). die kannst du dan in einer x-belieben Unit wieder über "include" einbiden.falls es nur eine kleine klasse ist, die den aufwand nicht lohnt, kannst du sie in der header-datei ausser halb des
class TForm1::public TForm { ... };
gerüst deklarieren. (um sie aber in deiner anderen Klasse nachher zu brauchen, darfst du das include"Unit1.h" nicht vergessen
-
Also ich habe es jetzt über eine zweite Unit versucht und das funktioniert auch nicht so wie es soll.
#include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; Csql sql1("Tabelle1",Query1) //funktionert nicht void __fastcall TForm1::Button1Click(TObject *Sender) { Csql sql1("Tabelle1",Query1) //funktionert ... }
Jetzt noch das Problem inder Header_Datei von Unit1
include "Unit2.h" . . . class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten TDataSource *DataSource1; TQuery *Query1; TDBGrid *DBGrid1; TButton *Button1; private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TForm1(TComponent* Owner); Csql sql1("Tabelle1",Query1); //funktionert auch nicht };
Die Klasse Csql habe ich in der Unit2 geschrieben.
-
Du vermischt hier Deklaration und Instanziierung. Musst wohl deine Klasse über Zeiger ansteuern, wenn du sie fast überall verfügbar haben willst aber dennoch den Konstruktor verwenden willst.
Edit: Irgendwie habe ich gerade Blödsinn gelabert... ich weiß nur nicht auf Anhieb, wo.
Edit2: Lies das von Braunstein. Der will irgendwie dasselbe sagen, schafft es aber im Gegensatz zu mir auch.
-
Hallo,
Muß die Instanz deiner Klasse unbedingt global sein? Wenn ja, dann könntest du einen Pointer auf deine Klasse als Member von Form1 deklarieren und diesen dann in deiner ButtonClick-Funktion mit new instanziieren. Nur das delete darfst du dann nicht vergessen. Hier wäre es auch günstig den Pointer im Konstruktor von Form1 mit 0 zu belegen um seine Gültigkeit testen zu können.
Besser wäre es wohl du schaust mal, ob es nicht reicht deine Klasseninstanz lokal zu halten.Ciao
-
Hallo,
Csql sql1("Tabelle1",Query1) //funktionert nicht
das Problem hierbei ist, dass Du Query1 übergibst, die Mitglied der Klasse "TForm1" ist. Das Object vom Typ "Csql" instanzierst Du allerdings global.
Global gibt es das Objekt Query1 allerdings nicht, weshalb er das Objekt "Query1" demzufolge auch nicht finden kann.Gruß,
Robert
-
Ich denke der Fehler hier liegt wohl eher daran, dass er versucht eine Membervariable in der Klassendeklaration zu definieren. Das geht natürlich so nicht. Das muß schon innerhalb einer Funktion (bzw. Initialisierungsliste des Konstruktors) erfolgen.