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-Deklarationen
    

    jetzt 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.


Anmelden zum Antworten