16
26-03-2010 ElDuc Registrado  Registrado: jul 2004 Posts: 90 Componentes en tiempo de diseño Señores, Sigo luchando por aprender sobre la creación de componentes, pero encuentro muchos  problemas, ha ver si pudierais ayudarme. Tengo un componente no visual y me interesaría que cuando lo inserto en un formulario me creara otro componente, visual o no, dentro de ese formulario, por ejemplo un TLabel o un TADOConnection. ESTAMOS EN TIEMPO DE DISEÑO.  Ni siquiera sé si eso es posible. Espero que alguien pueda sacarme de este estancamiento. ElDuc Ver Perfil Enviar un mensaje privado a ElDuc Encontrar Todos los Mensajes de ElDuc Agregar a ElDuc a Tu Lista de Amigos # 2  26-03-2010 andres1569 Registrado  Registrado: may 2003 Posts: 907 Sí que se puede hacer. Si dicho componente "adjunto" lo creas en el mismo constructor Create, debes pasarle como Owner el mismo que recibes, para que dependa del mismo formulario. Si el componente "adjunto" es visual, es decir un Control, debes decidir dónde se ubicará, si dentro del formulario o bien dentro de un Panel por ejemplo, asignándole la propiedad Parent: Código Delphi [-] constructor MiComponente.Create(AOwner: TComponent); begin inherited Create(AOwner); ConexADO := TADOConnection.Create(  AOwner); (...) MiLabel := TLabel.Create(AOwner); if AOwner is TWinControl then MiLabel.Parent := TWinControl(AOwner); end; Lo más normal, al trabajar en diseño, es que el Owner sea el formulario sobre el que estés trabajando.

Componentes en tiempo de diseño

Embed Size (px)

Citation preview

Page 1: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 1/16

 

26-03-2010

ElDuc Registrado

 Registrado: jul 2004Posts: 90

Componentes en tiempo de diseño Señores,

Sigo luchando por aprender sobre la creación de componentes, pero encuentro muchos problemas, ha ver si pudierais ayudarme.

Tengo un componente no visual y me interesaría que cuando lo inserto en un formulariome creara otro componente, visual o no, dentro de ese formulario, por ejemplo unTLabel o un TADOConnection. ESTAMOS EN TIEMPO DE DISEÑO.

 Ni siquiera sé si eso es posible.

Espero que alguien pueda sacarme de este estancamiento.

ElDuc

Ver Perfil

Enviar un mensaje privado a ElDuc

Encontrar Todos los Mensajes de ElDuc

Agregar a ElDuc a Tu Lista de Amigos

#2 

 

26-03-2010

andres1569 Registrado

 Registrado: may 2003Posts: 907

Sí que se puede hacer.

Si dicho componente "adjunto" lo creas en el mismo constructor Create, debes pasarlecomo Owner el mismo que recibes, para que dependa del mismo formulario. Si elcomponente "adjunto" es visual, es decir un Control, debes decidir dónde se ubicará, si

dentro del formulario o bien dentro de un Panel por ejemplo, asignándole la propiedadParent:

Código Delphi [-]constructor MiComponente.Create(AOwner: TComponent);begininherited Create(AOwner);ConexADO := TADOConnection.Create( AOwner);(...)MiLabel := TLabel.Create(AOwner);if AOwner is TWinControl then MiLabel.Parent := TWinControl(AOwner);

end;

Lo más normal, al trabajar en diseño, es que el Owner sea el formulario sobre el queestés trabajando.

Page 2: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 2/16

 

Saludos __________________ Guía de Estilo 

andres1569

Ver Perfil

Enviar un mensaje privado a andres1569

Enviar Correo a andres1569

Encontrar Todos los Mensajes de andres1569

Agregar a andres1569 a Tu Lista de Amigos

#3 

 

26-03-2010ElDuc Registrado

 Registrado: jul 2004Posts: 90

Gracias Andres1569

Yo ya había probado algo parecedoCódigo Delphi [-]Constructor _TgvApplication.Create(AOwner:TComponent);BeginInherited Create(AOwner);

Label_1:=TLabel.Create(AOwner);Label_1.Parent:=TWinControl(AOwner);End;

 No condiciono la asignación de Parent porque previamente ya lo había hecho ponientoun breakpoint y comprobando el tipo AOwner.

También he probado de utilizar ComponentState, pero poniendo un breakpoint entiempo de diseño no me funciona, no sé si tiene algo que ver.

Pero no me funciona, ¿qué piensas que hago mal?

Última edición por ElDuc fecha: 26-03-2010 a las 19:00:17.

ElDuc

Ver Perfil

Enviar un mensaje privado a ElDuc

Encontrar Todos los Mensajes de ElDuc

Agregar a ElDuc a Tu Lista de Amigos

#4 

 

26-03-2010andres1569  Registrado: may 2003

Page 3: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 3/16

 

Registrado Posts: 907

¿Qué es lo que no funciona? ¿No te aparece el Label por ningun sitio?

El objeto Owner, ¿de qué clase es? ¿es realmente un formulario? Si es un Control trata

de obtener el formulario padre mediante GetParentForm(Owner) a ver qué te devuelve.

Ahora no tengo a mano el Delphi y te hablo de memoria, pero hace años implementéalgo así, puede que haya que acceder al diseñador (propiedad FormDesigner -oDesigner- de un TForm) pero esto desde Delphi 6 plantea problemas pues no está

 permitido durante RunTime utilizar clases propias del diseño (contenidas en la unitDsgnIntf.pas)

Siento no poder ayudarte más en este momento ... __________________ Guía de Estilo 

andres1569

Ver Perfil

Enviar un mensaje privado a andres1569

Enviar Correo a andres1569

Encontrar Todos los Mensajes de andres1569

Agregar a andres1569 a Tu Lista de Amigos

#5 

 

27-03-2010

ElDuc Registrado

 Registrado: jul 2004Posts: 90

Estoy haciendo muchas pruebas, pero no funciona.

Es como si el método Create de mi componente sólo se ejecutara cuando ejecuto el programa (Run) pero no cuando inserto mi componente en el formularioa, que escuando realmente necesito crear el otro componente en el formulario.

Posiblemente sea otro método o evento lo que debo controlar.

ElDuc

Ver Perfil

Enviar un mensaje privado a ElDuc

Encontrar Todos los Mensajes de ElDuc

Agregar a ElDuc a Tu Lista de Amigos

#6 

Page 4: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 4/16

 

27-03-2010

ElDuc Registrado

 Registrado: jul 2004Posts: 90

Es evidente que está sucediendo lo que he descrito en el post anterior.

Ge conseguido que mi componente no visual cree otro componente visual en elmomento que ejecuto el programa, método Create del componente, pero no cuandoinserto el componente no visual en el formulario que es cuando yo lo necesito.

Creo que debo actuar sobre otro método o evento, ¿sabéis en cual?

ElDuc

Ver Perfil

Enviar un mensaje privado a ElDuc

Encontrar Todos los Mensajes de ElDuc

Agregar a ElDuc a Tu Lista de Amigos

#7 

 

27-03-2010

andres1569 Registrado

 Registrado: may 2003Posts: 907

Hola,

He hecho algunas pruebas y sí que se consigue crear ambos tipos de componentes,aunque he detectado algún problema con el componente NO Visual en versionesantiguas de Delphi (la 4 en concreto, en Delphi 6 no pasa). Ocurre que cuando se creadicho componente NO visual, al no poder tener una representación en pantalla, el iconode éste no aparece, pero sí que está. Si guardo el formulario y lo vuelvo a abrir, ahí está,en la esuqina superior izquierda. Con los controles no sucede pues cuando le asignas elParent enseguida aparece situado dentro de dicho Parent.

Deberías mirar si en la declaración de componentes del formulario te aparece dicho

componente NO Visual (aunque para eso le tienes que haber asignado un nombre, cosaque el IDE hace por defecto cuando soltamos un componente desde la paleta pero quedebes realizar tú en este caso). Si te aparece es que todo ha ido bien, aunque, claro, loque tú querrías es que apereciera su icono sobre el formulario automáticamente para

 poderle asignar propiedades (ésto es lo que falla en la versión 4 y supongo que enanteriores, y que no he conseguido solucionar).

Te pongo un componente que he utilizado de pruebas, para que lo revises. Este códigohace uso de la función GetParentForm para obtener el formulario padre a partir delAOwner (en caso de que éste sea un TControl). También te pongo una funciónFindUniqueName que sirve para asignarle un nombre automáticamete y que no esté

repetido.

Page 5: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 5/16

 

Código Delphi [-]unit CompPrueba;

interface

uses Classes, SysUtils, Controls, Forms, StdCtrls, DB, ADODB;

typeTComponentePrueba = class(TComponent)privateMyADOConexion : TADOConnection; // Componente No VisualMyLabel : TLabel; // Componente Visual

publicconstructor Create(AOwner: TComponent); override;

end;

function FindUniqueName(AOwner: TComponent; const BaseName: string):string;

procedure Register;

implementation

procedure register;beginRegisterComponents('Pruebas', [TComponentePrueba]);

end;

// Esta función nos ayuda a dar nombre a un componente evitando queesté repetidofunction FindUniqueName(AOwner: TComponent; const BaseName: string):string;

vari : Integer;

begini := 1;repeatresult := Format('%s%d', [BaseName, i]);Inc(i);

until AOwner.FindComponent(result) = nil;end;

{ TComponentePrueba }

constructor TComponentePrueba.Create(AOwner: TComponent);

varAForm : TCustomForm;

begininherited Create(AOwner);// Sólo creamos los componentes "adjuntos" si AOwner no es nil y si

no estamos// cargando el formulario de un Streamif Assigned(AOwner) AND NOT (csLoading in AOwner.ComponentState)

thenbegin// CREACION DE UN Componente NO visualMyADOConexion := TADOConnection.Create(AOwner);MyADOConexion.Name := FindUniqueName(AOwner,

MyADOConexion.ClassName);

Page 6: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 6/16

 

// CREACION DE UN Componente visual (TControl) ==> Hay que asignarel Parent,// que puede ser el formulario u otro control descendiente de

TWinControlMyLabel := TLabel.Create(AOwner);MyLabel.Name := FindUniqueName(AOwner, MyLabel.ClassName);

MyLabel.Caption := 'Label de prueba';AForm := nil;if AOwner is TControl then AForm :=

GetParentForm(TControl(AOwner));if AForm <> nil then MyLabel.Parent := AForm;

end;end;

end.

Saludos __________________ 

Guía de Estilo 

andres1569

Ver Perfil

Enviar un mensaje privado a andres1569

Enviar Correo a andres1569

Encontrar Todos los Mensajes de andres1569

Agregar a andres1569 a Tu Lista de Amigos

#8 

 

27-03-2010

ElDuc Registrado

 Registrado: jul 2004Posts: 90

Resuelto Hola Andes1569,

Lo he probado y funciona perfectamente sin tener que tocar nada.

Muchas gracias, la tuya ha sido una colaboración completa, me has hechocompletamente los deberes.

Perdona, pero aprovechando qu entiendes un rato de esto, ¿me puedes decir algo de loseditores de propiedades?

 Necesito crear uno para mi componente y he buscado manuales por internet, pero lo quehe encontrado

Los pasos que es necesario seguir para escribir un editor de propiedades son lossiguientes:

Page 7: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 7/16

 

· Crear una nueva unidad en la que definiremos el editor de propiedades. Más

adelante hablaremos más extensamente sobre este punto, ya que no es tan trivial

como puede parecer en principio

· Añadir la unidad DsgnIntf a la clausula uses del editor de propiedades. En esta

