OVH Cloud OVH Cloud

[BCB6] Prb de conception de compo herite de TTreeWiev

3 réponses
Avatar
Olivier
Bonjour
je conçois un composant qui herite de TTreeView ,et me permet en plus de
charger l'image de fond de mon controle .

j'ai suivi le tutoriel de CGI pour "le tapisseur"
http://chgi.developpez.com/compo/

cependant le composant se compile puis s'installe et BCB crie
d'autre par dans la palette quand le selectionne et que je le pose sur un
formulaire il me dit "Erreur interne efface"

Mon fichier dcr s'apelle TMyTreeView.dcr et l'icone est 24x24
avec le nom en majuscule

j'ai bien l'icone dans ma palette.

voici le source

l*.h
Code:
file://---------------------------------------------------------------------
------

#ifndef TMyTreeViewH
#define TMyTreeViewH
file://---------------------------------------------------------------------
------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <ComCtrls.hpp>
#include <Controls.hpp>
#include <Graphics.hpp>
file://---------------------------------------------------------------------
------
class PACKAGE TMyTreeView : public TTreeView
{
private:

TTreeView *_pTv;
AnsiString _PathImgBackRound;
void __fastcall SetPath_Img(const AnsiString &Path);
AnsiString __fastcall GetPath_Img();


protected:
virtual void __fastcall PaintBackgroundToTreeView(TCustomTreeView *Sender,
const TRect &ARect, bool &DefaultDraw) ;

public:
__fastcall TMyTreeView(TComponent* Owner);
__published:

__property Align;
__property BorderStyle;
__property Items;
__property Canvas;
__property Color;
__property Font;
__property Images;
__property ReadOnly;
__property AnsiString Path_Img = {read=GetPath_Img, write=SetPath_Img}; // ex: c:\\fond.bmp

};
file://---------------------------------------------------------------------------
#endif

puis le cpp

Code:
file://---------------------------------------------------------------------------

#include <vcl.h>

#pra
gma hdrstop

#
include "TMyTreeView.h"
#include "MyError.h"
#pragma package(smart_init)
file://---------------------------------------------------------------------
------
// ValidCtrCheck est utilisé pour vérifier que les composants créés n'ont
// aucune fonction virtuelle pure.
//

static inline void ValidCtrCheck(TMyTreeView *)
{
new TMyTreeView(NULL);
}
file://---------------------------------------------------------------------------
__fastcall TMyTreeView::TMyTreeView(TComponent* Owner)
: TTreeView(Owner)
{
_pTv=(TTreeView*)Owner;
Path_Img="";
_PathImgBackRound="";
_pTv->OnCustomDraw=PaintBackgroundToTreeView;
}
file://---------------------------------------------------------------------------
namespace Tmytreeview
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TMyTreeView)};
RegisterComponents("MesCompos", classes, 0);
}
}
file://---------------------------------------------------------------------------
void __fastcall TMyTreeView::SetPath_Img(const AnsiString &Path)
{
if(Path==""){
TMyError Err(1,"Chemin vide"); file://TMyErrror une classe
file://d'erreur perso
throw Err;
}

if(_PathImgBackRound != Path) {
_PathImgBackRound = Path;
}
}
file://------------------------------------------------------------------------------
AnsiString __fastcall TMyTreeView::GetPath_Img()
{
return _PathImgBackRound;
}
file://------------------------------------------------------------------------------
void __fastcall TMyTreeView::PaintBackgroundToTreeView(TCustomTreeView *Sender,
const TRect &ARect, bool &DefaultDraw)
{

Graphics::TBitmap *pImg = new Graphics::TBitmap();

try {
pImg->LoadFromFile(Path_Img);


for(int x=0 ; x < Width ; x+=pImg ->Width){

for (int y=0 ; y < Height ; y+=pImg ->
Height){

_
pTv->Canvas->Draw(x,y,pImg);
}
}


}catch(EFOpenError
r){

MessageDlg("Impossible de charger l'image :\n" +Path_Img,
mtError, TMsgDlgButtons() << mbOK, 0);

delete pImg ;
}
delete pImg ;

}//------------------------------------------------------------------------------

d'autre par j'ai parametré le paquet d'execution en conception
et execution est ce une bonne solution ?

Il y a d'autre parametre a toucher,j'ai active aussi codeguard

Autre chose je voudrais que sur la propriete Path_Img en mode conception apparaisse une boite de dialogue permettant de
choisir le fichier (comme fichier->Ouvrir par exemple avec un filtre)
comment faire pour que cela soit dans l'inspecteur d'object ?

Il y a t'il des chose a mettre dans le destructeur ?

Comment faire pour faire du pas a pas (debug) avec le compo et un
form ?

encore merci de votre aide
-
Cordialement ,
Sarda Olivier

Site Web:
http://membres.lycos.fr/osarda

3 réponses

Avatar
Michel Leunen
Olivier wrote:

cependant le composant se compile puis s'installe et BCB crie
d'autre par dans la palette quand le selectionne et que je le pose sur un
formulaire il me dit "Erreur interne efface"



