PDA

Ver la Versión Completa : llamar a procedure desde otra procedure


anubis
24-04-2007, 21:08:03
Yo sigo preguntando ;). Estoy aprendiendo muchisimo con vosotros.

Me he encontrado que, haciendo un evento onkeypress, por ejemplo, necesito llamar desde ahi a otro procedimiento, pero no se ocmo se puede hacer, quiza me estoy saltando las leyes de la programacion?.

Delphius
24-04-2007, 21:13:16
¿Y cual es tu problema?
¿No sabes como invocarlo? ¿O es que te falla?

Es sencillo.. como en cualquier lenguaje....

procedure TForm1.Button1KeyPress(Sender: TObject; var Key: Char);
begin
Procedimiento_Hacer_Algo(Algun_parametro_si_se_necesita);
end;

Creo que a lo mejor no pasa por esto la pregunta... lo veo muy simple...
Ya dirás si es esto...

Espero ser de ayuda.
Saludos

Caral
24-04-2007, 21:15:59
Hola
Por ejemplo si haces un procedimiento:

procedure TFMainForm.Construyemensaje;
begin
MessageDlg('Este es un emnsaje.',[mbOK],0);
end;
Para llamar a ese procedimiento solo tienes que poner el nombre:

procedure TFMainForm.FormCreate(Sender: TObject);
begin
Construyemensaje;
End;
Saludos

Kenobi
24-04-2007, 21:20:35
hace un tiempo me preguntaba lo mismo y cuando veo un lenguaje desconocido me lo pregunto, como dice el amigo anterior asi se llama un procedure y añado una funcion se llama asi ....

Variable:=Funcion_Predefinida(Parametro);

con la salvedad que como ya sabras esta "variable" local o global debe ser del mismo tipo que el devuelto por la funcion....

ahora otra cosa que si que no la veia en otros lenguajes en tiempo de diseño puedes llamar a el procedure de un objeto por medio del Inspector de objetos en la paletra Events como ves te sale un combo y desplegandolo asignas el procedure definido para otro objeto .....

aplicacion de esto...? por ejemplo si quieres que varios botones llamen a la misma rutina .....


Espero haber ayudado .....

anubis
24-04-2007, 22:43:27
gracias, he tenido que crear un procedure nuevo, proque si hago llamada a un onkeypress me pide datos(sender:tobject).

gracias de nuevo.

Caral
24-04-2007, 22:50:27
Hola
Que? :confused: :confused: :confused:
Lo conseguistes hacer.:rolleyes: :rolleyes:
Me quede con la duda, se nota.:D
Saludos

Kenobi
24-04-2007, 23:05:07
para llamar este procedure que tiene dos parametros yo uso el siguiente codigo

var
tecla:char;
begin
tecla:=#13;
edit1keypress(nil,tecla);

end;

a mi me funciona si es una barbaridad hacerlo asi no se ustedes digan.....
que opinas Caral pruebalo....

roman
24-04-2007, 23:35:06
si es una barbaridad hacerlo asi no se ustedes digan....

Pues yo lo digo, es una barbaridad, pero conste que tú diste permiso para hacerlo. :D

Vamos, no es que esté mal, pero no son maneras de hacer las cosas. Los eventos en delphi (y en cualquier lenguaje) no están para que uno los llame, sino para que el entorno los llame. Nosotros ponemos ahí, el código que queremos se ejecuta cuando tal o cual evento suceda, pero nosotros no sabemos cuando tal evento sucederá y por ello lo dejamos en manos del entorno avisarnos de cuando eso sucede.

Lo que pasa es que muchas veces confundimos el evento en sí con la acción a realizar. Vamos a suponer que tenemos un botón [Guardar] en nuestro formulario, que tiene por objeto guardar el archivo que tengamos abierto. Por un lado está el evento (clic en el botón) y por otro la acción (guardar el archivo).

La acción es un método independiente del botón o de cualquier otro elemento visual; un día podemos decidir usar otro tipo de botón o un menú para lanzar la acción, pero el método para guardar no cambiará.

Podemos colocar el código de guardado dentro el evento:


procedure TForm1.Button1Click(Sender: TObject);
begin
{ código para guardar el archivo }
end;


pero con esto estaremos atando la lógica de la aplicación (la parte medular) a la interfaz de usuario, siendo que debería ser independiente.

Lo más adecuado sería aislar el código de la acción en un método aparte:


procedure TForm1.Guardar;
begin
{ código para guardar el archivo }
end;


e invocarlo en el evento:


procedure TForm1.Button1Click(Sender: TObject);
begin
Guardar;
end;


De esta manera, podemos reusar el método Guardar desde donde queramos, sin tener que recurrir a llamar explícitamente al "evento"


Button1Click(nil);


Si hacemos esto último, y luego decidimos que ya no queremos usar un botón, sino un menú o algún otro elemento visual, tendremos que cambiar el código en todas las partes donde hallamos llamado a Button1Click(). De la forma que comento, un cambio como el que menciono, sólo requerirá poner la llamada a Guardar en el evento de ese otro elemento visual.

Así pues, cuando se pregunta uno, como llamar a OnKeyPress, la respuesta sería, no lo hagas, en su lugar, llama al método (acción) a la que dicho evento invoque.

// Saludos

Caral
24-04-2007, 23:50:35
Hola Roman
He hecho procesos determinados para forms especificos, la catedra que acabas de dar es digna de ti.
Me alegro de estar presente en estos momentos.
La tecnica seguro es la mas simple y limpia, desgraciadamente por alguna razon, posiblemente desconocimiento, no es usual su uso, en el ambito del programador comun, lo que hace falta es poner mas atencion y tener maestros como tu.:)
Saludos Maestro.

Kenobi
24-04-2007, 23:56:00
aja ya les estoy agarrando el punto sensible a los mienbros del foro....
lo digo porque sabia que eso de si es una barbaridad y el codigo mismo claro llamarian la atencion ....

pero si lo dice ROMAN compadre es una barbaridad sin duda...ya que (y esto lo digo en serio) no me atreveria a mi nivel discutir con una autoridad de este foro, del cual soy humilde admirador....
pero la verdad funciona hombre si funciona lo que si es que no es "ELEGANTE" pero me resuelve el problema, ya sabes ...

sin embargo ya me picaste la curiosidad y voy a revisar mi codigo para montar lo que esta en el onkeypress en una procedure aparte para llamar .....

por cierto roman u otro de los usuarios avanzado por favor respondan la pregunta de la dll crystal con el inno setup o install shields
tengo dias prenguntando lo mismo de distintas formas y nadie me contesta....

Please helpppppppppppp........

anubis
25-04-2007, 00:02:01
pues si la verdad, es una leccion MAESTRA para tener muy en cuenta que muchas veces ni la pensamos.

Si, la verdad es que me funciono por si quedo una duda a lo que pregunte.

y modificando lo que dijo roman, ya queda algo mas decente la programacion.

como dije al principio, estoy aprendiendo un monton de delphi y de la manera de estructurar un programa.

GRACIAS A TODOS

roman
25-04-2007, 00:02:45
La tecnica seguro es la mas simple y limpia, desgraciadamente por alguna razon, posiblemente desconocimiento, no es usual su uso

En realidad la razón- más que desconocimiento -es que una de las mayores virtudes de Delphi, el RAD, es también su peor defecto, porque fomenta precisamente eso, que uno termine juntando todo el código duro de la aplicación con la parte visual... Es tan fácil dar doble clic sobre un botón en el IDE y ponerse a escribir código.

Y de maestro nada, yo digo muchas cosas en teoría, pero en la práctica, ¡ay mamá! :D

// Saludos

Kenobi
25-04-2007, 00:12:19
a pesar de estar de acuerdo y de ningun modo discutir....

