Vererbung und Methodenaufrufe
-
Auch auf die Gefahr hin mich extrem zu blamieren, stelle ich mal mein Problem dar. Ich bin noch nicht ganz in der Objektorientierten Prgrammierung angekommen. Komme aus der Assembler- und ST-Programmierung. Wollte nun meiner Funktion SystemLangRename() das Objekt (Formular) von ObjectDebug übergeben und auswerten lassen. Leider Klappt das nich ganz. Habe noch Probleme bei der Vererbung und bei der Übergabe an die Methode.
Ich stelle mal den Quelltext hinein und würde mich freuen wenn mir einer helfen könnte. Bitte nicht auf mich herum hacken. Bin noch neu in der Objektorientierten Programmierung.Headerdatei Langrename:
#ifndef LangRenameH
#define LangRenameH//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <Menus.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
#endif
class LangRename
{
public:
virtual void LangRename::SystemLangRename(TForm *pForm);
};CPP-Datei LangRename:
//--------------------------------------------------------------------------- #pragma hdrstop #include <vcl.h> #include "ObjectDebug.h" #include "LangRename.h" #include <XMLDoc.hpp> #pragma package(smart_init) #include "ObjectDebug.h" #define __SHOWNAMES__ //--------------------------------------------------------------------------- /* Einlesen der XML-Datei mit der Sprachen- und Objekliste. Suchalgorithmus findet in XML-Datei passenden Namen und gibt der Sprache entsprechend einen AnsiString-Wert zurück. Bei LoadXMLDocument muss der entsprechende Dateiname als String übergeben werden. Bitte darauf achten, dass das Format der XML-Datei entsprechend ist. Es ist darauf zu achten, dass der Objektname für die einzelnen Elmente der selbe Name ist, der in der XML-Datei eingetragen ist. Es ist zu empfehlen, zuerst die XML-Datei zu erweitern bevor Elemente einem Formular hinzugefügt werden. */ AnsiString searchXMLFile(AnsiString ObjName, AnsiString Sprache, AnsiString returnXMLValue) { int bFound = 0; try { _di_IXMLDocument XML = LoadXMLDocument("language.xml"); _di_IXMLNodeList NodeList = XML->DocumentElement->ChildNodes; int count = NodeList->Count; for (int i=0; i<count; i++) { _di_IXMLNode ValueNode = NodeList->Nodes[i]; String NodeId = (String)ValueNode->GetAttribute("id"); if (NodeId == ObjName) { returnXMLValue = ValueNode->ChildNodes->FindNode(Sprache)->NodeValue; bFound = 1; break; } } #ifdef __SHOWNAMES__ if (bFound == 0) { FormObjDebug->LB1->Items->Add( "Name: " + ObjName + " !!!Objekt konnte nicht in der XML-Datei gefunden werden!!!" ); } #endif return returnXMLValue; } catch (...) { try { if (Sprache == "deu") { throw Exception("Sprachdatei wurde nicht gefunden!"); } else { throw Exception("Language-file not found!"); } } catch (Exception &exception) { Application->ShowException(&exception); } } return returnXMLValue; } //--------------------------------------------------------------------------- /* Methode die durch den Konstroktor des Formulares aufgerufen wird. */ //--------------------------------------------------------------------------- void LangRename::SystemLangRename(TForm *pForm) { /* Variablen zum Zwischenspeichern der Caption und des Objektnamens. Zusätzliche Variable zur Sprachenverwaltung. */ AnsiString ObjName[50]; AnsiString CaptionName[50]; String Sprache = "eng"; int NumberMenu; int NumberItem; int zahl; //---------------------------------------------------------------------- #ifdef __SHOWNAMES__ FormObjDebug->Show(); FormObjDebug->LB1->Clear(); #endif //---------------------------------------------------------------------- /* Zählung, Prüfung und Benennung der Objekte des Formulars. Jedes Objekt des Formulars wird geprüft ob es ein Bestandteil einer vorgegeben Klasse ist um es je nach Sprache zu benennen. */ // Zählung der Objekte des Formulars for (int i=0; i< pForm->ComponentCount;i++) { // Identifizierung des Objektnamens ObjName[i] = pForm->Components[i]->GetNamePath(); // Cast von Components der Klasse TComponent TComponent *comp = pForm->Components[i]; /* Dient zur Aufistung aller Objekte eines Formualrs in einem Fenster #ifdef __SHOWNAMES__ FormObjDebug->LB1->Items->Add( "Name: " + ObjName[i] + " Class: " + Components[i]->ClassName()); #endif */ // Betreffend Objekte der Klasse TLabel if (pForm->Components[i]->ClassNameIs("TLabel")) { TLabel *pLabel = dynamic_cast<TLabel *>(comp); if(pLabel != NULL) { CaptionName[i] = searchXMLFile(ObjName[i], Sprache, pLabel->Caption ); pLabel->Caption = CaptionName[i]; } } // Betreffend Objekte der Klasse TButton if (pForm->Components[i]->ClassNameIs("TButton")) { TButton *pButton = dynamic_cast<TButton *>(comp); if(pButton != NULL) { CaptionName[i] = searchXMLFile(ObjName[i], Sprache, pButton->Caption); pButton->Caption = CaptionName[i]; } } // Betreffend Objekte der Klasse TPopupMenu if (pForm->Components[i]->ClassNameIs("TPopupMenu")) { TPopupMenu *pPopupMenuObj = static_cast<TPopupMenu *>(comp); NumberItem = pPopupMenuObj->Items->Count; for (int j=0; j < NumberItem; ++j) { TMenuItem *ItemToEdit = pPopupMenuObj->Items->Items[j]; AnsiString ItemName(ItemToEdit->GetNamePath()); ItemToEdit->Caption = searchXMLFile(ItemName, Sprache,ItemToEdit->Caption); } } // Betreffend Objekte der Klasse TTabControl if (pForm->Components[i]->ClassNameIs("TTabControl")) { TTabControl *pTabControl; int nCount, j; String TabName; pTabControl = (TTabControl *)pForm->Components[i]; nCount = pTabControl->Tabs->Count; if( nCount ) { for ( j=0; j<nCount ; j++ ) { TabName = searchXMLFile(pTabControl->Tabs->Strings[j],Sprache,pTabControl->Tabs->Strings[j]); pTabControl->Tabs->Strings[j] = TabName; } } } // Betreffend Objekte der Klasse TMainMenu if (pForm->Components[i]->ClassNameIs("TMainMenu")) { TMainMenu *pMainMenuObj = static_cast<TMainMenu *>(comp); NumberMenu = pMainMenuObj->Items->Count; for (int i=0; i < NumberMenu; i++) { AnsiString ItemName; TMenuItem *pItemToEdit = pMainMenuObj->Items->Items[i]; ItemName = pItemToEdit->GetNamePath(); pItemToEdit->Caption = searchXMLFile(ItemName, Sprache,pItemToEdit->Caption); for (int j=0; j<pItemToEdit->Count;j++) { ItemName = pItemToEdit->Items[j]->GetNamePath(); pItemToEdit->Items[j]->Caption = searchXMLFile(ItemName, Sprache, pItemToEdit->Items[j]->Caption); } } } // Betreffend Objekte der Klasse TRadioButton if (pForm->Components[i]->ClassNameIs("TRadioButton")) { TRadioButton *pRadioButton = dynamic_cast<TRadioButton *>(comp); if(pRadioButton != NULL) { CaptionName[i] = searchXMLFile(ObjName[i], Sprache,pRadioButton->Caption); pRadioButton->Caption = CaptionName[i]; } } // Betreffend Objekte der Klasse TCheckBox if (pForm->Components[i]->ClassNameIs("TCheckBox")) { TCheckBox *pCheckBox = dynamic_cast<TCheckBox *>(comp); if(pCheckBox != NULL) { CaptionName[i] = searchXMLFile(ObjName[i], Sprache, pCheckBox->Caption); pCheckBox->Caption = CaptionName[i]; } } // Betreffend Objekte der Klasse TPanel if (pForm->Components[i]->ClassNameIs("TPanel")) { TPanel *pPanel = dynamic_cast<TPanel *>(comp); if(pPanel != NULL) { CaptionName[i] = searchXMLFile(ObjName[i], Sprache,pPanel->Caption); pPanel->Caption = CaptionName[i]; } } // Betreffend Objekte der Klasse TGroupBox if (pForm->Components[i]->ClassNameIs("TGroupBox")) { TGroupBox *pGroupBox = dynamic_cast<TGroupBox *>(comp); if(pGroupBox != NULL) { CaptionName[i] = searchXMLFile(ObjName[i], Sprache, pGroupBox->Caption); pGroupBox->Caption = CaptionName[i]; } } // Betreffend Objekte der Klasse TRadioGroup if (pForm->Components[i]->ClassNameIs("TRadioGroup")) { TRadioGroup *pRadioGroup = dynamic_cast<TRadioGroup *>(comp); if(pRadioGroup != NULL) { CaptionName[i] = searchXMLFile(ObjName[i], Sprache, pRadioGroup->Caption); pRadioGroup->Caption = CaptionName[i]; } } } }Und zu guter letzt nochmal die Headerdatei und CPP-Datei von denen ich das Objekt(Formular dan die Methode übergeben möchte:
//--------------------------------------------------------------------------- #ifndef ObjectDebugH #define ObjectDebugH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> //--------------------------------------------------------------------------- class TFormObjDebug : public TForm { __published: // Von der IDE verwaltete Komponenten TListBox *LB1; TPanel *Panel1; TSplitter *Splitter1; TButton *Button2; void __fastcall Button2Click(TObject *Sender); private: // Benutzer-Deklarationen public: // Benutzer-Deklarationen __fastcall TFormObjDebug(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TFormObjDebug *FormObjDebug; //--------------------------------------------------------------------------- #endif //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "ObjectDebug.h" #include "LangRename.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TFormObjDebug *FormObjDebug; //--------------------------------------------------------------------------- __fastcall TFormObjDebug::TFormObjDebug(TComponent* Owner) : TForm(Owner) { //LangRename::SystemLangRename(this); } //--------------------------------------------------------------------------- void __fastcall TFormObjDebug::Button2Click(TObject *Sender) { Close(); } //----------------------------------------------------------Bitte gebt mir unterstützende Hilfe.
Weitere Header- und Quelltextdateien lasse ich jetzt mal weg.
Danke jedem der mir hilft.
-
Hallo
Leider Klappt das nich ganz.
Das ist keine ausreichende Fehlerbeschreibung.
Kürze deinen Quellcode auf die relevanten Zeilen und poste eine genaue Fehlerbeschreibung.bis bald
akari
-
Hier die Fehlerbeschreibung und der gekürtzte Quelltext.
Zuerst der Quelltext.
Headerdatei 1:... class LangRename { public: void LangRename::SystemLangRename(TForm *pForm); ... };CPP-Datei1:
void LangRename::SystemLangRename(TForm *pForm) { ... // Zählung der Objekte des Formulars for (int i=0; i< pForm->ComponentCount;i++) ...Hederdatei 2:
#include "LangRename.h" //--------------------------------------------------------------------------- class TFormObjDebug : public TForm { __published: ...CPP-Datei 2:
TFormObjDebug *FormObjDebug; __fastcall TFormObjDebug::TFormObjDebug(TComponent* Owner) : TForm(Owner) { //????? LangRename::SystemLangRename(this); ??? }So,
versuche es nocheinemal kürzer und knapper zu beschreiben.
möchte das Objekt (das Formular aus Datei 2) an die an Methode SystemLangReename()(an Datei 1) übergeben. Bin noch neu in der Objektorientierten Programmierung. Was muß ich nun tun und wie schreibt man das als Quelltext? Verrerben?
Sorry, für so eine (wahrscheinlich für euch) simple frage.
-
Hallo
du brauchst erstmal eine gültige Instanz der Klasse LangRename, zum Beispiel als Member der Form-Klasse
#include "LangRename.h" // hier includen, im cpp nicht mehr nötig ... class TFormObjDebug : public TForm { ... private: // Benutzer-Deklarationen LangRename iRename; // konkrete Instanz für dieses Form public: // Benutzer-Deklarationenjetzt kannst du in den Methoden der Form-Klasse diese Instanz benutzen
__fastcall TFormObjDebug::TFormObjDebug(TComponent* Owner) : TForm(Owner) { iRename.SystemLangRename(this); }bis bald
akari
-
Vielleicht wäre es hier gut den Code von SystemLangRename in den Konstruktor zu verlegen.
-
Danke schön an euch beiden.
Denke das wird mir sehr weiterhelfen.