Problem bei der Verwendung eigener Komponenten



  • Hi,

    ich habe ein Problem bei der Verwendung selbst erstellter Komponenten:

    Ich habe mir ein TNumberEdit (abgeleitet von TEdit) erstellt,
    dass nur die Eingabe von Zahlen erlaubt.
    Wenn ich die Komponente auf ein Formular ziehe, funktioniert sie auch
    wie gewünscht.

    Dieses TNumberEdit wollte ich nun in einer von TPanel abgeleiteten Komponente (TInputCtrl) verwenden.

    Allerdings erhalte ich dabei folgende Fehler:

    [ILINK32 Fehler] Fatal: Datei 'TNUMBEREDIT.OBJ' kann nicht geöffnet werden

    Weiß jmd. wie ich dieses Problem beheben kann ?

    Gruß,
    Florian

    Die zwei Units TInputCtrl und TNumberEdit schauen wie folgt aus:

    TInputCtrl .h

    //---------------------------------------------------------------------------
    
    #ifndef TInputCtrlH
    #define TInputCtrlH
    //---------------------------------------------------------------------------
    
    #include <SysUtils.hpp>
    #include <Controls.hpp>
    #include <Classes.hpp>
    #include <ExtCtrls.hpp>
    #include <StdCtrls.hpp>
    #include "S:\\SES04\\BBO\\Zusatzkomponenten\\TNumberEdit\\Unit\\TNumberEdit.h"
    
    //---------------------------------------------------------------------------
    class PACKAGE TInputCtrl : public TPanel
    {
    private:
    	TNumberEdit *m_eEingabeSollWert;
    protected:
    public:
    	__fastcall TInputCtrl(TComponent* Owner);
    	__fastcall ~TInputCtrl(void);
    __published:
    
    };
    //---------------------------------------------------------------------------
    #endif
    

    TInputCtrl .cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    
    #pragma hdrstop
    
    #include "TInputCtrl.h"
    
    #include "S:\\SES04\\BBO\\Zusatzkomponenten\\TNumberEdit\\Unit\\TNumberEdit.h"
    
    #pragma package(smart_init)
    #pragma link "TNumberEdit"
    
    //---------------------------------------------------------------------------
    // Durch ValidCtrCheck wird sichergestellt, dass die erstellten
    // Komponenten keine rein virtuellen Funktionen enthalten.
    //
    
    static inline void ValidCtrCheck(TInputCtrl *)
    {
    	new TInputCtrl(NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall TInputCtrl::TInputCtrl(TComponent* Owner)
    	: TPanel(Owner)
    {
    	m_eEingabeSollWert = new TNumberEdit(this);
    }
    
    __fastcall TInputCtrl::~TInputCtrl()
    {
    	delete m_seEingabeSollWert;
    }
    
    //---------------------------------------------------------------------------
    namespace Tinputctrl
    {
    	void __fastcall PACKAGE Register()
    	{
    		TComponentClass classes[1] = {__classid(TInputCtrl)};
    		RegisterComponents(L"Standard", classes, 0);
    	}
    }
    //---------------------------------------------------------------------------
    

    TNumberEdit .h

    //---------------------------------------------------------------------------
    
    #ifndef TNumberEditH
    #define TNumberEditH
    //---------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    //---------------------------------------------------------------------------
    class PACKAGE TNumberEdit : public TEdit
    {
    private:
        void __fastcall numberEditKeyPress(TObject *Sender, wchar_t &Key);
    protected:
    public:
    	__fastcall TNumberEdit(TComponent* Owner);
    	__fastcall ~TNumberEdit(void);
    __published:
    };
    //---------------------------------------------------------------------------
    #endif
    

    TNumberEdit .cpp

    // ---------------------------------------------------------------------------
    
    #include <vcl.h>
    
    #pragma hdrstop
    
    #include "TNumberEdit.h"
    #pragma package(smart_init)
    
    #define DECIMALSEPERATOR ','
    
    // ---------------------------------------------------------------------------
    // Durch ValidCtrCheck wird sichergestellt, dass die erstellten
    // Komponenten keine rein virtuellen Funktionen enthalten.
    //
    
    static inline void ValidCtrCheck(TNumberEdit *)
    {
    	new TNumberEdit(NULL);
    }
    
    // ---------------------------------------------------------------------------
    __fastcall TNumberEdit::TNumberEdit(TComponent* Owner) : TEdit(Owner)
    {
    	this->OnKeyPress = numberEditKeyPress;
    }
    
    __fastcall TNumberEdit::~TNumberEdit()
    {
    
    }
    
    // ---------------------------------------------------------------------------
    namespace Tnumberedit
    {
    	void __fastcall PACKAGE Register()
    	{
    		TComponentClass classes[1] =
    		{
    			__classid(TNumberEdit)
    		};
    		RegisterComponents(L"Standard", classes, 0);
    	}
    }
    // ---------------------------------------------------------------------------
    
    void __fastcall TNumberEdit::numberEditKeyPress(TObject *Sender, wchar_t &Key)
    {
    	// Falls noch kein Dezimaltrennzeichen
    	// im Eingabestring vorhanden, Dezimaltrennzeichen einsetzen:
    	if ((Key == '.' || Key == ',')
    		&& this->Text.Length() > 0
    		&& this->Text.Pos(DECIMALSEPERATOR) == 0)
    	{
    		Key = DECIMALSEPERATOR;
    	}
    
    	// Zeichen verwerfen, falls weder ein Minus-Zeichen noch eine Ziffer
    	// am Anfang des Eingabestrings stehen
    	else if ((Key == '-' && (this->SelStart || this->Text.Pos("-"))) ||
    		((Key < '0' || Key > '9') && Key != 8 && Key != '-'))
    	{
    		Key = 0;
    	}
    }
    


  • Zuallererst solltest du nie absolute Dateipfade ("S:\...") benutzen, sondern diese sollten immer über die Projektoptionen (Include-Path, Library-Path) eingestellt werden.

    Und hast du denn beide Controls in ein Package gepackt?
    Und die Fehlermeldung kriegst du dann beim Erstellen des Packages?



  • Th69 schrieb:

    Zuallererst solltest du nie absolute Dateipfade ("S:\...") benutzen, sondern diese sollten immer über die Projektoptionen (Include-Path, Library-Path) eingestellt werden.

    Ok, werde ich so machen.

    Th69 schrieb:

    Und hast du denn beide Controls in ein Package gepackt?
    Und die Fehlermeldung kriegst du dann beim Erstellen des Packages?

    Beide Controls sind in einem seperaten Package.

    Die Fehlermeldung kommt, wenn ich das Package mit der Unit TInputCtrl
    kompilieren will.


Anmelden zum Antworten