 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 03 Mar, 2008 12:32 pm Asunto: Creación de componentes |
|
|
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 |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Lun 03 Mar, 2008 9:26 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 04 Mar, 2008 8:07 am Asunto: |
|
|
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 |
|
 |
frios Lt

Registrado: 20 Nov 2005Mensajes: 79Ubicación: España
|
Publicado: Mie 05 Mar, 2008 11:36 am Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Mie 05 Mar, 2008 12:29 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|