Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Acceso a la prop State de ClientDataSet en otro Form (https://www.clubdelphi.com/foros/showthread.php?t=91228)

bulc 07-12-2016 15:01:44

Acceso a la prop State de ClientDataSet en otro Form
 
Quiero obtener acceso a la propiedad State de un ClientDataSet1 situado en el Form1 (Form Principal) del UMain1.
Estoy situado en el Form2 (UEdit2) y quiero hacer esto:

Código Delphi [-]
procedure TForm2.BtnAlterClick(Sender: TObject);
begin
 if Form1.ClientDataSet1.State in [dsBrowse] then
 begin
    Form1.ClientDataSet1.Edit;
    isAlter:=True;
    //BtnEditOn.Click;
    Form2.Color:=clBackGround;
 end;
end;
Tengo en el USES del Form2, referencia al Unit1 (Form1) pero aún así me da error dentro de los corchetes, osea en [dsBrowse].
¿Alguien me puede ayudar?

Caminante 07-12-2016 15:17:02

Hola

Agregaste la unidad DB tambien?


Saludos

bulc 07-12-2016 17:23:00

Era eso, efectivamente
 
Has acertado a la primera. Lo acabo de hacer y ya compila.
¿Qué añade la unidad DB que permite acceder a las propiedades del ClientDataSet? Porque al propio CLS sí que accedía, pero no a sus propiedades.
¿Se puede explicar?
Muchas gracias por tu agudeza.
No sé que sería de mi sin el Club...
Saludos,
Bulc

Al González 07-12-2016 17:30:19

¿El compilador te dice que dsBrowse no está declarado? Es porque esa constante pertenece a la unidad DB. ;)

La expresión "Form1.ClientDataSet1.State" no era el problema, sino la expresión "[dsBrowse]".

Saludos.

bulc 07-12-2016 17:46:49

Ya sabes... tirando del hilo. Espero no pasarme.
 
Suponía que la constante csBrowse estaba definida en el ClientDataSet.
De todos modos he puesto Data.DB (y no DB a secas), debido a que es el módulo que veo en la unidad principal.
Tengo una función en el Form1 de este avío:
Código Delphi [-]
Function REVISA_GEN( IBQuery1: TIBQuery; EsNuevo : Boolean ) : Integer;
Var
  Avance : String;   //  weather IsNew is True/False, Avance is 1 or returns Gen_id
begin
  if EsNuevo then Avance := '1' else Avance:= '0';
  begin
    IBQuery1.Close;
    IBQuery1.SQL.Clear;
    // You can use 'Show generators;' in Firebird2.5 to see its value.
    IBQuery1.SQL.ADD('SELECT GEN_ID( GEN_ARBOL,'+ Avance+ ') FROM RDB$DATABASE');
    IBQuery1.Open;  // 
    Result := IBQuery1.Fields[0].AsInteger;
  end;
END;
y quiero llamarla desde la Form2 así: NumGen:=Form1.REVISA_GEN( Form1.IBQuery1, False, Form2.Label1);
Pero el REVISA_GEN se queda subrayado en rojo, osea que es erróneo. ¿Cómo se puede llamar a una función que está en un Form1 desde otro Form2-?
Y con esto te doy las gracias. Ya está bien por hoy. No me atrevo a preguntar más.
Saludos,
bulc

Caminante 07-12-2016 18:07:04

Cita:

Empezado por bulc (Mensaje 511580)
Suponía que la constante csBrowse estaba definida en el ClientDataSet.
De todos modos he puesto Data.DB (y no DB a secas), debido a que es el módulo que veo en la unidad principal.
Tengo una función en el Form1 de este avío:
Código Delphi [-]Function REVISA_GEN( IBQuery1: TIBQuery; EsNuevo : Boolean ) : Integer; Var Avance : String; // weather IsNew is True/False, Avance is 1 or returns Gen_id begin if EsNuevo then Avance := '1' else Avance:= '0'; begin IBQuery1.Close; IBQuery1.SQL.Clear; // You can use 'Show generators;' in Firebird2.5 to see its value. IBQuery1.SQL.ADD('SELECT GEN_ID( GEN_ARBOL,'+ Avance+ ') FROM RDB$DATABASE'); IBQuery1.Open; // Result := IBQuery1.Fields[0].AsInteger; end; END;

y quiero llamarla desde la Form2 así: NumGen:=Form1.REVISA_GEN( Form1.IBQuery1, False, Form2.Label1);
Pero el REVISA_GEN se queda subrayado en rojo, osea que es erróneo. ¿Cómo se puede llamar a una función que está en un Form1 desde otro Form2-?
Y con esto te doy las gracias. Ya está bien por hoy. No me atrevo a preguntar más.
Saludos,
bulc

Hola

Seria bueno ver el mensaje de error pero aun asi veo que los parametros en la declaracion y en la forma en que llamas a la funcion difieren.

Saludos

roman 07-12-2016 18:15:01

Cita:

Empezado por bulc (Mensaje 511580)
¿Cómo se puede llamar a una función que está en un Form1 desde otro Form2-?

Tal como la tienes declarada, REVISA_GEN es una función y no un método de Form1. Por tanto, deberías poner sólo:

Código Delphi [-]
NumGen := REVISA_GEN( Form1.IBQuery1, False, Form2.Label1);

y -claro- agregar la unidad donde esté declarada en el uses de la unidad donde la uses. También atiende a lo que comenta Caminante, pues el número de parámetros de la declaración no coincide con el de la llamada.

LineComment Saludos

ecfisa 07-12-2016 18:18:16

Hola.
Cita:

Empezado por bulc (Mensaje 511580)
Suponía que la constante csBrowse estaba definida en el ClientDataSet.

Es que cuando tiras un componente TClientDataSet en el formulario se agrega la unidad DB en la cláusula uses automáticamente.

Cita:

Empezado por bulc (Mensaje 511580)
¿Cómo se puede llamar a una función que está en un Form1 desde otro Form2-?

Como función independiente,
Código Delphi [-]
unit Unit1;

type
  TForm1 = class(TForm)
  ...
  end;

  function foo: Integer;

...
implementation

function foo: Integer;
begin
  ...
end;
y desde Form2 se la llama:
Código Delphi [-]
...
implementation

procedure TForm2.Button1Click(Sender: TObject);
begin
  foo;
end;

Como método de Form1,
Código Delphi [-]
unit Unit1;

type
  TForm1 = class(TForm)
  ...
  public
    function foo: Integer;
  end;
...
implementation

function TForm1.foo: Integer;
begin
   ...
end;

y desde Form2 se la llama:
Código Delphi [-]
...
implementation

procedure TForm2.Button1Click(Sender: TObject);
begin
  Form1.foo;
end;

Saludos :)

Caminante 07-12-2016 18:19:30

Cita:

Empezado por roman (Mensaje 511585)
Tal como la tienes declarada, REVISA_GEN es una función y no un método de Form1.

ummm no me habia percatado que no era un miembro de la clase.

Saludos

bulc 07-12-2016 22:30:52

El miembro de la clase soy yo
 
He aprendido un montón de cosas en poco tiempo.
Muchas gracias a todos por vuestra ayuda.
bulc

bulc 08-12-2016 11:24:55

No consigo acceder al ClientDataSet del DataModul
 
Tengo el DataModul en Unit UDataModul4 y su Form FDataModul4 pero no consigo acceder al ClientDataSet1 que contiene desde el Form FEdit2. FEdit2 referencia a UDataModul4 en Uses tras Implementation:
Intento ejecutar:

Código Delphi [-]
procedure TFEdit2.BtnNewClick(Sender: TObject);
begin
  if UDataModul4.FDataModul4.ClientDataSet1.State in [dsBrowse] then
   begin
      UDataModul4.FDataModul4.ClientDataSet1.Insert;
   end;
end;
Me da el error: Undeclared identifier 'ClientDataSet1'... Ya sé que es parte de lo anterior, pero he revisado todos los nombres y ... nada.

bulc 08-12-2016 11:34:11

Autorespuesta
 
El error se debía a que el nombre del Form del DataModul4 era DataModule4 (con una e de más). Ya funciona, ok.
Gracias a todos.
bulc

bulc 09-12-2016 16:30:55

Además...
 
Como resultado final:
He colocado la declaración de la Función que obtiene el nº de Generator (Get_Gen_Id) dentro del DataModule colocándola en su Interface. De ese modo accede directamente a los componentes de acceso a Datos (Data Access). Y la llamo al inciar la aplicación con su evento onCreate.
Por otro lado también se puede llamar desde otros Forms, puesto que el DataModul está en sus Uses.
Gracias.


La franja horaria es GMT +2. Ahora son las 16:41: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