PDA

Ver la Versión Completa : devolver valores al form que lo llamo


djanp
10-12-2007, 13:55:24
hola a todos

mi duda de hoy es , como puedo devolver valores desde un frame a un form q lo ha "invocado" me explico

tengo X form en los que tengo q poner el agente en un campo, por lo que he creado un Frame(esto es discutible si poner otra cosa) en el cual tengo la tabla de todos los agentes en un DBgrid(con su tabla, DS etc) y un boton ACEPTAR para cerrar la ventana y enviar el agente actual en el dbgrid

lo que no se es como mandar esos datos de agente(codigo y nombre) al form q lo invoco, dado q lo hare de distintos form queiro q sea generico, no a un determinado form

gracias a todos por la ayuda

BlueSteel
10-12-2007, 14:13:14
Hola djanp

Eso lo puedes realizar de diferentes formas....

antes de que cierres el formulario de donde rescatas los datos deberias asignar los valores al formulario que lo llama...

sería algo así...

supongamos que tienes Form1 y Form2... en Form1 tienes Var1, Var2.. y Form2 tienes Nombre, Fec_Nac....

lo puedes llamar de la sgte forma:

Antes de Cerrar el Form2.. puedes hacer esto
Form1.Var1 := Nombre;
Form1.Var2 := Fec_Nac;


Espero que te sirva

salu2:p:D

Lepe
10-12-2007, 14:13:59
Este mensaje (http://www.clubdelphi.com/foros/showpost.php?p=251466&postcount=7) hace lo que dices, podrás echarle un vistazo también al hilo completo si trabajas con mdichilds y showmodal para algunas ventanas.

Saludos

djanp
11-12-2007, 14:06:19
lo de blueSteel esta bien pero solo puedo usar el frame para un form dado q le devolvera a ese form los datos...lo q no me vale

mmm a ver como es el tema de Lepe...

la funcion abrirventana es un simple open form??? pq ahora mis mo no se como ahcerlo
y en cuanto a los q devuelve la funcion buscar, lo q queiro me lo devuelve en BUSCAREN, pero en que momento se meten


TBuscar = (codigo, nombre); estos son los 2 valores q quiero sacar...

Function TPC.Buscar( BuscarEn:TBuscar; InternalOpen :Boolean):String;
begin
Result := false; en mi caso quiero q sea string lo q devuelva...
case BuscarEn of
codigo :
with Tagente.Create(nil) do
try
if ShowModal = mrOk then
// en la ventana de busqueda se seleccionó un cliente válido
Result := DBGagentes.Fields[0].AsString;
finally
Free;
end;
end;
if (InternalOpen) then
if Result = false then // si no elige nada en la ventana de búsqueda, Result tendrá el valor -1.
AbrirVentana(BuscarEn, Result);
end;

Lepe
11-12-2007, 17:20:21
Al parecer, requieres algo distinto a lo que yo propongo.

El botón Aceptar no debe enviar nada a ningún Form. El Form que invoca el frame, será el responsable de capturar los datos.

Lo más cómodo, crear en el Frame un par de propiedades, esto hará mucho más legible el código cuando usemos el frame en todas las ventanas.

type TAgente = Class(TFrame)

private
function GetCodigo:integer;
procedure Setcodigo(Value:integer);
function GetAgente:string;
public
property Codigo: integer read GetCodigo write SetCodigo;
property Agente: string read GetAgente; // propiedad de solo lectura
end;

implementation

function TAgente.GetCodigo:integer;
begin
Result := tblClientes.Fieldbyname('codigo').Asinteger;
end;

procedure TAgente.SetCodigo(Value :integer);
begin
tblClientes.Open; // debe estar abierta la tabla antes de buscar
if Value <> GetCodigo then
begin
if not tblcliente.locate('codigo', value, []) then
ShowMessage('No se encuentra el agente con código ' + inttostr(Value));
end;

function TAgente.GetAgente:string;
begin
Result := tblCliente.fieldbyname('Nombre').AsString;
end;


Esto es algo más complejo de lo que has pedido, pero lo necesitarás.

Lo que he hecho es definir 2 propiedades que tendrán los datos del agente elegido en el grid, además doy la posibilidad de que muestre un agente seleccionado al mostrar el frame.

por ejemplo: Toda venta de un negocio, tiene asociado un "Agente de venta", bien, desde una ventana "Ventas" quiero mostrar el frame y seleccionar el agente de código 20:

"F" es un frame TAgente puesto en la ventana "ventas".

procedure Tventa.Button1Click(...);
begin
F.Codigo := 20;
end;

Si ahora en la ventana de ventas, queremos saber qué agente hay seleccionado en el frame:

procedure Tventas.TablaVentasBeforePost(....);
begin
tablaVentas.CodigoAgente := F.Codigo;
label1.caption := F.Agente; // el nombre del agente no sé que hacer con él
// lo pongo en un label :D
end;

Saludos y espero se entienda, si no, dime cualquier cosa :D Saludos

djanp
12-12-2007, 13:22:09
puffff ojala pudiera comprobarlo pero ahora tengo un error
class Tbutton not found....es curioso pq he quitado todos los button q tenia a ver si se corregia y nada...

Lepe
12-12-2007, 13:28:49
Parece que hubieses tocado las opciones del Library Path (Tools -> Environment Options -> Library Path)

Tbutton está declarado en la unidad StdCtrls.pas de la vcl, si el IDE de delphi no encuentra ese archivo, no puede compilar.

Prueba a añadir "StdCtrls" en los uses a ver...

Saludos

djanp
12-12-2007, 13:35:44
ya lo tienen todos peustos , y añadi BUTTON a los q da el problema, pero nada...

djanp
19-12-2007, 12:53:41
bueno ya corregi el problema, pero tengo una duda de como scar el frame
como hago para q salga en otra ventana pequeña? q pongo en ???
y como hago para no tener q crear de nuevo un frame en TpvBeforePost?
que utilice el que he creado enel procedure Bagenteclick


procedure TPV.BagenteClick(Sender: TObject);
begin
with Tframeagen.Create( Self ) do
begin
Visible := True;
Parent. := ???;
end;
end;

procedure TPV.TpvBeforePost(DataSet: TDataSet);
begin
TPV.FieldbyName('C Agente').AsString := TFrameagen.Create(self).Codigo;
DBEdit14.DataField:= frameagen.Fframeagen.Agente;
end;


graicas

Lepe
20-12-2007, 13:36:12
No sé como estás trabajando, lo normal, es poner el frame en tiempo de diseño, es decir, paleta Standard de delphi, Frame, y ahora haces click en el form TPV, te pedirá que elijas un Frame y lo añade a ese Form.

Ese Frame es un componente más (como un TEdit, TDBEdit, etc), puedes hacer referencia a él como otro componente cualquiera.

Así te olvidas de de crear el frame en tiempo de ejecución (TFRameAgen.Create(self).

SAludos