Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cambiar propiedad boton Unit1 desde evento Unit2 (https://www.clubdelphi.com/foros/showthread.php?t=77817)

jocaro 28-02-2012 13:20:00

Cambiar propiedad boton Unit1 desde evento Unit2
 
Hola. A ver si alguno me podéis ayudar, por favor.

Tengo un form con sus correspondientes botones y demás componentes en una unit1 principal (SDIMAIN), que hace uso de una unit2 (BasDat), con los componentes propios de acceso a base de datos.

Deseo utilizar el evento ondatachange de un datasource que está definido en BasDat, para modificar una propiedad de un botón definido en SDIMAIN, en concreto boton.enabled := true, cuando haya un cambio de datos en una tabla.

Muy simplificado quedaría un código así:

unit SDIMAIN

...
uses BasDat...
...
boton.enabled := false
...

unit BasDat

...
procedure TBasDat.DatosNotasDataChange(Sender: TObject; Field: TField);
begin
if TablaNotas.Modified then (ttable)
'poner boton de la otra unit a true'
end;

Gracias y un saludo.

duilioisola 28-02-2012 14:10:18

Teniendo la unidad destino en el USES debes escribir Unit.Componente.Propiedad := ???
Código Delphi [-]
unit SDIMAIN
...
uses BasDat...
...
boton.enabled := false
...
------------------------------

unit BasDat
...
uses SDIMAIN
...
procedure TBasDat.DatosNotasDataChange(Sender: TObject; Field: TField);
begin
  if TablaNotas.Modified then (ttable)
    SDIMAIN.Boton.Enabled := True;
end;

De todos modos es mejor hacerlo mediante métodos.
De esta forma, si luego agregas un label u otro botón o cualquier cosa que dependa de que esté habilitado o no, solo deberás cambiar la parte de SDIMAIN y no el resto de units que lo utilizan.
Código Delphi [-]
unit SDIMAIN
...
type
  TFormSDIMain= class(TForm)
  ...
  public
     procedure HabilitaBotones;
  end;

uses BasDat...
...
procedure TFormSDIMain.HabilitaBotones;
begin
   // Este procedimiento habilita botones en este formulario
   Boton.Enabled := True;
   // Tambien podría:
   // - poner visible o invisible algunas cosas
   // - cambiar colores
   // - modificar comportamientos de componentes
   // - etc.
end;
...
------------------------------

unit BasDat
...
uses SDIMAIN
...
procedure TBasDat.DatosNotasDataChange(Sender: TObject; Field: TField);
begin
  if TablaNotas.Modified then (ttable)
    SDIMAIN.HabilitaBotones;
end;

jocaro 28-02-2012 18:31:27

Código Delphi [-]unit SDIMAIN

uses BasDat
...
boton.enabled := false
...
------------------------------

unit BasDat

uses SDIMAIN
...
procedure TBasDat.DatosNotasDataChange(Sender: TObject; Field: TField);
begin
if TablaNotas.Modified then (ttable)
SDIMAIN.Boton.Enabled := True;
end;


Hola, una vez realizados los cambios, al compilar produce el siguiente error

[DCC Fatal Error] BasDat.pas(8): F2047 Circular unit reference to 'BasDat'

Se produce una referencia de SDIMAIN en BasDat y viceversa.

¿Alguna alternativa para solucionarlo?

Un saludo.

ecfisa 28-02-2012 18:47:20

Cita:

Empezado por jocaro (Mensaje 426366)
¿Alguna alternativa para solucionarlo?

Si, incluí las unidades luego de la declaración de implementación:

Código Delphi [-]
...
implementation

uses SDIMAIN;
...

Saludos.

duilioisola 28-02-2012 18:52:19

Tienes dos partes en una unit: Interfaces e implemantation.
Ambas tienen una sección uses.
Deberás poner una en un uses de una parte y otra en la otra.
Código Delphi [-]
unit UFMPrueba_A;

interface

uses
  Windows, Classes, Forms;

type
  TFMPrueba_A = class(TForm)
     Boton: TButton;
     ...
  private
     { Private declarations }
  public
     { Public declarations }
  end;

var
  FMPrueba_A: TFMPrueba_A;

implementation

{$R *.DFM}

uses UPrueba_B;
...

------------------------------------------------------------
unit UFMPrueba_B;

interface

uses
  Windows, Classes, Forms;

type
  TFMPrueba_B = class(TForm)
     ...
  private
     { Private declarations }
  public
     { Public declarations }
     procedure Evento(Sender: TObject);
  end;

var
  FMPrueba_B: TFMPrueba_B;

implementation

{$R *.DFM}

uses UPrueba_A;

procedure TFMPrueba_B.Evento(Sender: TObject);
begin
   UFMPrueba_A.Boton.Enabled := False;
end;
...

jocaro 28-02-2012 19:18:30

Hola duilioisola y ecfisa

Muchas gracias por vuestra ayuda

Ha funcionado correctamente.

Código Delphi [-]
procedure TFrmBasDat.DatosNotasDataChange(Sender: TObject; Field: TField); 
begin   
if TablaNotas.Modified then     
SDIMAIN.SDIAppForm.btnGuardar.Enabled := True; (esto lo pasaré a un procedimiento para llamarlo desde onDataChange de varias tablas) 
end;

Un saludo y de nuevo gracias.


La franja horaria es GMT +2. Ahora son las 03:53:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi