Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   como acceder a los controles de un formulario desde otro (https://www.clubdelphi.com/foros/showthread.php?t=70815)

_CALI 12-11-2010 07:07:25

como acceder a los controles de un formulario desde otro
 
sres, un gusto como simpre , tengo un problema al tratar de acceder a los controles de un formulario desde otro

ejm: tengo el Form1 que deriva de TForm1 y ahi hay controles que deseo acceder desde el Form2 en una aplicacion MDI


lo que hago es:


llamada al form2 desde form1

Form1 := TForm1.Create(Self);


luego en Form2 desde un boton trato de acceder a los controles de form1 por ejemplo Edit1 de esta manera:

(Self.Parent as TForm1).Edit1.Text := 'Hola'; y nada me vota horror!!!


trabajo en formularios MDI, facil huviera puesto: Form1.Edit1.Text := 'Hola';

pero ojo, cuando abro varios formularios (Form1) y asu ves desde cada uno de estos habro a sus respectivos (Form2), con la sentencia anterior solo se cambia el edit de un solo formulario (Form1), pero con el primer codigo, se cambiaba correctamente el Edit de cada formulario.

uso delphi 2010, me acuerdo q en delphi 7 funcionaba bien o me habre olvidado???
gracias de antemano amigos!!!:)

ecfisa 12-11-2010 07:29:49

Hola _CALI.

No sé si entendí muy bien tu planteo, pero a ver si es esto...

Supongamos que tenemos dos forms: FMain y FChild, con sus propiedades FormStyle en fsMDIForm y fsMDIChild respectivamente asignadas.
En FMain tenemos un TEdit y en FChild un TButton que al presionarlo le manda un texto al TEdit ubicado en FMain.
Una forma es que FChild incluya en la clausua uses a FMain y de ese modo podríamos usar al TEdit de FMain. (referencia circular)

Con un ejemplo:

FMain:
Código Delphi [-]
...
type
  TFMain = class(TForm)
    Edit1: TEdit;
    procedure FormShow(Sender: TObject);
  private
  public
  end;

var
  FMain: TFMain;

implementation {$R *.dfm}

uses Unit2; { donde esta TFChild }

procedure TFMain.FormShow(Sender: TObject);{ necesario si sacamos FChild de Auto-create forms }
begin
  TFChild.Mostrar;
end;
...


FChild:
Código Delphi [-]
...
type
  TFChild = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
    class procedure Mostrar;{ necesario si sacamos FChil de Auto-create forms }
  end;

var
  FChild: TFChild;

implementation {$R *.dfm}

uses Unit1; { donde esta TFMain }

class procedure TFChild.Mostrar;{ necesario si sacamos FChild de Auto-create forms }
begin
  if not Assigned(FChild) then
    FChild:= TFChild.Create(nil);
end;

procedure TFChild.Button1Click(Sender: TObject);
begin
  FMain.Edit1.Text:= 'Hola FMain...';
end;
...


Saludos. :)

_CALI 12-11-2010 20:09:51

gracias por responder ecfisa, pero mi planteo es algo diferente siguiendo el el siguiente esquema:




formulario principal es FMain que esta en la unit1
formulario clientes es FChild que esta en la unit2, ahi es donde esta el Edit
formulario buscar clientes es Fchid_b que esta en la unit3, ahi es donde esta el boton

ahora como hago para cambiar el edit del formulario clientes 2 desde el boton del formulario buscar clientes 2?, siguiendo tus recomendaciones si hago eso se cambia el edit del formulario clientes 1 mas no del formulaario clientes 2 , ojala me explique bien , muchas gracias de antemano!!!:)

ecfisa 12-11-2010 20:29:27

Cita:

ahora como hago para cambiar el edit del formulario clientes 2 desde el boton del formulario buscar clientes 2?,
Hola _CALI.

Bueno, en ese caso basta con que agregues la clausula uses clientes 2, al formulario buscar clientes 2:
Código Delphi [-]
...
implementation {$R *.dfm}

uses Unit2; { Unidad donde está el form Clientes (FClientes) }

procedure TFBusqueda.Button1Click(Sender: TObject);
begin
  FClientes.Edit1.Text:= 'Aqui desde FBusqueda... ¿ Todo bien por allá ?';
end;
...

Saludos. :)

_CALI 12-11-2010 20:40:57

me causa el mismo resultado solo se cambia el edit de un formulario clientes,

