extern funzt nicht richtig mit package
-
hallo!
Ich habe eine BPL erstellt, worin eine TForm mit einem TLabel ist.
Nun starte ich meine Anwendung. Wenn ich dort auf den Button klicke, soll die TForm aus der BPL(Package) mit einem TButton und TLabel angezeigt werden. Das funzt auch alles Prima.Wenn ich auf den TButton aus er BPL drücke soll in dem TLabel darunter eine Zahl stehen, welche ich in meiner Anwendung definiert habe.
exe-header
int zahl=9999;exe.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
zahl=1234;
ShowPackagesForm();
}//----------------
package-header
#include "unit1.h" // exe-anwendung
extern int zahl;packages-cpp
void __fastcall TPackageForm::Button1Click(TObject *Sender)
{
Label1->Caption=zahl;
}So das Problem ist jetzt, das ich in der PackageForm im Label eine 9999 sehe. Also so wie int zahl initialisiert wurde. Aber ich setzte es doch auf den Wert 1234. Ich verstehe nicht wieso er es dann falsch anzeigt
-
maikaefer schrieb:
Label1->Caption=zahl;
"Caption" ist vom Typ AnsiString und "zahl" vom Typ int. Was schließt du daraus?
Richtig, du musst "zahl" umwandeln. Aber wie? Siehe FAQ
-
Hallo,
@PuppetMaster2k
Der Zuweisungsoperator von AnsiString ist für int überladen. Diese Zuweisung geht also durchaus und stellt hier auch nicht das Problem dar.@maikaefer
Bist du mal mit dem Debugger durchgegangen? Wird Button1Click von TForm überhaupt aufgerufen?Ciao
-
Ja sicher, sonst würde ja wohl nicht anschliessend im TLabel "9999" stehen oder?
-
Ich meinte Button1Click von TForm1 nicht von TPackageForm.
-
Wenn das nicht gehen würde, würde ich doch garnicht erst die PackageForm sehen -.-
void __fastcall TForm1::Button1Click(TObject *Sender)
{
zahl=1234; // <<< neuer Wert für zahl
ShowPackagesForm(); // <<<< PackageForm darstellen, wäre alternativ bei einem 2. Formular das Form2->Show();
}
-
Kann es sein, dass die Variable zahl zweimal existiert?
Informier dich ausserdem mal über globale bzw. public Variablen (siehe FAQ). Derartige Sachen sollte man grundsätzlich vermeiden. Dann passieren auch solche Fehler nicht.
-
Nein "zahl" existiert nicht anderso nochmal. Ich habe die Anwendung auf das Minimum beschränkt und nicht mehr als ich hier beschrieb. Zumal das Label ja "9999" anzeigt also auch das richtige "zahl" hat. Nur leider den Initialisierungswert nun.
Globale Vars soll man meiden, aber verboten sind sie ja nun nicht. Ausserdem soll die Anwendung frei drauf zugreifen dürfen. Jede Funktion, warum also in eine Classe kapseln? Zuviel Arbeit für garnix.
Also ShowPackageForm() ruft eine TForm aus einer BPL Datei auf. Gibts da einschränkungen? Wenn ich dem EXE Projekt eine TForm2 hinzufüge und dort auch "zahl" anzeigen lasse, tut er das richtig. Nur in der PackageForm steht der "alte" Wert seltsamerweise drin.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
zahl=1234;
ShowPackagesForm(); // << zeigt extern int zahl => 9999
Form2->Show(); // zeigt extern zahl => 1234
}
-
Ich habe mal rumgespielt und mein Problem gefunden.
Das Problem ist das PackageForm ein komplett anderes Projekt ist.
Dieses kennt nicht "zahl" und ein dazugeben per include ist keine Lösung.Project1
--------Header: TForm1
int zahl=9999;CPP: TForm2 (nicht das Packages, sondern nur eine 2 TForm in der Anwendung)
extern int zahl;In Projekt1 sind 2 TForms und beide können jetzt auf "zahl" richtig zugreifen.
Wenn ich aber zahl auch nutzen möchte in Project2 (was das Package ist, welches ich in Projekt einbinden möchte) dann bekomme ich es nicht mehr hin.
Ich kann zwar "extern in zahl;" einfügen worauf er meckert das er zahl nicht kennt und ich ihm die Projekt1 TForm1 Header include. Aber dann arbeitet er nur noch mit dem Initialisierungswert aus der Header wo ja "int zahl=9999;" steht.
Wenn ich jetzt Projekt1 starte und den "zahl" wert ändere und das BPL (Projekt2) einbinde und ausführe zeigt er immer nur "9999" an weil er kein bezug zu der Änderung hat. Falls jemand meint er bekommt es ihn, schicke ich ihm gerne die CBuilder5 Projekte.
-
Warum übergibst du zahl nicht einfach beim Aufruf von ShowPackagesForm und setzt sie dann intern?
-
Genau deswegen möchte ich hier Braunsteins Anregung noch mal aufgreifen:
Braunstein schrieb:
Informier dich ausserdem mal über globale bzw. public Variablen (siehe FAQ). Derartige Sachen sollte man grundsätzlich vermeiden. Dann passieren auch solche Fehler nicht.
Und Du mußt dafür keine Klasse erzeugen, eine einfache Funktion in Deiner BPL-Form zum Setzen und Lesen der Variable reicht...
-
Das wäre eine Lösung richtig. Nur das Problem ist das ich rund 20Dateien laden muss mit denen ich rechnen will und deren Inhalt alle arbeiten müssen. Also muss die Variable GLOBAL verfügbar sein für alle Formen. Den Wert einfach zu übergeben bringt mir in diesem Falle leider garnichts. Denn wenn ich zahl in der PackageForm ändere dann muss das auch die EXE Form wissen und alle anderen auch.
-
Dann übergibst du deine Variable halt als Referenz oder als Pointer.
-
Ah da hat noch wer was geschrieben. Ja an die Möglichkeit das über Funktionen zu realisieren habe ich auch schon gedacht. Nur wäre das sau viel Verwaltungsaufwand da ich nach jedem zahl= den Wert an die MainForm (EXE) zurücksenden muss und dann bestände auch das Problem das ich für alle anderen PackageFormen einen Timer einbauen müsste welcher die gloabel Vars aus der MainForm neu einlesen. Keine sehr tolle Lösung letztendlich. Ich brauch das er wirklich extern auf die Variable zugreift .. Die Lösung per Übergabe oder Funktion ist schmutzig und bei einem grossen Projekt gefährlich .. einmal die aktualisierung vergessen und schon gibts Hammer Probleme.
Kann man nicht irgendwie trotz des Fehlers es compilieren .. argh das muss doch irgendwie gehen schliesslich gehört das Package dann zur MainForm .. man ist das doof
-
@Braunstein
Mhh, als Referenz übergeben. Mhhh, ja das könnte klappen.
Werd ich auf jedenfall probieren da bisher anders wohl nicht möglich wäre.
-
Ok mal mit Referenz gemacht. Leider zu früh gefreut.
Ich habe jetzt zwar wie gewünscht in der PackageForm jetzt "zahl" und kann sie dort auch ändern so das in der EXE TForm auch geändert wurde. Aber wenn ich sie in der EXE TForm wieder ändere ist sie logischweise nicht mehr in der PackageForm geändert. Bliebe das Setzen von einer Funktion und das wäre wie schon gesagt irgendwie unsauber. Handelt sich ja nicht nur um Zahlen (int). Naja mir fällt was ein und wenn nicht wirds die "komische" Lösung mit massenweise Funktionen die keiner mehr durchschaut ^^
-
Lösung gefunden, danke für eure Gedanken anstösse