no esta de mas conocer esos trucos del lenguaje (que no se deben hacer ya se) pero que en momentos de apuro te sacan del atolladero y ademas te permiten conocer mas el lenguaje....


humilde opinion, si vienen mas bombas pues bienvenidas sean.....disparen gurus o usuarios avanzados que pa' aprender es que estoy aca, y como decian mis abuelos a golpes tambien se aprende....;) ;) ;) ;)


y de acuerdo con Caral Maestro eres Roman al menos como dices a nivel teorico me quito mil veces el sombrero.....

anubis
25-04-2007, 01:25:06
ya puestos a preguntar un poco mas de lo mismo o no lo mismo, pero que adecente la estructura.
Como se puede hacer una unit sin form para limpiar de procedures el la unit principal, lo he intentado, metiendo las procedures pero me da error, es decir,
si la unit no lleva form no se puede crear un form, pero intente meter las procedures debajo del type.

o esto no es legal?

gracias again

Lepe
25-04-2007, 01:34:45
anubis, file -> New -> Unit, ahí tendrás una unidad sin form asociado



unit global

uses < lo que necesites>

type
type Numero = (uno, dos, tres);
< tipos que quieres exportar o usar desde otras unidades


procedure Simplifica(...);
< procedimientos y funciones visibles desde otras unidades

implementation

< implementación de todo >
end.

procedure Simplifica(...);
begin
< lo que sea >
end;



Saludos

CarlosHernandez
03-03-2010, 21:41:11
buenas tardes, se que esta es una pregunat vieja pero solo quiero saber en la estructura que puso lepe, en

type Numero = (uno, dos, tres);


que es numero y que es (uno,dos,tres)

ya que no se que poner ahi y me da error

por ejemplo en un unit asociado a un form se coloca

type
TForm1 = class(TForm)

esto es lo que puse

unit Unit2;

interface

uses
Windows;

type
Tunit2 = class(TForm)// estos es un disparate, no se que poner aqui y es el motivo de la pregunta
procedure mensaje;
end;

implementation


procedure mensaje;
begin
showmessage('e');
end;

end.

rgstuamigo
03-03-2010, 22:29:57
Amigo CarlosHernandez >
Si vas a hacer una unidad con procedimientos y/o funciones que no van a pertenecer a ninguna clase pues puedes hacerlo así:
unit Unit2;

interface

uses Dialogs;

procedure Hola();

implementation

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

end.
Ahora si por el contrario vas a crear nuevas clases entoces lo haces así:
unit Unit3;

interface
uses Dialogs;

type
MiClase = Class {<--Aquí si deseas lo puedes haces asi > MiClase = Class(TObject)
pero es lo mismo ya que para toda clase que no se especifique su ancestro
el compilador asume que su padre es la clase TObject,
a no ser que quieras heredar de una clase en cuestión }
private
{ Aqui se pone todas las declaraciones privadas }
public
{ Aqui se pone todas las declaraciones públicas }
procedure Hola();//este método es publico
end;
implementation

{ MiClase }

procedure MiClase.Hola;
begin
ShowMessage('Hola');
end;

end.
Espero que todo haya quedado claro.;).
Saludos...:)

Lepe
04-03-2010, 13:43:07
CarlosHernandez, tienes toda la razón, ese ejemplo con "Numero" es lo típico que se hace para aclarar cosas y al final resulta de lo más complejo y raro...

Eso de "Numero" es un tipo enumerado en Delphi, vamos, esto mismo:

type TEstadoCivil = (ecSoltero, ecCasado, ecDivorciado, ecViudo);

Simplemente un tipo de datos que puede contener un sólo estado de todos los posibles. el prefijo "ec" es por aquello de EstadoCivil

Es un tipo de datos definido en ese .pas, pero que se usará en otras partes del programa.

