Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Creación de componentes

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Creación de componentes Responder citando

Tengo por aquí un componente que me ha pasado XyVy, TCDDB, pero es para Builder 6 y me haría falta adaptarlo; de paso me sirve para aprender un poco más.

Si voy en Builder 5, que es el que yo tengo, a File > New me aparece un cuadro para que seleccione lo que voy a hacer y al elegir Component tengo que introducir una serie de parámetros: Ancestor type, Class Name, Palette Page, Unit File Name.

Tengo dudas con los dos primeros. ¿Cómo sé cual es el ancestro del componente que quiero crear? Por lo que he visto en ListBox que lleva esta etiqueta aparecen un montón de componentes: TAbstractSocket, TAccessAplication..., pero no sé cual es el que hay que elegir.

Class Name: ¿Qué indica este parámetro?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola:

Esos valores que te pide al crear un nuevo componenete indican lo siguiente:

-Ancesor type: Es el tipo de ascendente. Una clase puede heredar de otra sus características, convirtiéndose en una clase derivada o descendiente. Todos los componentes que forman la VCL descienden a su vez de otro, siendo la raíz común la clase “TComponent”.

-Class Name: Es el nombre de la clase del componente. Por convencionalismo se precede en el nombre la letra T (Tipo).

-Palette Page: Es el lugar donde aparecerá en la paleta de componentes., ya sea una existente o bien una nueva. Es aconsejable no utilizar las propias del C++Builder.

-“Unit file name”: Nombre del fichero cpp. Aquí escogemos la ubicación del componente.

-Search path: Seleccionamos el path del componente.


Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Gracias Kalux por las aclaraciones. Sin embargo me sigue quedando la duda que ascendiente elegir para un componente nuevo; es decir: ¿cómo elijo el más adecuado para lo que quiero hacer?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hombre, así a vote pronto, se me ocurre que si es un componente no visual, lo normal es que herede directamente de TComponent, y si es un componente parecido a otros, por ejemplo un botón, sería de TButton.

De todas formas si buscas en el proyecto del componente que te han pasado tienes que ver en el .h el tipo.

Código:
class PACKAGE TBuscar : public TComponent


Si lo que quieres es crear un nuevo componente con el código que te han pasado lo suyo es usar Nuevo Package, así dispondrás de un proyecto con el que modificar, probar e instalar.

Saludos
Félix
Volver arriba
Ver perfil de usuario Enviar mensaje privado Dirección AIM
Mensaje    Asunto: Responder citando

Gracias. La verdad es que en este tema de creación de componentes soy totalmente nuevo.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Holas...Creo que un ejemplo aclara mucho asi que te paso el codigo de como convertir un TMainMenu en uno
que interactua con los componentes y controles de bases de datos.

Para eso le agregaremos la propiedad MasterDataSource del tipo TDataSource para aprovecharnos de su evento OnStateChange.

Vamos al Menu Component/New Component, en Ancestor Type elegimos
un TMainMenu, en ClassName le inventamos uno en este caso TCBDataMenu, en Palette la paleta donde deseamos que quede,
en Unit File Name la ruta y nombre de la unit, por defecto el builder le coloca
esto automaticamente. Aceptamos y tenemos ya el .cpp y el .h con las
declaraciones basicas.

Ahora a meterle mano para añadir propiedades y metodos nuevos

La cabecera .h
Código:

//---------------------------------------------------------------------------

#ifndef CBDataMenuH
#define CBDataMenuH
//---------------------------------------------------------------------------
#include <SysUtils>
#include <Db>
#include <Classes>
#include <Menus>
#include <Forms>
#include <Controls>
#include <StdCtrls>
#include <DBClient>
#include <DBCtrls>
#include <ExtCtrls>
#include <Mask>
#include <DBGrids>
#include <Grids>
//---------------------------------------------------------------------------
class PACKAGE TCBDataMenu : public TMainMenu
{
private:
TDataSource *FMasterDataSource;
TDataSource *DataSource;

void __fastcall NuevoClick(TObject *Sender);
void __fastcall EditarClick(TObject *Sender);
void __fastcall AceptarClick(TObject *Sender);
void __fastcall CancelarClick(TObject *Sender);
void __fastcall BorrarClick(TObject *Sender);

void __fastcall DataSourceStateChange(TObject *Sender);
void __fastcall Habilitacion(bool Valor);

void __fastcall NuevoItemClick(TObject* Sender);


protected:
public:
        __fastcall TCBDataMenu(TComponent* Owner);
        void __fastcall CrearMenu();
        TMenuItem *ArchivoItem;
        TMenuItem *BorrarItem;
        TMenuItem *NuevoItem;
        TMenuItem *EditarItem;
        TMenuItem *SepItem;
        TMenuItem *AceptarItem;
        TMenuItem *CancelarItem;
__published:
__property TDataSource *MasterDataSource={read=FMasterDataSource,write=FMasterDataSource};
};
//---------------------------------------------------------------------------
#endif


