BorlandTalk.com Forum Index BorlandTalk.com
Borland discussion newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Using a Frame Template inside a Component

 
Post new topic   Reply to topic    BorlandTalk.com Forum Index -> C++ Builder (VCL Components Development)
View previous topic :: View next topic  
Author Message
Ettienne Gilbert
Guest





PostPosted: Mon Mar 06, 2006 11:03 am    Post subject: Using a Frame Template inside a Component Reply with quote



If a component contains a number of controls it often becomes quite tedious
to create and position the controls in the component's constructor - as well
as set their relevant properties.

I've wondered and decided to investigate if it is possible to use a Frame
template inside the Component. It seems like a "best of both worlds"
solution - the controls are placed in a Frame (with BCB's support of "visual
designing" on Frames i.e. easy placement, editing, etc.). The Frame are then
used as the only Control in the Component - and typically the only thing
that needs to be done in the Component's constructor is to create the Frame
and set its Parent and Alignment.

This seems to work at first - the Component (containing its Frame) builds
and installs succesfully to the Palette. Placing the Component on a Form
also shows the Frame (with its child Controls) as expected. The project
(containing the Component) also builds successfully.

But the project crashes when run with the following error
(TPrFileDisplayFrame is the class name of the Frame - not the Component):

"Project Project2.exe raised exception class EClassNotFound with message
'Class TPrFileDisplayFrame not found'. Process stopped. Use Step or Run to
continue."

The project is stopped on on the application's main Form's constructor:

/* TCustomForm.Create */ inline __fastcall virtual
TForm(Classes::TComponent* AOwner) : TCustomForm( AOwner) { }

I'm somewhat non-plussed - Shouldn't the Frame then be compiled into the
Component library package? How can the Frame object successfully be resolved
during building of the app, but not when the app is run?

I am using Win2000 with BCB5 Update 1.

Regards,
Ettienne
Back to top
Clayton Arends
Guest





PostPosted: Mon Mar 06, 2006 5:03 pm    Post subject: Re: Using a Frame Template inside a Component Reply with quote



I must be missing something since I can't replicate the error message. I
fully expected to be able to. What I've come up with is a situation where
the embedded frame is always there but any changes made to it on the form
are not stored in the DFM. Which might be what you're looking for anyhow.
I'm sure I'm just missing something in what I've created but here it is.

// Frame header (note, created visually and the global 'EmbedFrame'
// object has been removed from the code)
// unit = testEmbedFrame
class PACKAGE TEmbedFrame : public TFrame
{
__published: // IDE-managed Components
TButton *Button1;
private: // User declarations
public: // User declarations
__fastcall TEmbedFrame(TComponent* Owner);
};

// Control header
// unit = FrameComp
#include "testEmbedFrame.h"
class PACKAGE TFrameComp : public TCustomControl
{
typedef TCustomControl inherited;
private:
TEmbedFrame* fEmbedFrame;
void __fastcall set_EmbedFrame(TEmbedFrame* Value);
public:
__fastcall TFrameComp(TComponent* AOwner);
__published:
__property TEmbedFrame* EmbedFrame = {
read = fEmbedFrame, write = set_EmbedFrame };
};

// Control CPP
__fastcall TFrameComp::TFrameComp(TComponent* AOwner) : inherited(AOwner)
{
fEmbedFrame = new TEmbedFrame(this);
fEmbedFrame->Parent = this;
}

void __fastcall TFrameComp::set_EmbedFrame(TEmbedFrame* Value)
{
fEmbedFrame->Assign(Value);
}

namespace Framecomp
{
void __fastcall PACKAGE Register()
{
TMetaClass* components[] = { __classid(TFrameComp) };
RegisterComponents("Test", components, 0);
RegisterClass(__classid(TEmbedFrame)); // is of no consequence in this
// current scenario since the frame isn't getting stored in the DFM
}
}

Can you post your code so that I can see what you are doing. Also, I'm
using BCB6.
- Clayton
Back to top
Ettienne Gilbert
Guest





PostPosted: Mon Mar 06, 2006 5:03 pm    Post subject: Re: Using a Frame Template inside a Component Reply with quote



Following some advice found after searching the Web I tried to Register the
Frame class as follows:

namespace Tprfiledisplayframeunit
{
void __fastcall PACKAGE Register()
{
RegisterClass(__classid(TPrFileDisplayFrame));
}
}
//--------------------------------------------------------------------------
-

Note that 'TPrFileDisplayFrame' is the class name - derived from TFrame.
'Tprfiledisplayframeunit' is the namespace name - which is the same as the
Frame's CPP unit name. ('TPrFileDisplay' is the actual component class name
(derived from TPanel)).

Registering the class does not make any difference - I still get the same
'EClassNotFound ' error. Likewise, adding the RegisterClass() call to the
Component's Register procedure does not help - I still get the same error:

namespace Tprfiledisplay
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TPrFileDisplay)};
RegisterComponents("PRISM", classes, 0);

RegisterClass(__classid(TPrFileDisplayFrame));
}
}
//--------------------------------------------------------------------------
-

I guess I can still fall back on putting all the functionality in the Frame
templates (if all else fails) ...:-(

Any assistance will be appreciated.
Regards,
Ettienne
Back to top
Ettienne Gilbert
Guest





PostPosted: Thu Mar 09, 2006 1:03 pm    Post subject: Re: Using a Frame Template inside a Component Reply with quote

Thanks for the example Clayton. - it proved helpful to find the error. The
mistake I made was in the creation of the Frame object in the constructor of
the Component:

__fastcall TPrFileDisplay::TPrFileDisplay(TComponent* Owner) :
TPanel(Owner)
{
PrFileDisplayFrame = new TPrFileDisplayFrame(Owner);
//...
}

instead of:

__fastcall TPrFileDisplay::TPrFileDisplay(TComponent* Owner) :
TPanel(Owner)
{
PrFileDisplayFrame = new TPrFileDisplayFrame(this);
//...
}

This meant that the Owner of the Frame was the Form - causing the
EClassNotFound error. Once I had changed the owner of the Frame to the
Component everything worked.

Thanks again.
Ettienne
Back to top
Display posts from previous:   
Post new topic   Reply to topic    BorlandTalk.com Forum Index -> C++ Builder (VCL Components Development) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.