PDA

Ver la Versión Completa : Aplicacion sin form


Sotrono
11-09-2005, 21:44:55
Hola, como va?
Estoy haciendo una aplicacion sin form (programo en el dpr) y hasta ahora me encontre con 2 problemas que no puedo solucionar:
1) Como creo un objeto? En una aplicacion con form tengo que poner
NombreObjeto:= NombeClase.Create(self);
Pero sin el Form no se puede usar "self".
2) Como y donde tengo que declarar los procedimientos para los eventos.

Si los declaro asi:

procedure dsa;
begin
ShowMessage('dsa');
end;

begin //begin principal de la aplicacion
Objeto:= TObjeto.Create(???);
Objeto.OnOpen:= dsa;
end.

Me tira el error:
Incompatible types: method pointer and regular procedure

Bueno espero que me puedan ayudar.
Saludos...

Lepe
11-09-2005, 22:10:46
Un saludo (que siempre se pone de coletilla.... ,¿por qué no ponerlo al principio? :D)


procedure dsa;
begin
ShowMessage('dsa');
end;

begin //begin principal de la aplicacion
Objeto:= TObjeto.Create(nil);
try
Objeto.OnOpen:= dsa;
finally
Objeto.Free;
end;
end.

Lepe
11-09-2005, 22:42:38
Por cierto, de qué tipo es el objeto que quieres crear?, porque quieres asignar el evento OnOpen al "dsa", pero ambos deben tener el mismo tipo de parámetros para poder realizarlo.

El problema de method pointer, es porque se necesita que el evento de un objeto, se asigne a otro objeto, es decir, "dsa" tiene que estar definido dentro de un objeto.


procedure TForm1.dsa(....);
procedure TMiObjeto.dsa(....);


tal y como lo tienes es un procedimiento regular, y no puede ser asignado.

Quizás siendo más concreto con lo que estas haciendo te podamos ayudar.
Un saludo

Sotrono
12-09-2005, 02:03:49
de qué tipo es el objeto que quieres crear? No se a que te referis con esa pregunta. Si es visual o no visual?? Es no visual.

En este momento lo estoy haciendo con el componente TKeySpy bajado de Torry. Pero quiero saber manejar cualquier componente. Conoces algun texto sobre este tema??

Entiendo lo de que tiene que estar definido dentro de un objeto pero no se como hacerlo.

dec
12-09-2005, 03:54:21
Hola,


Estoy haciendo una aplicacion sin form (programo en el dpr) y hasta ahora me encontre con 2 problemas que no puedo solucionar:

¿Quieres decir que estás haciendo una aplicación de tipo consola? ;)


1) Como creo un objeto? En una aplicacion con form tengo que poner


NombreObjeto:= NombeClase.Create(self);

Pero sin el Form no se puede usar "self".

Puedes crearlo sin referencia, o sea con una refencia "nula", tal como te plantea Lepe arriba. Luego no debes olvidarte de destruir el objeto en cuestión: puesto que tú te haces cargo del mismo.


2) Como y donde tengo que declarar los procedimientos para los eventos.

A ver, tenemos que aclarar qué quiere decirse por "procedimientos para los eventos". ¿Te refieres a que el objeto tiene ciertos eventos publicados? ¿Te refieres a que el objeto cuente con uno o más métodos que puedan asociarse a un evento, digamos, de otro objeto?

Como creo que es a esto último a lo que te refieres, piensa en declarar e implementar en tu objeto un método que cuente con los parámetros apropiados para el evento al cual piensas asociarlo. Ambos, evento y método han de tener exactamente los mismos parámetros y en el mismo orden.

Supón que creamos un objeto que cuente con un método que podamos luego asociar a un evento sencillo (con un solo parámetro), como pudiera ser el "Click" de un botón. Para ello no tenemos que crear un tipo de evento, cosa que podemos hacer, sino que nos valdrá con "TNotifyEvent", que, habrás visto alguna vez.

El tipo "TNotifyEvent" se declara como sigue:


type
TNotifyEvent = procedure(Sender: TObject) of object;

Así que nosotros tenemos que preparar en nuestro objeto un método (un procedimiento, que es método por pertenecer a nuestro objeto, y así tiene que ser, como puedes ver por "of Object") capaz de trabajar con el evento "TNotifyEvent".


type
TNuestroObjeto = class
{...}
private
procedure MetodoParaEvento(Sender: TObject);
{...}
end;

procedure TNuestroObjeto.MetodoParaEvento(Sender: TObject);
begin
// Et voilà
end;

Una vez creado nuestro objeto podremos disponer de una instancia del mismo y asociar a cualquier evento de tipo "TNotifyEvent" nuestro "MetodoParaEvento". ¿Y si necesitas crear tu propio evento? Pues declaras un tipo tal que "TNofyEvent", de este modo, por ejemplo:


type
TUnEvento = procedure (Sender: TObject; mensaje: string) of Object;


Y el objeto podría quedar así para contar con un método capaz de asociarse con "TUnEvento":


type
TNuestroObjeto = class
{...}
private
procedure MetodoParaMiEvento(Sender: TObject; mensaje: string);
{...}
end;

procedure TNuestroObjeto.MetodoParaMiEvento(Sender: TObject; mensaje: string);
begin
// Et voilà
end;

delphi.com.ar
12-09-2005, 14:09:12
1) Como creo un objeto? En una aplicacion con form tengo que poner
NombreObjeto:= NombeClase.Create(self);
Pero sin el Form no se puede usar "self".
Quiero detenerme en ese punto, para resaltar un error de conceptos grave, que no es la primera vez que lo veo. El parámetro Owner que nos pide el create, es quién será el dueño de este objeto, que será el encargado de destruirlo, a no ser que nosotros nos hayamos encargado de esto, y no necesariamente tiene que ser Self o Application. Es un punto a evaluar, dependiendo de la lógica del programa.
Indicates the component that is responsible for streaming and freeing this component.

En este momento lo estoy haciendo con el componente TKeySpy bajado de TorryMmmmmm... ¡Que feo suena eso! :p

Agregando a la explicación, de Dec, te recomiendo leer este hilo:
http://www.clubdelphi.com/foros/showthread.php?t=23405

Saludos!

rastafarey
12-09-2005, 21:07:13
Como no se exactamente que quieres hacer aqui tiene un ejemplo de para un aaplicacion que corre sis formas y dependiendo de sis es nt corre como servicio y si no corre como aplicacion que puede ser en le icon try

program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Service2: TService};

{$R *.res}

begin
{Function EsNt: Boolean;
Var
verInfo : TOSVERSIONINFO;
Begin
verInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
Result := VerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT;
End;}

If Not EsNt Then
Application.ShowMainForm = False;
Application.Initialize;
If Not EsNt
Application.CreateForm(TForm1, Form1)
Else
Application.CreateForm(TService2, Service2);
Application.Run;
end.