la idea es que x ejemplo estando 3 formularios clientes abiertos, se cambie el edit del formulario clientes que llama a su propio buscar clientes uno para cada uno me acuerdo q lograba eso escribiendo lo siguiente:

(Self.Parent as FrmClientes).Edit1.Text := 'Hola padre!!';

donde Self.Parent es el formulario padre q llama a buscar clientes correspondiente


Muchas gracias amigo(a) de todas maneras!!!:(

ecfisa 12-11-2010 21:52:17

Hola de nuevo _CALI.

Perdón pero realmente creo no entenderte...:(

¿ Lo que buscas es que todos los FClientes abiertos reciban en su respectivo Edit, el texto que envía FBuscarCliente ?

Saludos. :)

_CALI 13-11-2010 00:37:39

Cita:

Empezado por ecfisa (Mensaje 382216)
Hola de nuevo _CALI.

Perdón pero realmente creo no entenderte...:(

¿ Lo que buscas es que todos los FClientes abiertos reciban en su respectivo Edit, el texto que envía FBuscarCliente ?

Saludos. :)

Claro!! su correspondiente FBuscarCliente
ejemplo:

FBuscarCliente 1 que modifique el edit del FCliente1
FBuscarCliente 2 que modifique el edit del FCliente2
FBuscarCliente 3 que modifique el edit del FCliente3
.
.
FBuscarCliente N que modifique el edit del FCliente N

Gracias por tu apoyo:)

ecfisa 13-11-2010 00:54:48

Cita:

Empezado por _CALI (Mensaje 382228)
Claro!! su correspondiente FBuscarCliente
ejemplo:

FBuscarCliente 1 que modifique el edit del FCliente1
FBuscarCliente 2 que modifique el edit del FCliente2
FBuscarCliente 3 que modifique el edit del FCliente3
.
.
FBuscarCliente N que modifique el edit del FCliente N

Hola _CALI.

Si es así, serviría el ejemplo de arriba.

Para BuscarCliente1 sería:
Código Delphi [-]
implementation
uses Unit2; { FCliente1 }

procedure TFBusqueda.Button1Click(Sender: TObject);
begin
  FCliente1.Edit1.Text:= 'MENSAJE';
end;
Para BuscarCliente2:
Código Delphi [-]
implementation
uses Unit4; { FCliente2 }

procedure TFBusqueda.Button1Click(Sender: TObject);
begin
  FCliente2.Edit1.Text:= 'MENSAJE';
end;

...

Es decir, incluyendo la unidad de cada FCliente(N) en cada unidad BuscarCliente(N) que tengas...

Saludos. :)

_CALI 13-11-2010 01:00:26

:)
GRACIAS!!!, pero sucede que cada FCliente es uno mismo Fcliente 1, FcLiente2 ... FClienteN es un solo formulario que esta en la unidad 2
y cada FBuscarCliente tambien es un solo formulario, solo que lo llamo varias veces hay varias instacias de FClientes y de FBuscarCliente, por eso es medio complicado sigo renegando sin solucionarlo jejejej Gracias de nuevo

ecfisa 13-11-2010 01:09:04

Recién ahora te entiendo! :)

Lo voy a pensar, si se me ocurre algo te aviso.

Saludos:)

ecfisa 13-11-2010 04:38:35

Hola _CALI.

Como lo prometido es deuda, despues de unas pruebas, aca vuelvo.
La unit que tiene el form FBusca (la que cambia el Edit), debe utilizar FMain y FClientes.
Debes respetar cierta regla en la creación de los nombres de los forms FBusca y FClientes. Serán los nombres que decidas; pero seguidos de un número consecutivo. (esto para poder discriminarlos).

Bueno, vamos al código:

FMain (Unit1): Sólo tiene un MainMenu con un item 'Crear'.
Código Delphi [-]
...
type
  TFMain = class(TForm)
    MainMenu1: TMainMenu;
    Organizar1: TMenuItem;
    Crear1: TMenuItem;
    procedure Crear1Click(Sender: TObject);
    procedure Ventanas1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FNumChild: Integer;
  public
  end;

var
  FMain: TFMain;


implementation  {$R *.dfm}

uses Unit2, Unit3;

procedure TFMain.FormCreate(Sender: TObject);
begin
  FNumChild:= 1;
end;

procedure TFMain.Crear1Click(Sender: TObject);
begin
  with TFCliente.Create(nil) do
  begin
    Name:= 'FCliente'+IntToStr(FNumChild);
    Caption:= Name;
    Show;
  end;
  with TFBusca.Create(nil) do
  begin
    Name:= 'FBusca' + IntToStr(FNumChild);
    Caption:= Name;
    Show;
  end;
  Inc(FNumChild);
  TileMode:= tbVertical;
  Tile;
