Ver la Versión Completa : 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:
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
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.
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
He aprendido un montón de cosas en poco tiempo.
Muchas gracias a todos por vuestra ayuda.
bulc
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.
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
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.
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.