unidad estan definidos los editores de propiedades por defecto que utiliza Delphi,

además de la importantísima clase TPropertyEditor, la cuál es la clase base de

todos los editores de propiedades.

· Crear una nueva clase que descienda de TPropertyEditor o de alguno de sus

desciendentes. Por convención, el nombre de los editores de propiedades finaliza

con la palabra Property. P.e. TIntegerProperty, TStringProperty...

A continuación se muestran los principales editores de propiedades por defecto

que incorpora Delphi.

Editor de propiedades Tipo

TPropertyEditor Clase base para todos los editores de propiedades

TIntegerProperty Byte, word, integer, LongintTCharProperty Char

TEnumProperty Tipos enumerados

TSetProperty Sets

TFloatProperty Single, Double, Extended, Comp, Currency

TStringProperty Strings

TClassProperty Cualquier objeto

TMethodProperty Cualquier método (eventos)

TComponentProperty Para propiedades que hacen referencia a componentes

· Implementar los métodos necesarios para dotar al editor de propiedades de las

funcionalidades deseadas.· Registrar el editor de propiedades en la VCL

no es compatible con delph7, el que yo utilizo, ya que delphi 7 no tiene DsgnIntf, por internet dicen que delphi 7 utiliza DesignIntf, pero éste no tiene TPropertyEditor ni losdemás bases de editor por lo que estoy atascado aquí.Última edición por ElDuc fecha: 27-03-2010 a las 16:58:10.

ElDuc

Ver Perfil

Enviar un mensaje privado a ElDuc

Encontrar Todos los Mensajes de ElDuc

Agregar a ElDuc a Tu Lista de Amigos

#9 

 

27-03-2010

andres1569 Registrado

 Registrado: may 2003Posts: 907

Me alegro, sólo añadir que llamo a la función FindUniqueName pasándole el nombre

Page 8: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 8/16

 

de la clase, sería bueno quitarle la "T" que llevan por convenio las clases, y así elnombre sería igualito al que genera el IDE:

Label1 en vez de TLabel1

Saludos __________________ Guía de Estilo 

andres1569

Ver Perfil

Enviar un mensaje privado a andres1569

Enviar Correo a andres1569

Encontrar Todos los Mensajes de andres1569Agregar a andres1569 a Tu Lista de Amigos

#10 

 

31-03-2010

andres1569 Registrado

 Registrado: may 2003Posts: 907

Hola:

Te pongo aquí una explicación detallada de este asunto, espero te resulte útil. Al final te pongo un link a un curso muy recomendado para iniciarse en esto de crear componentes propios.

En efecto, tal como dice esa explicación, puedes crear tus propios editores de propiedades (descendientes de TPropertyEditor) y editores de componentes (desciendende TComponentEditor).

Los primeros se usan desde el Object Inspector, y resultan útiles cuando la propiedad encuestión tiene cierta complejidad, o incluso si siendo simple quieres darle untratamiento personalizado. No creo que te haga falta, por ejemplo, para introducir un

Integer, o un String ... pero sí en cambio es útil tener un editor de fuentes que enrealidad es una clase TFontProperty que lanza un cuadro de diálogo donde editar lafuente (TFontDialog). Lo mismo cuando quieres introducir el nombre de un archivo,aparte de poderlo introducir escribiendo, puedes crear p.e. un "TFileNameProperty" quemuestre al usuario un TOpenDialog de donde elegir el archivo deseado. Básicamentehay que sobreescribir los métodos GetValue y SetValue para controlar cómo se toma elvalor de la propiedad y cómo se asigna luego. Otro método que suele sobreescribirse esGetAttributes, donde puedes fijar algunas características tales como si se desplegaráuna lista con los posibles valores en el ObjectInspector, si dicha lista apareceráordenada, o si la propiedad podrá editarse simultaneamente para más de uncomponente. Y puesto que ya hay muchas clases que vienen "de fábrica" descendientes