end;
end.

FCliente (Unit2): Sólo tiene un edit: TEdit1, el receptor que deberá llamarse así . ( no agrego el código)

FBusca (Unit3): Sólo tiene un TButton.
Código Delphi [-]
...
type
  TFBusca = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

var
  FBusca: TFBusca;

implementation {$R *.dfm}

uses StrUtils, Unit1, Unit2;

procedure TFBusca.Button1Click(Sender: TObject);
var
  i: Integer;
  Nombre: string;
begin
  for i:= 0 to FMain.MDIChildCount -1 do
  begin
    Nombre:= FMain.MDIChildren[i].Name;
   //Si decidis darle otro nombre que FCliente al form Clientes, debes cambiarlo también aqui,
   // lo mismo para Edit1 de FCliente.
    if (Pos('FCliente',Nombre) <> 0)and(RightStr(Nombre,1)=RightStr(Name,1))then
      (FMain.MDIChildren[i] as TFCliente).Edit1.Text:= 'SALUDOS DE '+Name;
  end;
end;
end.


Saludos. :)

ecfisa 13-11-2010 21:32:20

Hola de nuevo.

Una variante del código anterior puede ser:
FMain:
Código Delphi [-]
  with TFCliente.Create(nil) do
  begin
    Tag:= FNumChild;
    Show;
  end;
  with TFBusca.Create(nil) do
  begin
    Tag:= FNumChild;
    Show;
  end;
  Inc(FNumChild);

FBusca:
Código Delphi [-]
procedure TFBusca.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to FMain.MDIChildCount -1 do
  begin
    if (FMain.MDIChildren[i] <> Self) and
       (FMain.MDIChildren[i].Tag = Tag) then
      (FMain.MDIChildren[i] as TFCliente).Edit1.Text:= 'SALUDOS DE ' + Name;
  end;
end;

De este modo evitas la restricción de nombres que tiene el código anterior, pero tenés que cuidar el valor de los Tag's
que asignes al resto de los Forms. Una posibilidad es inciar FNumChild a un valor alto que sepas, no vas a usar para
el resto.

Saludos. :)

_CALI 16-11-2010 23:23:03

correcto
 
Gracias ecfisa!!! te pasaste. Saludos!!!:)

_CALI 20-11-2010 01:24:36

Gracias ecfisa a tu ayuda pude encontrar una solucion
 
despues de tanto laberinto aveces las soluciones son las mas faciles

orientandome en tu codigo pude resolver mi problema muy efectivamente


suponiendo q tenemos un form principal, y dos fromularios hijos child
que son clientes y busqueda de clientes

me di cuenta que MDIChildren[0] es el formulario hijo activado osea activeMDIChild

pues entonces MDIChildren[1] es el "parent" de MDIChildren[0] cierto???

entoces simplemmnte puse:

if (application.mainform.MDIChildren[1] is TFRMClientes) then
(application.mainform.MDIChildren[1] as TFRMClientes).Edit1.text := 'por fin';


Gracias denuevo ecfisa me sirvio de mucho tu colaboracion!!!

:)

ecfisa 20-11-2010 02:23:28

Hola _CALI.

Funciona de forma segura siempre y cuando tengas sólo un par de MDIChilds abiertos. Pero puede no ser así si hay más pares de forms abiertos.

Supongamos que tenemos abiertos dos pares de forms creados en este órden: FSender, FReceiver.
Creamos cuatro:
1:FSender1
2:FReceiver1
3:FSender2
4:FReceiver2

El form activo es ahora FReceiver2.

Si en esta instancia haces click en el TButton del form FSender1, le enviará el mensaje a FReceiver2 y no es el comportamiento que buscas.

Por otro lado si haces click en el TButton del form FSender2, FReceiver2 recibe el mensaje; pero FReceiver1 no recibirá ningun mensaje hasta que adquiera el foco ( sea el form activo ).

Para que este efecto no se produzca es necesario hacer click sobre cada form FReceiverN (hacerlo activo) para luego enviar el mensaje.
Ahora, si es condición necesaria que el form receptor este activo para que pueda recibir un mensaje, funciona.

Espero haberme explicado bien...

Saludos. :)


La franja horaria es GMT +2. Ahora son las 17:00:13.

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