Ahora el .cpp
Código:

//---------------------------------------------------------------------------

#include <basepch>

#pragma hdrstop

#include "CBDataMenu.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(TCBDataMenu *)
{
        new TCBDataMenu(NULL);
}
//---------------------------------------------------------------------------
__fastcall TCBDataMenu::TCBDataMenu(TComponent* Owner)
        : TMainMenu(Owner)
{


}
//---------------------------------------------------------------------------
namespace Cbdatamenu
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass classes[1] = {__classid(TCBDataMenu)};
                 RegisterComponents("Club Builder", classes, 0);
        }
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void __fastcall TCBDataMenu::NuevoClick(TObject *Sender)
{
 FMasterDataSource->DataSet->Append();
}
//---------------------------------------------------------------------------
void __fastcall TCBDataMenu::EditarClick(TObject *Sender)
{
 FMasterDataSource->DataSet->Edit();
}
//--------------------------------------------------------------------------
void __fastcall TCBDataMenu::AceptarClick(TObject *Sender)
{
 FMasterDataSource->DataSet->Post();
 

}
//--------------------------------------------------------------------------
void __fastcall TCBDataMenu::CancelarClick(TObject *Sender)
{
 FMasterDataSource->DataSet->Cancel();
}
//--------------------------------------------------------------------------

void __fastcall TCBDataMenu::BorrarClick(TObject *Sender)
{
if(Application->MessageBox("¿Borrar este Registro?","!!!Atencion Eliminar¡¡¡",
 MB_ICONQUESTION | MB_YESNO) == IDYES)
  FMasterDataSource->DataSet->Delete();
}
//---------------------------------------------------------------------------
void __fastcall TCBDataMenu::CrearMenu()
{


 ArchivoItem = new TMenuItem(Owner);
 ArchivoItem->Caption = "&Archivo";
 NuevoItem =new TMenuItem(Owner);
 NuevoItem->Caption = "&Nuevo";
 NuevoItem->OnClick=NuevoClick;
 ArchivoItem->Add(NuevoItem);
 EditarItem=new TMenuItem(Owner);
 EditarItem->Caption="&Editar";
 EditarItem->OnClick=EditarClick;
 ArchivoItem->Add(EditarItem);
 BorrarItem=new TMenuItem(Owner);
 BorrarItem->Caption="&Borrar";
 BorrarItem->OnClick=BorrarClick;
 ArchivoItem->Add(BorrarItem);
 SepItem=new TMenuItem(Owner);
 SepItem->Caption="-";
 ArchivoItem->Add(SepItem);
 AceptarItem=new TMenuItem(Owner);
 AceptarItem->Caption="&Aceptar";
 AceptarItem->OnClick=AceptarClick;
 AceptarItem->Enabled=false;
 ArchivoItem->Add(AceptarItem);
 CancelarItem= new TMenuItem(Owner);
 CancelarItem->Caption="&Cancelar";
 CancelarItem->OnClick=CancelarClick;
 CancelarItem->Enabled=false;
 ArchivoItem->Add(CancelarItem);
 this->Items->Add(ArchivoItem);
 ArchivoItem->MenuIndex=0;
  //*** chequear DataSource   por cambio de estado
 DataSource=new TDataSource(Owner);
 DataSource->DataSet=FMasterDataSource->DataSet;
 DataSource->OnStateChange=DataSourceStateChange;
 DataSourceStateChange(0);
}

//---------------------------------------------------------------------------
void __fastcall TCBDataMenu::DataSourceStateChange(TObject *Sender)
{

 if(DataSource->DataSet->State==dsInsert||DataSource->DataSet->State==dsEdit)
                                           
   {
    //Deshabilitar todos los Items

    Habilitacion(false);
    //Habilitar los pertinentes
    ArchivoItem->Enabled=true;
    AceptarItem->Enabled=true;
    CancelarItem->Enabled=true;
    //Poner todos los controles DB ReadOnly=false;
   
   }
  else
   {
     //Habilitar todos los Items

    Habilitacion(true);
    //Deshabilitar los pertinentes
    AceptarItem->Enabled=false;
    CancelarItem->Enabled=false;

   }
}
//---------------------------------------------------------------------------
void __fastcall TCBDataMenu::Habilitacion(bool Valor)
{
TMenuItem *Item;
TForm *Form;
Form=(TForm *)Owner;
TDBGrid *Grid;
TDBNavigator *Nav;
TDBEdit *Edit;
TDBMemo *Memo;
TDBImage *Image;
TDBListBox *List;
TDBComboBox *Combo;
TDBCheckBox *Check;
TDBRadioGroup *Radio;
TDBLookupListBox *LookList;
TDBLookupComboBox *LookCombo;
TDBRichEdit *Rich;

 for(int i=0;i<Form>ComponentCount;i++)
    {
     if (Form->Components[i]->ClassNameIs("TMenuItem"))
       {
        Item = (TMenuItem *)Form->Components[i];
        Item->Enabled=Valor;
       }
     if (Form->Components[i]->ClassNameIs("TDBGrid"))
       {
        Grid = (TDBGrid *)Form->Components[i];
        Grid->ReadOnly=Valor;
       }
     if (Form->Components[i]->ClassNameIs("TDBNavigator"))
       {
        Nav = (TDBNavigator *)Form->Components[i];
        Nav->Enabled=Valor;
       }
     if (Form->Components[i]->ClassNameIs("TDBEdit"))
       {
        Edit = (TDBEdit *)Form->Components[i];
        Edit->ReadOnly=Valor;
       }
     if (Form->Components[i]->ClassNameIs("TDBMemo"))
       {
        Memo = (TDBMemo *)Form->Components[i];
        Memo->ReadOnly=Valor;
       }
     if (Form->Components[i]->ClassNameIs("TDBImage"))
       {
        Image = (TDBImage *)Form->Components[i];
        Image->ReadOnly=Valor;
       }
     if (Form->Components[i]->ClassNameIs("TDBListBox"))
       {
        List = (TDBListBox *)Form->Components[i];
        List->ReadOnly=Valor;
       }
     if (Form->Components[i]->ClassNameIs("TDBComboBox"))
       {
        Combo = (TDBComboBox *)Form->Components[i];
        Combo->ReadOnly=Valor;
       }
     if (Form->Components[i]->ClassNameIs("TDBCheckBox"))
       {
        Check = (TDBCheckBox *)Form->Components[i];
        Check->ReadOnly=Valor;
       }
     if (Form->Components[i]->ClassNameIs("TDBRadioGroup"))
       {
        Radio = (TDBRadioGroup *)Form->Components[i];
        Radio->ReadOnly=Valor;
       }
     if (Form->Components[i]->ClassNameIs("TDBLookupListBox"))
       {
        LookList = (TDBLookupListBox *)Form->Components[i];
        LookList->ReadOnly=Valor;
       }
     if (Form->Components[i]->ClassNameIs("TDBLookupComboBox"))
       {
        LookCombo = (TDBLookupComboBox *)Form->Components[i];
        LookCombo->ReadOnly=Valor;
       }
     if (Form->Components[i]->ClassNameIs("TDBRichEdit"))
       {
        Rich = (TDBRichEdit *)Form->Components[i];
        Rich->ReadOnly=Valor;
       }
    }
//--------------------------------------------------------------------------}


Una vez terminado guardamos y cerramos, ahora Menu Component/Install Component y elegimos la unit recien guardada, esperamos a que compile y luego tenemos el nuevo componente instalado y listo para usar.

Uso: Colocamos un TCBDataMenu en un form donde tengamos tablas y compontes de datos, en la nueva propiedad del menu (MasterDataSorce)
elegimos el datasource que apunte a la tabla a controlar, la maestra en el caso de master/detail.

Uppsss, olvide algo importante, para que funcione en el form create
hay que poner TCBDataMenu1->CrearMenu();

Compilamoy corremos el proyecto, podemos verificar que el menu interactua con los componentes de datos y tanbien responde al estado
de la tabla automaticamente habilitando y deshabilitando los items segun
el estado de esta.

Espero que te sirva, de compos no se mucho pero lo poco esta a la orden del foro.


Ultima edición por alfredo el Sab 15 Mar, 2008 3:10 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

¡Hala! Y ahora tengo que digerirlo Very Happy Muchas gracias por el ejemplo.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.