de TPropertyEditor, como TStringEditor, TClassEditor, TIntegerEditor ... conviene queelijas de cuál te resulta más ventajoso heredar.

Page 9: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 9/16

 

Los TComponentEditor permiten crear editores para todo el componente, normalmentellaman a un formulario donde de forma más amena se pueden alterar unas cuantas, sinotodas, las propiedades del componente, un ejemplo es el editor del componente TChart(el que aparece cuando haces doble click sobre el mismo), que además muestra el

resultado final a medida que vas cambiando valores. Los editores de componentes selanzan desde el menú flotante del componente, por ello es básico reescribir los métodosGetVerbCount (donde indicas cuántas entradas de menú vas a utilizar), GetVerb (dondeindicas el caption de cada entrada del menú) y ExecuteVerb (que según el parámetroIndex indica la entrada de menú seleccionada por el usuario para que actúes enconsecuencia). Recuerda que la primera entrada del menú es la que se ejecutará por defecto cuando hagas doble click sobre el componente.

Es importante conocer algunas de la propiedades con las que contamos en estas clases.En concreto la propiedad Designer, que se refiere al diseñador del IDE. Si por ejemplo

lanzas un editor de una propiedad / componente que altera algún valor, debes hacer unallamada a Designer.Modified para indicarle a Delphi que se han producido cambios (asíno te llevarás la sorpresa de que no te pida guardar al salir). Puede que necesitestambién hacer uso del método GetComponent de ambas clases, que devuelve -según elíndice que le pases como parámetro- el componente que se está editando, ya que puedeser que se estén editando varios simultaneamente.

Otra cosa IMPORTANTE, hay un antes y un después de Delphi 6 en esto de loseditores de diseño:

Antes de Delphi 6, las clases TPropertyEditor y TComponentEditor venían, junto con

una ristra de descendientes, en la unit DsgnIntf.pas y esta unit podías incluso incluirlaen un ejecutable final, de hecho hay varias utilidades por ahí que permitían mostrar algo parecido a un ObjectInspector en runtime para cambiar propiedades durante laejecución del programa, estas utilidades hacían uso de dicha unit que les simplificabamucho el trabajo.

Desde Delphi 6 esto ya no está permitido, pues entonces Borland decidió que vulnerabaderechos de copyright relacionados con el IDE de Delphi, y que no podían ir incluidosen ningún ejecutable final. Por ese motivo, se trasladaron todas esas clases a variasunits, a saber: DesignEditors, DesignMenus y DesignWindows (puedes encontrar losfuentes en la carpeta de Delphi \Source\ToolsAPI). Esto también implica que a partir de

la versión 6, si quieres crear tus propios editores de propiedades/componentes, debescrear un paquete exclusivamente de diseño, donde puedes referenciar dichas unidades, y

 para distribución creas otro paquete, de ejecución exclusivamente. La única diferenciaentre uno y otro estará en que el de diseño llevará dichos editores, y es el que registrarásen el IDE de Delphi para que te aparezcan en la paleta. Ten en cuenta, también, queestas tres units no están accesibles como archivos .DCU, sino que residen en un

 package llamado designide.dcp. Esto implica que para poder usarlas en el package dediseño debes incluir el package designide.dcp en su cláusula Requires.

A todo esto, a partir de Delphi 6 la unit DsgnIntf.pas cambia de nombre aDesignIntf.pas, y alberga únicamente interfaces y algunos tipos útiles, y reside tambiénen el package designide.dcp (no hay un archivo .dcu tampoco para esta unit). A

 propósito, los fallos que mucha gente tenía con una unit llamada "proxies" también

Page 10: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 10/16

 

tenían que ver con esta remodelación.

Te pongo aquí un ejemplo de editor de propiedades y otro de editor de componentes.Como sabrás, no basta con definir dichas clases sino que, obviamente, hay queasignarlas al componente y/o propiedad deseada, para que Delphi sepa dónde aplicarlos.

Para ello se usan los procedimientos RegisterPropertyEditor yRegisterComponentEditor (en ambos en el parámetro ComponentClass se debe indicar a qué clase -y derivados- afectará).

Código Delphi [-]type

TAliasProperty = class(TStringProperty)publicfunction GetAttributes : TPropertyAttributes; override;procedure GetValues(Proc: TGetStrProc); override;

end;

TMiComponenteEditor = class(TComponentEditor)publicprocedure ExecuteVerb(Index: Integer); override;function GetVerb(Index: Integer) : String; override;function GetVerbCount : Integer; override;

end;

procedure Register;

implementation

procedure Register;

begin// registramos el componenteRegisterComponents('MiPaleta', [TMiComponente]);

// registramos el editor de la propiedad 'Alias' para TMiComponenteRegisterPropertyEditor(TypeInfo(String), TMiComponente, 'Alias',

TAliasProperty);// registramos el editor de TMiComponenteRegisterComponentEditor(TMiComponente, TMiComponenteEditor);

end;

{ TAliasProperty }

function TAliasProperty.GetAttributes: TPropertyAttributes;

beginresult := [paValueList, paMultiSelect, paSortList];end;

// TGetStrProc es un tipo de función que recibe un valor cadena paraañadir// a una lista que mostrará al usuario desde el ObjectInspectorprocedure TAliasProperty.GetValues(Proc: TGetStrProc);varAliasList : TStringList;i : Integer;

beginAliasList := TStringList.Create;

Session.ConfigMode := cmAll; // que busque todos los aliasposiblesSession.GetAliasNames(AliasList);

Page 11: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 11/16

 

tryfor i:=0 to AliasList.Count - 1 do Proc(AliasList[i]);

finallyAliasList.Free;

end;end;

{ TMiComponenteEditor }

// según el parámetro Index, lanzamos la acción / formulariocorrespondienteprocedure TMiComponenteEditor.ExecuteVerb(Index: Integer);beginCase Index of0 : with TMiComponenteForm.Create(nil) do

tryif ShowModal = mrOk then Designer.Modified;

finallyFree;

end;1 : with TMiComponentePreviewForm.Create(nil) do

tryShowModal;

finallyFree;

end;end;

end;

// según el parámetro Index, indicamos el Caption de cada entrada delmenúfunction TMiComponenteEditor.GetVerb(Index: Integer): String;

beginCase Index of0 : result := 'Editar valores ...';1 : result := 'Previsualizar';

end;end;

// devuelve el número de entradas que vamos a añadir al menúfunction TMiComponenteEditor.GetVerbCount: Integer;beginresult := 2;

end;

Por último, un consejo: los componentes debes crearlos en unidades aparte de la de loseditores. Para los editores creas una unidad dedicada exclusivamente, llamémoslaMisComponentesReg.pas, ahí es donde añades en la cláusula Uses las units DesignIntf,DesignEditors -DesignMenus y DesignWindows pueden ser optativas- o bien DsgnIntf si trabajas en versiones anteriores a la 6. En dicha unit además es donde registrarás loscomponentes por lo que deberá llevar enlazadas todas las units donde los tengasimplementados. En realidad, al package de diseño sólo le tienes que añadir esta unidad

 para que Delphi te los instale en la paleta.

Otra aclaración: puesto que a partir de Delphi no se permiten crear aplicaciones queusen las unidades propias del diseño, a la hora de depurar la unitMisComponentesReg.pas, esto no lo podrás hacer incluyéndola en un proyecto tal cual

Page 12: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 12/16

 

y compilando, ya que te saltará el error del tipo: "File not found DesignIntf.dcu'. Debescrear el package de diseño, incluirle dicha unit, y compilar el package cada vez quequieras depurarla.

Te pongo un enlace a un "Curso de creación de componentes" que me fue muy útil en

su día, confeccionado por Luis Roche:

http://www.publispain.com/supertutor...os/4/ccind.htm

Saludos __________________ Guía de Estilo 

andres1569

Ver PerfilEnviar un mensaje privado a andres1569

Enviar Correo a andres1569

Encontrar Todos los Mensajes de andres1569

Agregar a andres1569 a Tu Lista de Amigos

#11 02-04-2010

ElDuc 

Registrado 

Registrado: jul 2004

Posts: 90

 

Imposible Para Mi Hola andres 1569,

En primer lugar quiero agradecerte de verdad el esfuerzo que estás haciendo por ayudarme a entender el tema de los componentes en Delphi, no me imaginaba quealguien pudiera hacer tanto por un novato como yo, GRACIAS.

 No te he contestado hasta ahora porque antes quería trabajar sobre tu último post y teníala esperanza de poderte decir que todo estaba solucionado.

Creo que el problema lo tengo con los 2 paquetes que me indicas debo trabajar. Yo programo con Delphi 7.

He leido tu explicación muchas veces y lo he intentado otras tantas, pero el resultadosiempre es el mismo, cuando consigo que funcione mi editor de propiedades en tiempode diseño, no puedo ejecutar porque me da el maldito problema de "Proxies".

Incluso, siguiendo un consejo que encontré en este foro, he creado mi unidadProxies.pas y devuelvo true en la función que se utiliza, entonces se ejecuta pero nofunciona mi editor de propiedades.

Yo pienso que la solución está en tu explicación, pero no soy capaz de comprender el

Page 13: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 13/16

 

tema de los 2 paquetes y qué debo poner en cada uno.

Aún a riesgo de que pienses que me estoy pasando y para que el esfuerzo que hemoshecho hasta ahora no sea en vano, te ruego me pases un esqueleto de lo que debo hacer,algo así:

Paquete de diseño PDMyComponent:Contens

Unidad 1.pas -> ¿pas o dcu?Unidad 2.pas -> ¿pas o dcu?Requires

Paquete 1PRMyComponent -> Yo sólo lo pongo como ejemplo...

Paquete de distribución/¿ejecución? PRMyComponent:Contens

Unidad 3.pas -> ¿pas o dcu?Unidad 4.pas -> ¿pas o dcu?Requires

Paquete 1...

Lo que pongo en cada unidad:Unidad 1.Pas

Uses

...Definición y registro del editor de propiedades.

Unidad 2.Pas

Uses...Definición y registro del componente.

Unidad 1.Pas

Uses...

Definición ...

Unidad 1.Pas

Uses...Definición ...

¿Qué hago con el paquete PDMyComponent?, ¿lo instalo en el IDE?, y con el otro¿què hago?

Como puedes ver no he entendido nada, si puedes, ¡hèchame una mano!

Page 14: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 14/16

 

ElDuc

Ver Perfil

Enviar un mensaje privado a ElDuc

Encontrar Todos los Mensajes de ElDuc

Agregar a ElDuc a Tu Lista de Amigos

#12 12-04-2010

andres1569 Registrado

 Registrado: may 2003Posts: 907

Hola de nuevo, ElDuc:

Lo que voy a comentarte ya está en mi post anterior. Veamos, los componentes los

defines e implementas en unidades aparte de la que vas utilizar para registrarlos, yque llamaremos en adelante MisComposReg.pas, por ejemplo. Da igual si utilizas unasola unit para implementar unos cuantos componentes (esto sucede muchas veces en laVCL), o como recomienda Marco Cantú dedicas una unit exclusivamente para cadacomponente. Pero lo que importa es que en estas unidades no hagas ninguna mención alas unidades de diseño: DesignIntf, DesignEditors, DesignMenus y DesignWindows. Silo haces te saltará ese maldito error con la unit "proxies".

Ten en cuenta que dichas unidades, aparte de ser las que utilizará el IDE de Delphi para"conocer" tus componentes, son las que se enlazarán a cualquier ejecutable que losutilice, por lo que no pueden aludir a nada que tenga que ver con el diseño (por el

asunto del Copyright que te comenté en mi anteriro post).

La clave está en crear una unit dedicada exclusivamente a implementar los editores

de propiedades/componentes (MisComposReg.pas), ahí SI metes en la cláusula Useslas unidades referidas de diseño: DesignIntf, DesignEditors, DesignMenus yDesignWindows (no todas son necesarias, usa las que te hagan falta). Aparte, como eslógico, debes incluir en esta unidad referencias a las unidades donde has implementadolos componentes. El procedimiento Register, donde registras los componentes y loseditores, DEBE IR SÓLO EN ESTA UNIDAD.

Vayamos con los paquetes:Esencialmente sólo necesitas crear uno, el de diseño (el de ejecución sólo te hará falta siquieres que los programas que utilicen tus componentes lo hagan mediante la opciónRuntimes packages, ahí si necesitas crear un paquete de ejecución para distribuir contu aplicación).

En cuanto al paquete de diseño, sólo tienes que añadirle en la cláusula REQUIRES lareferencia al paquete designide.dcp que viene con Delphi, y basta con que le añadassolamente la unidad MisComposReg.pas donde se registran los componentes y loseditores. Ninguna unidad más. Éste es el paquete que instalas en Delphi. El archivo que

debes añadir es el .pas, ya que Delphi debe compilarlo desde ese paquete precisamente(nada de .dcu).

Page 15: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 15/16

 

Y referente a lo de crear una unit "proxies.pas" para engañar al sistema, olvídate,simplemente quita las famosas units DesignXXX de todas las unidades menos deMisComposReg.pas, y no te saltará ese error.

Saludos,

Andrés __________________ Guía de Estilo 

andres1569

Ver Perfil

Enviar un mensaje privado a andres1569

Enviar Correo a andres1569

Encontrar Todos los Mensajes de andres1569

Agregar a andres1569 a Tu Lista de Amigos

#13 10-02-2011

 burgosrodas Registrado

 

Registrado: sep 2008Ubicación: ColombiaPosts: 18

Error al Crear componente Visual Buen diahe leido el hilo completamente y es muy interesante pero me he encontrado con un

 problema que quisiera alguien me pudiera colaborar.quiero crear mi componente de la siguiente manera:

quiero crear un DBGrid que al soltarlo en mi form (o en un panel)el automaticamente cambie su parent a un panel que se crea dinamicamentey dicho panel dinamico se ubica donde se pretendia tener el DBGrid, esto con el fin de

agregar un statusbar, y un buscador automatico para dicho DBgrid alineados alBottom,entonces se crea el efecto de tener un buscador en cada DBGrid que adiciono a mi proyecto.esto no tiene problema, pues en tiempo de diseño, todo pinta bien, el problema aparececuando intento ejecutar mi componente, pues sale el error "raised exception class EClassNotFound with message 'Class TPanel not found."

Código Delphi [-]constructor TKDBGrid.Create(AOwner : TComponent);begin

inherited Create(AOwner);

Page 16: Componentes en tiempo de diseño

5/10/2018 Componentes en tiempo de diseño - slidepdf.com

http://slidepdf.com/reader/full/componentes-en-tiempo-de-diseno 16/16

 

 Panel:=TPanel.Create(AOwner);Panel.Parent:=TWinControl(AOwner);

Self.Parent:=Panel; // self es el DBGrid en mi casoJvDBUltimGrid

Self.Align:=alClient; // el DBGrid ocupa todo el panel creado

CrearBuscador;end;

no en tiendo como hacer, por ultimas intente hacerlo al revezhago que mi componente sea un panel, y cualdo se crea instancia un DBGrid dentro deel, pero ahroa el problema es que no encuentra la clase TDBGrid >=(alguien que me guie por favor espero haberme hecho entender 

gracias

 burgosrodas

Ver Perfil

Enviar un mensaje privado a burgosrodas

Enviar Correo a burgosrodas

Encontrar Todos los Mensajes de burgosrodas

Agregar a burgosrodas a Tu Lista de Amigos