Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   usar un procedure en varios formularios (https://www.clubdelphi.com/foros/showthread.php?t=40831)

adonai 28-02-2007 02:36:13

usar un procedure en varios formularios
 
un saludo a todos los cybermaniticos, mi pregunta es algo curiosa, lo ke dese o hacer es que un procedimiento creado en un formulario pueda ser llamado desde otro formulario por ejemplo en mis dos forms tengo un Tedit y ke la funcion trabaje con cada edit correspondiente al formulario
Código Delphi [-]
Form1
Procedure habilitar(primero:Tedit);
begin
Primero.enabled:=true;
end;
use form1;

Form2
¿?¿?¿?¿?¿??:confused: :confused: :confused:  como puedo llamarlo

egostar 28-02-2007 02:38:16

Y porque no mejor lo haces asi

En form2

Form1.Edit1.Enabled := True;

Saludos

adonai 28-02-2007 02:39:40

bueno lo que puse solo es un ejemplo no se trata de una funcion tan simple solo es un ejemplo didactico para que me entiendan

egostar 28-02-2007 02:43:12

Pero el tratamiento es igual para cualquier componente, funcion, procedimiento, variable.

Saludos

adonai 28-02-2007 02:46:51

pero trato de llamar a una funcion desde un form a otro y no lo reconoce

egostar 28-02-2007 02:51:30

Código Delphi [-]
//en la form1 
.......   
public     { Public declarations }       
   procedure habilita(primero:TEdit); 
.......  

procedure TForm1.Habilita(primero:TEdit); 
begin   
   primero.Enabled := true; 
end;   

//En la form2 
procedure TForm2.Button1Click(Sender: TObject); 
begin   
   Form1.Habilita(Edit1); 
end;
Necesitas colocar el procedimiento en public.

Saludos

adonai 28-02-2007 03:03:03

espero no caer espeso pero quisiera hacer esto:

y si con la misma funcion quisiera habilitar el edit1 del form2??

egostar 28-02-2007 03:22:11

Bueno, el ejemplo que te puse es precisamente para habilitar el Edit del form2, que quiere decir esto, bueno, si tu quieres habilitar algun edit de otro form debes indicarle el form que le corresponde.

Código Delphi [-]
 
Form1.Habilita(Edit1);  //este habilita el edit del form actual
Form1.Habilita(Form1.Edit1); //este hablita el edit del form1
Form1.Habilita(Form3.Edit1); //este del form3
etc....

Por eso te decia que es el mismo tratamiento que debes de hacer.

Bienvenido al foro, como es costumbre te invito a leer la guia de estilo y la otra guia de estilo, espero disfrutes ser miembro de este club.

Saludos

egostar 28-02-2007 03:23:48

Me autocorrijo

Si deseas habilitar del form1 pues logicamente debes hacer esto

Código Delphi [-]
Habilita(Edit1);

Dentro del form1.

Saludos.

Lepe 28-02-2007 11:53:15

Yo al menos eso no lo haría así. Si un procedimiento pertenece a un Form, debe actuar sólo sobre ese Form.

Tienes 2 formas de hacerlo, desde mi punto de vista:
1- Creando una unidad nueva.
- File -> New -> Unit, allí declaras la función y su implementación. Ya es una rutina que no pertenece a ningún Form, pero puedes usarla donde quieras. La Unidad puede llamarse Global.pas, publica.pas, etc. Allí colocas todas las rutinas que sean comunes a varios Forms.
2 - Usando Herencia:
- Creas un Form vacío, le añades la rutina "Habilitar" y lo que debe hacer. Lo llamas BaseForm.Pas
- Al crear una nueva ventana que deba tener esa función "Habilitar", usas File -> new -> other -> projects y ahí debe aparecer "BaseForm", lo seleccionas y le das al botón heredar. La nueva ventana ya dispone del método Habilitar y puedes cambiar su forma de actuar mediante la directiva Override

Este método tiene una ventaja, cualquier ventana que tengas tendrá el método Habilitar, sin importar si es Form3, Form10 o Form32
Saludos

egostar 28-02-2007 23:50:59

Cita:

Empezado por Lepe
Yo al menos eso no lo haría así. Si un procedimiento pertenece a un Form, debe actuar sólo sobre ese Form.

Tienes 2 formas de hacerlo, desde mi punto de vista:
1- Creando una unidad nueva.
- File -> New -> Unit, allí declaras la función y su implementación. Ya es una rutina que no pertenece a ningún Form, pero puedes usarla donde quieras. La Unidad puede llamarse Global.pas, publica.pas, etc. Allí colocas todas las rutinas que sean comunes a varios Forms.
2 - Usando Herencia:
- Creas un Form vacío, le añades la rutina "Habilitar" y lo que debe hacer. Lo llamas BaseForm.Pas
- Al crear una nueva ventana que deba tener esa función "Habilitar", usas File -> new -> other -> projects y ahí debe aparecer "BaseForm", lo seleccionas y le das al botón heredar. La nueva ventana ya dispone del método Habilitar y puedes cambiar su forma de actuar mediante la directiva Override

Este método tiene una ventaja, cualquier ventana que tengas tendrá el método Habilitar, sin importar si es Form3, Form10 o Form32
Saludos

Muy bien Lepe, esto es algo nuevo para mi, asi que entendido y anotado, es mas, me acabas de abrir los ojos para un proyecto que estaba por ahi arrumbado y que habia hecho con Pascal, usando archivos .inc donde almacenaba rutinas para ser llamadas por cualquier programa, pues nada, gracias por el aporte.

Saludos.

joHn je@N 01-03-2007 10:42:47

Bueno. a ver
 
Siento que se les paso algo o yo no entendi bien pero, aqui esta mi aportación:
Bueno primero creo que se les olvido colocar en el Form2
en la parte de
Código Delphi [-]
implementation uses Unit1; ///en donde se encuentra el form1


En el form1 tenemos:
Código Delphi [-]
implementation uses Unit2; ///en donde se encuentra el Form2


Despues tenemos:
Código Delphi [-]
//en el Form1 procedure TForm1.habilitar (primero : TEdit); 
begin    
   primero.Enable := True; 
end;


Despues en el Form2 para llamar al Form1.habiilitar () desde el el Form2
teniendo en cuenta, de que podemos acceder al procedimiento dado a que tenemos en Él uses Unit1; podemos hacer esto:
Código Delphi [-]
{Esto es el código del Form2} 
begin    
   Form1.habilitar (Edit1);    //y listo. se habilita el Edit1 del Form2 llamando el procedimiento del Form1 
end;

SALUDOS

Lepe 01-03-2007 11:30:11

Es cierto, precisamente por eso no lo comentamos.

En Unit1 tienes que hacer un "uses Unit2". En Unit2 tienes que hacer "uses Unit1", ¿por qué no intentas hacerlo en parte interface? Verás que delphi te dice que no se permiten referencias circulares.

Dentro de un tiempo, cuando olvides como funciona el programa irás a ver qué hace el código, de la unidad 2 hace un Enable a la 1, de la 1 se hace un Enable de la 2 y.... ¿qué hago en el mismo punto de partida? ¿cual de las 2 rutinas es la que tiene preferencia ?.... Este tipo de confusiones son las que hay que evitar en la medida de lo posible.

Mirando el código fuente de delphi, verás que una clase (como lo es un Form) jamás modificará el comportamiento de otra clase ajena así por las buenas. Si ha de hacerlo se buscan métodos, propiedades o eventos mediante los cuales se informan esos cambios.

Saludos

Delphius 01-03-2007 16:13:16

¿Puedo aportar algo?

Si bien ya Lepe mencionó la manera correcta para implementar y dió unas aclaraciones válidas de su opción:
Cita:

Empezado por Lepe
Mirando el código fuente de delphi, verás que una clase (como lo es un Form) jamás modificará el comportamiento de otra clase ajena así por las buenas.

Aclaro que es un error conceptual que se realize este comportamiento. Si bien la regla tiene sus excepciones... los efectos que pueden producirse siguiendose estas vías, a la larga terminan siendo más que desastrozos. Ya lo ha dicho Lepe.

De acuerdo a las dos posibles soluciones de Lepe (y aclaro que yo hubiera dicho lo mismo), en lo personal, yo mantendría ambas posibilidades en el cajón. Aplicaría la que más económica/factible sea de acuerdo a las necesidades.

1. Si el sistema es muy simple y no requiere de mucho mantenimiento es viable la primera opción: una unidad global.
2. Si el sistema contiene multiples formularios y se sabe que el mantenimiento es fuerte. Y lo más importante: los cambios en el comportamiento de un formulario con respecto a otros es similar... La opción de la herencia visual es lo más recomendable.

Si bien no dije nada nuevo, a lo mejor para adonai le sirva para comprender mejor las alternativas.

Espero haber aportado algo y no haber redundado en algo.

Saludos,

joHn je@N 02-03-2007 09:51:01

Correcto
 
Siertamente lo que dice Lepe es correcto pero, a mi se me ocurrio dar una respuesta pronta y que me parecio que podia servir (ya que es un procedimiento de un Form llamado por otro Form).
Ahora. Menciona Lepe implicitamente que hay una diferencia entre la sección implementation e interface (cosa que se me hace lógico porque estan en dos secciones o partes de código distintas jejeje) asi que eso es un premio a mi novatez y me gustaría que me dieran un link en donde poder saber exactamente la diferencia entres ambas secciones de código. Por favor.

Ahora. Checando un poco de lño que dijo Lepe hice esto a ver si es de ayuda para futuro.

Un Form que tiene un procedimiento habilita que esta ciertamente en otro archivo MiForm.pas mas o menos como menciono Lepe
Código Delphi [-]
unit MiForm;

interface
uses StdCtrls, Forms;

type
  TMiForm = class (TForm)
  protected
    procedure Habilita (Edit : TEdit);
end;

implementation

procedure TMiForm.Habilita(Edit : TEdit);
begin
  Edit.Enabled := True;
end;
end.

Despues el Form1 (por decir algo)
Código Delphi [-]
unit Unit2;

interface

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

type
  TForm2 = class(TMiForm)
    Edit1: TEdit;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation
{$R *.dfm}

procedure TForm2.Button2Click(Sender: TObject);
begin
   Form2.Habilita(Edit1);
end;

end.

No se, si es una manera correcta de hacerlo. Si no, ayudenme a ver lo que me falta pero, como se ve Form2 ya tiene el procedimiento Habilita y otros Forms podrian tenerlo poniendo TFormX = class(TMiForm).

Bueno era todo.

SALUDOS

Lepe 02-03-2007 11:48:32

Exacto, es así.

En el caso de que algún heredero de TMiform deba hacer algo distinto en el procedimiento Habilita, puedes redefinir su comportamiento así:
Código Delphi [-]
unit Unit2;

interface

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

type
  TForm2 = class(TMiForm)
    Edit1: TEdit;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  protected
     procedure Habilita(Edit: TEdit); override;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation
{$R *.dfm}

procedure TForm2.Habilita(Edit:TEdit);
begin
   inherited Habilita(Edit);  // llama a TMiForm.Habilita
   // hacer algo más
end;

end.

La diferencia con tu codigo es la línea donde pone override. Es una directiva que significa "sobreescribir", es decir, ahora el TForm2 tiene su propio método Habilita, que llama a TMiForm.Habilita y además puede añadirle alguna funcionalidad extra.

Saludos

Delphius 02-03-2007 15:09:07

joHn je@N, respondiendo a tu pregunta:

Cita:

Ahora. Menciona Lepe implicitamente que hay una diferencia entre la sección implementation e interface (cosa que se me hace lógico porque estan en dos secciones o partes de código distintas jejeje) asi que eso es un premio a mi novatez y me gustaría que me dieran un link en donde poder saber exactamente la diferencia entres ambas secciones de código. Por favor.
Mirate la Cara Oculta de Delphi 4. A pesar de ser ya una versión obsoleta, los principios y fundamentos que menciona Ian en su libro siguen siendo vàlidos hasta el día de hoy. Es un buen libro que recomiendo. Vete directo a la página 62... alli encontrarás lo que buscas.

Si tienes dudas no dudes en preguntar,
Saludos

joHn je@N 03-03-2007 06:03:24

Bueno
 
Delphius te agradezco que acudas a mi llamado. Lo voy a leer y te diré mis dudas si es que surgen algunas. Por lo pronto te doy las GRACIAS.

A lo que dice Lepe con override; e inherited habilita();
creo que es un claro ejemplo de la implementación del Polimorfismo en Delphi.

SALUDOS

Delphius 03-03-2007 07:09:08

Cita:

Empezado por joHn je@N
creo que es un claro ejemplo de la implementación del Polimorfismo en Delphi.

Eso mismo...
En la cara oculta vas a encontrar una sección entera dedicada a lo que hace POO, pero por lo que leo... puedo decir que manejas el concepto.

Saludos,

edelphi 30-03-2007 05:19:17

Cita:

Empezado por Lepe
Yo al menos eso no lo haría así. Si un procedimiento pertenece a un Form, debe actuar sólo sobre ese Form.

Tienes 2 formas de hacerlo, desde mi punto de vista:
1- Creando una unidad nueva.
- File -> New -> Unit, allí declaras la función y su implementación. Ya es una rutina que no pertenece a ningún Form, pero puedes usarla donde quieras. La Unidad puede llamarse Global.pas, publica.pas, etc. Allí colocas todas las rutinas que sean comunes a varios Forms.
2 - Usando Herencia:
- Creas un Form vacío, le añades la rutina "Habilitar" y lo que debe hacer. Lo llamas BaseForm.Pas
- Al crear una nueva ventana que deba tener esa función "Habilitar", usas File -> new -> other -> projects y ahí debe aparecer "BaseForm", lo seleccionas y le das al botón heredar. La nueva ventana ya dispone del método Habilitar y puedes cambiar su forma de actuar mediante la directiva Override

Este método tiene una ventaja, cualquier ventana que tengas tendrá el método Habilitar, sin importar si es Form3, Form10 o Form32
Saludos

holas, lo ke dijo lepe me parece interesante pero como puedo implemnetar eso de herencia no entiendo muy bien eso de override, podrias explicarlo mejor porfa muchas gracias


La franja horaria es GMT +2. Ahora son las 15:30:04.

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