CarlosHernandez
04-03-2010, 15:27:40
gracias rsgtuamigo y lepe por responder, ya entendi esa parte y corre sin problema, ahora lo que no me deja es llamar ese procedimiento desde el formulario del unit1, aqui declare en las uses el unit2 (que es donde esta el procedimiento a llamar) pero no aparece, no se llamarlo

procedure TForm1.Button1Click(Sender: TObject);
begin
MiClase.hola;
end;

hola no me lo reconoce, no aparece entre las opciones y el error es el siguiente:

"this form of method call only allowed for clas methods"

incluso revise este link (http://www.clubdelphi.com/foros/showthread.php?t=10315) pero quede igual

roman
04-03-2010, 16:13:48
MiClase sólo es la definición de un tipo de datos y no el dato en sí. Luego entonces, por lo general, no puedes usar directamente uno de sus métodos. Sólo los objetos de esa clase pueden hacerlo. Entonces, debes primero crear un objeto de esa clase y usar el método desde ese objeto:


var
Objeto: MiClase;

begin
Objeto := MiClase.Create;
Objeto.Hola;
end;


Por otro lado, aunque no es obligatorio, se recomienda anteponer un T (de tipo) a los tipos de datos creados por nosotros, lo cual incluye las clases:


type
TMiClase = class
...
end;


en lugar de


type
MiClase = class
...
end;


// Saludos

rgstuamigo
04-03-2010, 16:22:45
El problema que veo que tienes es que no has entendido el concepto de Programacion Orientado a Objeto (http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos), en éste caso si tienes un Procedure y/o funcion que esta declarado e implementado dentro de una clase, pues la única forma de llamar a tal método (http://es.wikipedia.org/wiki/M%C3%A9todo_%28programaci%C3%B3n_orientada_a_objetos%29) es instanciando un objeto de dicha clase ;) , a no ser :rolleyes: que lo declares como método clase(Class methods) .;) ,por ejemplo:
procedure TForm1.Button1Click(Sender: TObject);
var MiObjeto:MiClase;
begin
MiObjeto:=MiClase.Create;//<-- creo un objeto de tipo "MiClase" ;)
MiObjeto.Hola;// Ahora ya puedo llamar al método Hola
MiObjeto.Free;{<--Siempre despues de usar un objeto hay que liberarlo
es decir liberar la memoria cuando ya no se va usar mas dicho objeto}
end;

Saludos...:)

CarlosHernandez
04-03-2010, 16:49:21
gracias roman y rgstuamigo por ese aporte, ya me funciona perfecto

rgstuamigo
04-03-2010, 17:25:00
Viendo un poco lo que pretendías hacer con éste códico >
procedure TForm1.Button1Click(Sender: TObject);
begin
MiClase.hola;
end;
y explicando un poco sobre los métodos de clase (Class methods) que te mencioné en mi anterior post , pues se puede lograr que tu anterior código funcione, tan solo deberias declarar al metodo "hola" como método de clase de ésta forma:
...
type
MiClase = Class
private
{ Aqui se pone todas las declaraciones privadas }
public
{ Aqui se pone todas las declaraciones públicas }
class procedure Hola();//este método es un método de clase
end;
....

Bueno ..desde luego que la implementación del método "hola" tambien debe llevar la palabra reservada "class">
...
class procedure TMiClase.Hola;
begin
ShowMessage('Hola');
end;
...

En otros lenguajes de programacion como por ejemplo Java o C++ ésto se llama métodos estáticos(static).
Ésto significa que ya no necesito tener un objeto creado(instanciado) de la clase para poder llamar al método "hola", lo puedo hacer directamente atraves de la clase tal como tú lo hiciste , es decir asi:
...
MiClase.hola;//Ahora si puedo llamar al procedure "Hola" por que es un método de clase. ;)
...

Para más informacion sobre los método de clases ver la ayuda de Delphi presionando la tecla F1. ;)
Saludos...:)

CarlosHernandez
04-03-2010, 18:44:37
tambie lo probe y funciona perfecto