Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Valor por defecto de propiedades en formularios

Hola,

Quiero crear un descendiente de TForm con nuevas propiedades publicadas para que aparezcan en el inspector de objetos. La manera en que lo hago es añadiendo el formulario al repositorio (¿existe esta palabra en español?) y creando un paquete que lo registra con RegisterCustomModule.

Esto funciona bien pero quisiera además cambiar el valor por defecto de algunas propiedades ya existentes, por ejemplo:

Código:
TBarForm = class
published
  property Height default 28;
  property BorderStyle default bsNone;
end;
Poniendo los nuevos valores en el constructor.

De acuerdo a la documentación esto debería funcionar pero no hay manera; cada vez que heredo un formulario desde el repositorio aparece con los valores originales de siempre.

¿Tienen alguna de idea de cómo hacer esto?

// Gracias
Responder Con Cita
  #2  
Antiguo 12-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
¿En el create de esta clase, estás asignando estos valores a las propiedades?... el default solo indica que si el valor de la propiedad es el indicado por el default, este no se guardará y nada mas. Por eso cuando carga la propiedad esta no está guardada, el valor a la propiedad se lo debemos asignar en el constructor de la clase.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 12-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por delphi.com.ar
¿En el create de esta clase, estás asignando estos valores a las propiedades?
En efecto:

Cita:
Empezado por roman
Poniendo los nuevos valores en el constructor.


Y al no funcionar intenté otras cosas como asignarlos en AfterConstruction pero sin suerte. Sólo poniéndolos en Loaded pero claro que así no vale ya que entonces nunca puedo cambiar los valores en diseño.

Me pregunto si tendré que utilizar alguna de las tools api para crear el formulario "en forma" con algún "expert" pero quisiera evitarmelo por el momento.

// Saludos y gracias
Responder Con Cita
  #4  
Antiguo 12-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Ups... Evidentemente no he leído bien tu mensaje ...
Ahora... si creas el formulario con el IDE es igual que si lo creas a mano (TMiForm.Create)???
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 12-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por delphi.com.ar
si creas el formulario con el IDE es igual que si lo creas a mano (TMiForm.Create)???
Si lo creo a mano sí queda bien.

// Gracias
Responder Con Cita
  #6  
Antiguo 12-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Cita:
Empezado por roman
Si lo creo a mano sí queda bien.
Esto da a suponer que es el IDE el que le da el tamaño al form...
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 12-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por delphi.com.ar
Esto da a suponer que es el IDE el que le da el tamaño al form...
¿Esto significa que pierdo toda esperanza? (no sé si reir o llorar)

¿Piensas que con "wizards" lo puedo hacer?

// Gracias
Responder Con Cita
  #8  
Antiguo 12-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
¡¡¡la esperanza nunca se pierde!!!
La verdad que no tengo nada de tiempo como para darle una miradita al tema...

Por otro lado, te recomiendo particular precaución con el tema de las propiedades con default, ahora en un momento te describo un problema que me sucede a menudo.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 12-02-2004 a las 19:08:05.
Responder Con Cita
  #9  
Antiguo 12-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por delphi.com.ar
La verdad que no tengo nada de tiempo como para darle una miradita al tema...
[modalidad=sarcasmo]
¡Caramba!, necesito el código para hoy, ¿no puedes cancelar algunos compromisos?
[/modalidad]



Preguntaba lo de los wizards sólo para evitarme el clavado en dicha área en caso de no tener nada que ver con éso.

Cita:
Empezado por delphi.com.ar
Por otro lado, te recomiendo particular precaución con el tema de las propiedades con default, ahora en un momento te describo un problema que me sucede a menudo.
Aquí espero,

// Gracias
Responder Con Cita
  #10  
Antiguo 12-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Bueno... No te emociones, no es la solución, es el problema que sucede con los default y la herencia visual, uso de frames...:

Si tengo un formulario (Form1) con un TPanel sobre este con la propiedad Anchor = [akLeft, akTop, akRight, akBottom] (diferente al defaul), y creo un formulario heredado de este (Form2) donde cambio el valor de la propiedad Anchor a [akLeft, akTop] (el default), resulta que el TWriter no guardará el valor en el Form2 porque el default de esta propiedad es igual al valor, pero a la hora de cargarlo, como no está guardada esta propiedad, traerá el valor default de su clase heredada (TForm1), donde Anchor = [akLeft, akTop, akRight, akBottom]. Lo que esta MAL!

