PDA

Ver la Versión Completa : Crear nuevas propiedades de un formulario


Angel
09-05-2003, 11:03:07
Hola a todos.

Me gustaría crear un nuevo formulario con propiedades añadidas por mí y que aparecieran en el Object inspector, el problema es que no tengo ni idea de como hacerlo.

¿Podría alguien enviarme código de ejemplo, o algún enlace donde lo expliquen, o algo de ayuda?


Muchas gracias a todos

delphi.com.ar
09-05-2003, 16:50:34
Si querés hacerlo con herencia visual, las propiedades no van a aparecer en el object inspector, pero si creas una clase heredada de TForm sin su respectivo DFM, creas un nuevo formulario y modificas la clase heredada, Eureka!….

Este ejemplo lo vengo usando desde hace mucho y funciona:


unit FSForm;

type
TFSForm = class(TForm)

published
property StatusBar : TStatusBar read FStatusBar write FStatusBar;
property AutoTabs : Boolean read FAutoTabs write SetAutoTabs;
end;

Implementación
unit unCustomConsulta;

interface

uses
Windows, Messages, SysUtils... FSForm;

type
TfrmCustomConsulta = class(TFSForm)
....


La primera ves que modificas el form para modificar la clase, las propiedades no aparecen, pero lo cerras y lo abrís... (el IDE lee el DFM y la información RTTI de las clases).. y listo!

delphi.com.ar
09-05-2003, 16:52:28
Vuelvo aclarar que la unit FSForm es una Unit "plana"... no tiene DFM... (File / New / Unit)

Angel
10-05-2003, 12:51:18
Siento mucho comunicarte que el truco no me funciona (quizás esté haciendo algo mal). Aqui te muestro las dos units que tengo creadas:

unit UListForm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TFSForm = class(TForm)
private
FValor: Integer;
FParam1: Variant;
public
published
property ParametroEntrada:Variant read FParam1 write FParam1;
property aux:Integer read FValor Write FValor;
end;

implementation

end.

y la unit donde heredo esta clase:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Dialogs, UListForm;



type
TForm1 = class(TFSForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }

public
{ Public declarations }
published

end;

var
Form1: TForm1;

implementation

{$R *.dfm}



Incluso cerrando y volviendo a abrir el Delphi siguen sin mostrarse esas dos nuevas propiedades.

¿Estoy haciendo algo mal?


Saludos

delphi.com.ar
10-05-2003, 23:13:58
Bueno, ante todo quiero decirte que no tengo un Delphi para probarlo pero si la memoria no me falla. me parece que me olvidé de comentarte algo, hay que modificar la declaración del TForm1 en el dfm, donde debe decir algo similar a
object Form1: TForm1
No recuerdo bien la sintaxis, pero te aseguro que es la primer linea, tenés que poner uno de estos códigos:
object Form1: TFSForm
inherited Form1: TFSForm
inherited Form1: TForm1
Espero que sea esto, comentame como te fue, sinó recien el lunes voy a poder volver a ayudarte... Suerte!

Angel
12-05-2003, 09:39:53
hola delphi.com.ar,

Sigo sin conseguir que me funcione.... me gustaría mandarte el proyecto que tengo hecho para que lo vieses y me dijeses que falla. Consigo que me compile, pero no me muestra las propiedades que creo.

He realizado los cambios que me propusiste, pero el único que funciona es dejándolo como estaba.

es decir, si escribo esto en el DFM (que sería lo lógico)

object Form1: TFrmList
Left = 192
Top = 108
Width = 696
Height = 480
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
end

me aparece el siguiente error al intentar cargar otra vez el proyecto:
Error in module: Declaration of class TFrmList is missing or incorrect

¿alguna idea del error?

delphi.com.ar
12-05-2003, 16:52:35
Bueno, he probado esto en Delphi 5, y veo que no hay que cambiar nada en el DFM.
Pero la mala noticia, es que en Delphi 7 no funciona...
Mil disculpas.. es que aun sigo programando solo en Delphi 5

Angel
13-05-2003, 09:32:28
Yo estoy utilizando el Delphi 5 tambien (y no consigo que funcione)

delphi.com.ar
13-05-2003, 17:00:00
Bueno, siendo así, envíame el proyecto a webmaster@delphi.com.ar

PD: Tené en cuenta que si migras a una versión superior, vas a perder los datos modificados de esas propiedades, lo que es un verdadero peligro para tu aplicación.

roman
14-05-2003, 06:35:40
Una forma de agregar propiedades a un formulario la pueden ver en la página de Dr. Marteens (http://www.marteens.com/) , específicamente el truco 16 (http://www.marteens.com/trick16.htm)

// Saludos

delphi.com.ar
26-06-2003, 23:54:24
Bueno, me acabo de dar cuenta que en la unit donde registro mis componentes en el paquete de diseño, aparece la línea:

RegisterCustomModule(TFSForm, TCustomModule);

Eso era lo que faltaba,
mil disculpas por la omisión
Saludos!

lafirma
04-07-2003, 19:33:18
Como hago para agregar al repositorio un form que no tenga dfm?

delphi.com.ar
04-07-2003, 20:47:28
Agregas un Form heredado del form sin DFM!

lafirma
10-07-2003, 00:55:57
mi pregunta sobre agregar forms al repositorio sin dfm se refiere a que esa opcion solo la he encontrado haciendo click derecho en la ventana del form, pero como el form esta sin dfm no hay diseño visual, por lo tanto no hay acceso a esa opcion

guillotmarc
10-07-2003, 01:09:09
Hola.

Lo que te está indicando delphi.com.ar, es que crees un formulario intermedio. Creas un nuevo Formulario y en su definición de clase :


type
TForm1 = class(TForm)


lo cambies por algo como


type
TiFSForm = class(TFSForm)


Ahora cierra este formulario y vuelvelo a abrir, te aparecerá con las nuevas propiedades, y como es un formulario con .dfm lo podrás añadir al Repositorio.

Ahora los nuevos formularios, los vas a heredar de este ultimo TiFSForm en lugar de TFSForm inicial.

Por cierto delphi.com.ar, ¿ este truco también funciona para definir eventos en el formulario ?

Saludos.

delphi.com.ar
10-07-2003, 15:39:42
No lo he probado, pero como Delphi le da a los eventos el mismo trato que a las propiedades, mejor dicho: los eventos no son mas que propiedades del tipo "procedure of object", ¡¡Tiene que Funcionar!!

Saludos!