Erreur souvent en relation avec les blocs try/catch

}catch(EFOpenError
r){



On catch les exceptions par référence:

catch(EFOpenError &r)

d'autre par j'ai parametré le paquet d'execution en conception
et execution est ce une bonne solution ?



Ca, c'est à toi de voir. Dans un cas, tu dois redistribuer certaines
dll, et pas dans l'autre cas.


Autre chose je voudrais que sur la propriete Path_Img en mode conception apparaisse une boite de dialogue permettant de
choisir le fichier (comme fichier->Ouvrir par exemple avec un filtre)
comment faire pour que cela soit dans l'inspecteur d'object ?



Tu dois créer un property Editor. Le sujet est un peu trop vaste pour
être traité ici. Je crois qu'il y a des exemples dans l'aide sinon Google...

Il y a t'il des chose a mettre dans le destructeur ?



Pas dans ton cas.


Comment faire pour faire du pas a pas (debug) avec le compo et un
form ?



Tu crées une appli qui utilise ton composant en l'initialisant lors de
son exécution. Autrement dit, tu ne le mets pas sur ta form mais tu
l'initialises avec new sans oublier d'ajouter à ton projet le fichier
source de ton composant et d'inclure son fichier d'entête dans ton
Unit1.h ou Unit1.cpp.

Michel
--
----------------------------------------
Michel Leunen
mailto:
http://www.leunen.com/cbuilder/
----------------------------------------
Avatar
Michel Leunen
Olivier wrote:

__fastcall TMyTreeView::TMyTreeView(TComponent* Owner)
: TTreeView(Owner)
{
_pTv=(TTreeView*)Owner;
_pTv->OnCustomDraw=PaintBackgroundToTreeView;



_pTv est inutile puisque ton composant descend de TTreeView. Tu peux
écrire simplement
OnCustomDraw=PaintBackgroundToTreeView;



void __fastcall TMyTreeView::PaintBackgroundToTreeView(TCustomTreeView *Sender,
const TRect &ARect, bool &DefaultDraw)
{

if(PathImgBackRound==""){
return;
}



Graphics::TBitmap *pImg = new Graphics::TBitmap();

try



{
pImg->LoadFromFile(PathImgBackRound);
for(int x=0 ; x < this->Width ; x+=pImg
idth){
for (int y=0 ; y < this->Height ; y+=pImg ->Height){
_pTv->Canvas->Draw(x,y,pImg);


Idem que plus haut:
Canvas->Draw(...);
}
}
}catch(EFOpenError &Err){

MessageDlg("Impossible de charger l'image :n" +PathImgBackRound,
mtError, TMsgDlgButtons() << mbOK, 0);

}


delete pImg ;

}



ou est encore mon erreur ?



Mais rien dans ce que je t'ai dit n'est à l'origine de ton erreur.
Malheureusement, je n'ai pas BCB installé ici et je ne peux donc pas
faire de test avec ton code. Il va falloir que tu testes ton composant
avec ton débugger.

Michel
--
----------------------------------------
Michel Leunen
mailto:
http://www.leunen.com/cbuilder/
----------------------------------------
Avatar
Olivier
j'ai fait les modifs que tu m'adit mais j'ai
toujours le meme probleme
debordement de pile que je pose le compo

si tu as 5 mn pourra tu jetter un oeil?

encore merci
--
Cordialement ,
Sarda Olivier

Site Web:
http://membres.lycos.fr/osarda


Michel Leunen a écrit dans le message :
3f422d8f$0$292$
Olivier wrote:

> __fastcall TMyTreeView::TMyTreeView(TComponent* Owner)
> : TTreeView(Owner)
>



> _pTv=(TTreeView*)Owner;
> _pTv->OnCustomDraw=PaintBackgroundToTreeView;

_pTv est inutile puisque ton composant descend de TTreeView. Tu peux
écrire simplement
OnCustomDraw=PaintBackgroundToTreeView;



> void __fastcall TMyTreeView::PaintBackgroundToTreeView(TCustomTreeView


*Sender,
> const TRect &ARect, bool


&DefaultDraw)
>



>
>


PathImgBackRound==""){
> return;
> }
>
>
>
> Graphics::TBitmap *pImg = new Graphics::TBitmap();
>
> try

{
> pImg->LoadFromFile(PathImgBackRound);
> for(int x=0 ; x < this->Width ; x+=pImg
> idth){
> for (int y=0 ; y < this->Height ; y+=pImg ->Height){
> _pTv->Canvas->Draw(x,y,pImg);
Idem que plus haut:
Canvas->Draw(...);
> }
> }
> }catch(EFOpenError &Err){
>
> MessageDlg("Impossible de charger l'image :n" +PathImgBackRound,
> mtError, TMsgDlgButtons() << mbOK, 0);
>
> }
>
>
> delete pImg ;
>
> }

> ou est encore mon erreur ?

Mais rien dans ce que je t'ai dit n'est à l'origine de ton erreur.
Malheureusement, je n'ai pas BCB installé ici et je ne peux donc pas
faire de test avec ton code. Il va falloir que tu testes ton composant
avec ton débugger.

Michel
--
----------------------------------------
Michel Leunen
mailto:
http://www.leunen.com/cbuilder/
----------------------------------------