Hagan la prueba, siguiendo los siguientes pasos:
  1. Abrir Delphi
  2. Crear un nuevo proyecto
  3. En el formulario pegar un panel
  4. Ponerle a la propiedad Anchor el valor [akLeft, akTop, akRight, akBottom]
  5. Ir al menu File \ New \ Other
  6. Buscar en la solapa Project1, el Form1… esto nos creará el Form2 heredado del Form1
  7. Poner en la propiedad Anchor del panel del Form2 el valor [akLeft, akTop], si estamos en Delphi 7 notaremos que el Object Inspector ya se ha confundido y la propiedad no está en negrita.
  8. Guardar y cerrar los dos forms.
  9. Abrir el form2 y corroborar si el Anchor del panel es igual al que pusimos en el punto 7


Bueno, si tu form tiene un ancho fijo, y haces herencia visual de este ancho............... ¿Entiendes a donde voy?

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #11  
Antiguo 12-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Disculpa la tardanza en contestar pero tuve que salir.

Creo entender lo que dices. Sin embargo la herencia visual es algo distinta. Supongo que el problema que describes se debe a que el IDE en sí no tiene noción del cambio de valores por defecto ya que Form1 no está registrado. Uno esperaría que si hacemos:

Código:
TForm1 = class(TForm)
published
  property Anchors default [akLeft,akRight, akTop, akBottom];
end;
y registramos el formulario entonces sí debería funcionar. Claro que a juzgar por las pruebas que hice no es así, al menos sin usar wizards.

Será cosa de seguir investigando.

// Saludos
Responder Con Cita
  #12  
Antiguo 13-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pues me tiré el clavado. A ver si no es demasiada vuelta.

Tuve que hacer un Wizard y un Creator:

Código:
type
  TAppBarCreator = class(
    TInterfacedObject, IOTACreator, IOTAModuleCreator
  )
    { De IOTAModuleCreator }
    procedure FormCreated(const FormEditor: IOTAFormEditor);
  end;

  TAppBarWizard = class(
    TNotifierObject, IOTAWizard, IOTARepositoryWizard, IOTAFormWizard
  )
    { De IOTAWizard }
    procedure Execute;
  end;

procedure Register;

implementation

{ Este método lo llama el IDE en cuanto se crea el formulario }
procedure TAppBarCreator.FormCreated(const FormEditor: TFormEditor)
var
  NTAComponent: INTAComponent;
  Component: TComponent;

begin
  // Obtenemos una referencia al formulario recién creado 
  if Supports(FormEditor.GetRootComponent, INTAComponent, NTAComponent) then
  begin
    Component := NTAComponent.GetComponent;
    if Component is TAppBarForm then
      // y le asignamos el valor deseado a la propiedad
      TAppBarForm(Component).Height := 55;
  end;  
end;

{ Aquí le pasamos al IDE el Creator del formulario }
procedure TAppBarWizard.Execute;
var
  Services: IOTAModuleServices;

begin
  Supports(BorlandIDEServices, IOTAModuleServices, Services);
  Services.CreateModule(TAppBarCreator.Create);
end;

{ Registramos el Wizard y el formulario }
procedure Register;
begin
  RegisterPackageWizard(TAppBarWizard.Create);
  RegisterCustomModule(TAppBarForm, TCustomModule);
end;

end.
De esa forma obtengo tres cosas:
  1. El icono para agregar un formulario TAppBar aparece automáticamente en "New Items"
  2. Las nuevas propiedades publicadas aparecen en el inspector de objetos
  3. El formulario aparece con las dimensiones deseadas

Quedan cosas en el tintero ya que entiendo poco de las ToolsApi y aún quiero ver si puedo evitarme la vuelta al Wizard (aunque vino bien aprender cómo se hace). Además al agregar el formulario nuevo aparece como TAppBarForm2 en lugar de TAppBarForm1, es decir, que sigue la numeración del formulario principal de la aplicación.

// Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 08:15:26.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi