PDA

Ver la Versión Completa : Acceso a la prop State de ClientDataSet en otro Form


bulc
07-12-2016, 15:01:44
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:

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
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
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:

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
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 [-] (http://www.clubdelphi.com/foros/#)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
¿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:


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.
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.


¿Cómo se puede llamar a una función que está en un Form1 desde otro Form2-?


Como función independiente,

unit Unit1;

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

function foo: Integer;

...
implementation

function foo: Integer;
begin
...
end;

y desde Form2 se la llama:

...
implementation

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


Como método de Form1,

unit Unit1;

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

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


y desde Form2 se la llama:

...
implementation

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


Saludos :)

Caminante
07-12-2016, 18:19:30
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
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
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:


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
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
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.