Objekten auf form Caption zuweisen
-
Hallo,
ich brauche für die übersetzung meines Programmes eine Funktion an die ich das Form übergebe und die dann in einer Datei nach der ggf. neuen Caption für die Objekte sucht. Also so:
__fastcall ChangeLanguage(TForm *AForm) { TControl* CurrentControl; for (int i = 0; i < AForm->ComponentCount; i++) { CurrentControl = dynamic_cast<TControl*>(AForm->Components[i]); if (CurrentControl) CurrentControl->Caption = FindCaption(CurrentControl->GetNamePath()/*oder CurrentControl->Name*/); } }Aber das funktioniert nicht so wie ich mir das gedacht habe, da er "TControl::Captions" net kennt... obwohl er es laut hilfe kennen müßte???

Wenn jemand ne idee hat was ich falsch mache oder wie man es sonst noch lösen könnte (ohne "TControl::Tag" zu benutzen) wäre ich für eure hilfe sehr dankbar!
thx
-
Hallo
Nein die Compilermeldung sagt nicht das TControl keine Caption-Eigenschaft hat sondern das der Zugriff darauf über einen TControl-Zeiger nicht möglich ist. Denn in TControl ist diese Eigenschaft noch private. Erst konkrete Klassen wie TLabel setzen die Eigenschaft auf public, wenn die Eigenschaft Sinn macht. Zum Beispiel bei TEdit ist Caption auch nicht zugreifbar.
Dir bleibt nichts anderes übrig als alle Controls erstmal in ihren eigentlichen Typ zu casten (dynamic_cast macht das mit Überprüfung).bis bald
akari
-
Hallo,
eine andere Möglichkeit gibt es noch, ist aber nicht ganz so sauber.
Schreib Dir eine "Cracker"-Klasse, in der die Property public ist
und caste jeweils auf diese Klasse. Dann hast Du den Zugriff auf
die Caption Eigenschaft.class TCaptionCracker: public TControl { public: __property Caption; } __fastcall ChangeLanguage(TForm *AForm) { TControl* CurrentControl; //...ein Haufen Code... ((TCaptionCracker*)CurrentControl)->Caption = "Neue Caption"; }Der Vorteil ist, dass Du die tatsächliche Unterklasse von TControl nicht kennen musst.
Der Nachteil ist, dass diese Methode irgendwie "dreckig" wirkt.Gruß
Alexander
-
n1,
wieder was dazu gelernt...

Das ist genau das wonach ich gesucht habe... is zwar nen bissel dirty code aber naja spart mir auf jedenfall nen haufen schreibarbeit gegenüber den ganzen dynamic_cast gefummle und ich ich mauß mir keinen kopf machen das ich was vergesse!
YMMD

-
Hallo
Hoffentlich machst du dir aber einen Kopf das du undefiniertes Verhalten erzeugst, und das unter Umständen dein Programm abstürzen könnte.
bis bald
akari
-
Hm,
das wäre natürlich imho schlecht wenn das Programm aufgrund dieses Codes irgendwo / irgendwann klatscht! Das lässt sich bestimmt net mit nen try & catch block abfangen oder?
tia
-
Nochmal hallo,
ein anderer saubererer Weg wäre über die Windows-API zu gehen.
Dazu müsstest Du aber wenigstens auf TWinControl casten.
Dann hast die Eigenschaft Handle, die Du verwenden kannst,
um damit die Text-Eigenschaft zu setzen:TControl* someControl; // irgendwoher beziehen... TWinControl* ctrl = dynamic_cast<TWinControl*> someControl; if (ctrl != 0) SetWindowText(ctrl->Handle, "Neuer Text");Sollte so oder so ähnlich funktionieren.
Gruß
Alexander
-
Hallo
Hoffentlich machst du dir aber einen Kopf das du undefiniertes Verhalten erzeugst, und das unter Umständen dein Programm abstürzen könnte.
bis bald
akariFrage:
Erzeuge ich mit:
dynamic_cast<TCaptionCracker*>(CurrentControl)->Caption;auch noch ein undefiniertes Verhalten oder fliegt eine Exception vom Typ bad_cast???
tia
-
@ Alexander Kempf:
Danke für deine bemühungen! Das funktioniert schon ganz gut, jedoch nicht bei TLabel, da das beim cast zu TWinControl NULL is!

-
bad_cast kann hier nicht fliegen. Die kommt eh nur bei fehlerhaften casten von Referenzen. Das hier kann zu undefinierten Verhalten bzw. einer AccessViolation führen.
Ein dynamic_cast ist hier sinnlos. Du weißt ja, dass TCaptionCracker von TControl abgeleitet ist. Du weißt nur nicht, ob der Zugriff auf Caption zulässig ist.
-
Hallo
Um es nochmal genauer zu sagen : dynamic_cast wird wegen seiner eigenbauten Laufzeitprüfung dann immer 0 zurückgeben, da ja keine Instanz in Wirklichkeit vom Typ TCaptionCracker ist. Deshalb wird auch der folgende Zugriff die erwähnte Zugriffsverletzung auslösen.
bis bald
akari