Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Fehler bei der Captionübergabe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.10.2006, 13:21 Uhr
~radian
Gast


Halo liebe C++ Gemeinde,

habe eine Problem bei der Änderung der Captions. Die Captions der einzelnen Objekte von Form2 sollen geändert werden, nachdem sie geucht und gefunden wurden. Sobald die Objekte also gefunden wurden, würde der NAme des Objekts übergeben und mittels diesem Namen wird in der XML-Datei nach den Captions gesucht. Das hat den Vorteil, dass ich nur noch Elemente in das Form einfügen muss ohne mir gedanken über Mahrsprachigkeit zu machen (Englisch, Deutsch usw.). Die Captions werden also automatisch aus der XML-Datei gefischt. Problem ist, das sich die Captions nicht übergeben lassen. Ich bekomme den Fehlet, dass Captions keine Componente von TComponent ist. Stimmt ja auch. Doch TControl erbt doch von TComponent. Wie kann ich das Problem lösen das ich die Captions umbenant bekomme. Hier mein Quleltext.

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Objektsuche.h"
#include <XMLDoc.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;

//---------------------------------------------------------------------------
AnsiString getName(AnsiString ObjName,AnsiString Sprache)
{
try
{
AnsiString BuCaption;
_di_IXMLDocument LangXML = LoadXMLDocument("lang.xml");
_di_IXMLNodeList NodeList = LangXML->DocumentElement->ChildNodes;
_di_IXMLNode ObjNameNode = NodeList->FindNode(ObjName);
BuCaption = ObjNameNode->ChildNodes->FindNode(Sprache)->NodeValue;

return BuCaption;
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
}

//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
// Ausgabe der Anzahl der Objekte
int i = 0;
i= Form2->ComponentCount;
Button_Para->Caption = i;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button_BerPrClick(TObject *Sender)
{
// Suchen nach dem Namen der Objekte und Ausgabe der Namen

AnsiString ObjName[5];
AnsiString CaptionName[5];
AnsiString Sprache = "eng";

for (int i=0; i< Form2->ComponentCount;i++)

{
ObjName[i] = Form2->Components[i]->GetNamePath();
CaptionName[i] = getName(ObjName[i], Sprache);

// Form2->Components[i]->Caption = CaptionName[i];
}
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.10.2006, 14:06 Uhr
Th



Dies ist nicht so einfach...
Erstens mußt du herausfinden, ob es sich wirklich um ein TControl handelt. Dies geht z.B. mit der Methode 'InheritsFrom'.
Zweitens ist die Eigenschaft 'Caption' von TControl aber protected (geschützt), d.h. nur die von TControl abgeleiteten Klassen haben Zugriff darauf (bzw. diese Eigenschaft published gesetzt).
Du mußt also herausfinden, um welches Control es sich genau handelt (z.B. TLabel, TStaticText etc.), dann entsprechend 'casten' und dann die Eigenschaft Caption setzen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.10.2006, 14:15 Uhr
~radian
Gast


Oha, bitte nochmal langsam.

Also Caption ist definitif von TControl laut BCB-Hilfe.
Meines Wissens ist jedes Form mit Buttons oder sonstigen Objekten, was neu erstellt wird abgeleitet von TControl (Buttons erklärt sich ja von alleine).
Mit
Button1->Caption = "Blabla";
lässt sich ja sonst auch die Caption ändern. Somit hat sich das zumindest geklärt. Aber wie genau mache ich das ganze nun? Bin da echt überfragt? Will ja nur der Komponente von Form2 die Caption zuweisen, ohne dabei das Element direkt bennen zu müssen. Es soll ja einfach aus der Objektliste von Tform genommen werden. Jedes Objekt lässt sich ja über ...->Components[i]->... finden bzw. auf dieses zugreifen. Das "i" steht ja nur für die Nummer des Objekts welche vom Compiler zugewiesen wurde wenn das Objekt erstellt wurde.
Was gibt es nun genau noch für möglichkeiten? Bin nicht ganz so ein guter C++ Programmierer, leider.
Sorry?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.10.2006, 16:24 Uhr
Th



Hi,

was ich meinte, war, ob die Komponente "Form->Components[i]" wirklich vom Typ "TControl" ist, denn es gibt auch Komponenten, wie z.B. die OpenFile und SaveFile Dialoge, welche zwar von TComponent abgeleitet sind, aber keine TControls sind.

z.B. so etwas:

C++:
for(int i=0; i<ComponentCount; i++)
{
    TComponent *comp = Components[i];
    TControl *ctrl = dynamic_cast<TControl *>(comp);
    if (ctrl != NULL) // test, ob es sich um ein Control handelt
    {
            // ctrl->Caption = "Hello";     <--- dies geht nicht direkt, da Caption protected ist!!!
    }

    TLabel *label = dynamic_cast<TLabel *>(comp)
    if(label != NULL)
        label->Caption = "Hallo";  <-- aber dies funktioniert!!!

    //... dasselbe dann für alle weiteren Controls
}


Ich habe jetzt "dynamic_cast" statt "InheritsFrom" verwendet, aber beides funktioniert (du mußt bei "dynamic_cast" aber RTTI (Runtime Type Informations) im Projekt aktiviert haben).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.10.2006, 08:33 Uhr
~radian
Gast


Ich danke dir sehr. Werde es gleich mal ausprobieren. Echt super!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: