Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Sumar 2 valores ubicados en 2 celdas de sendos grids en diferentes ventanas. (https://www.clubdelphi.com/foros/showthread.php?t=77156)

AzidRain 28-12-2011 01:57:16

Sumar 2 valores ubicados en 2 celdas de sendos grids en diferentes ventanas.
 
Tenemos 2 ventanas hijas que descienden del mismo ancestro, son idénticas en todo solo que la información que muestran puede variar por cuestion de fechas. Ambas contienen un grid que muestra exactamente las mismas columnas. ¿Como se podría hacer que al seleccionar una celda de una de ellas y luego una de la otra ventana podamos hacer cualquier cálculo? (suma, resta, etc.) El como acceder al valor de la celda es trivial pero estoy atorado en como manejar los mensajes pues es obvio que quien haría el cálculo sería la ventana padre. Es una idea loca que se me ocurrió, basado en lo que hace Excel 2007 que seleccionando celdas nos da su suma o cualquier otra operación

newtron 28-12-2011 09:48:20

Hola.

No sé si he pillado lo que quieres decir pero si tuvieras dos variables en las que fueras guardando el valor de la celda de uno y otro grid según vas picando en uno y otro podrías hacer las operaciones entre ellas, ¿no?.

Saludos

Casimiro Notevi 28-12-2011 12:01:45

Tampoco entiendo bien la pregunta, ¿dices que tienes dos ventanas hijas donde están los datos y que el cálculo debe hacerlos la ventana padre?.

AzidRain 28-12-2011 17:42:34

Digamos que son dos ventanas hijas, cada una tiene un grid sencillo digamos de 3 x 3 (o sea nueve celdas) con valores numericos cada una. La idea es que al ser amodales podemos seleccionar una u otra ventana. Ahora bien, digamos que selecciona una celda cualquier en cada ventana, ¿Como podría hacer el cálculo de la suma (o cualquier otra operación) de las celdas seleccionadas? Habia pensado en que se mandara un mensaje a su padre para indicar: padre, que me han seleccionado un celda con este valor x y el padre se encargara de mantener el total de la operación, si cerramos la celda o seleccionamos otra cosa el mensaje sería, "padre, ya no me han seleccionado nada" y entonces restamos el valor (en caso de suma). El chiste es que pueda hacer con cualquier número de ventanas hijas.

Chris 28-12-2011 20:13:39

mmm creo entender lo que quieres Azid...

Según entiendo el problema, yo lo que haría sería implementar un mensaje de Windows a cómo sugieres y luego en el padre hacer la suma... por ejemplo así:

en las ventanas hijas, al seleccionar una celda o cerrar la ventana:
Código Delphi [-]
begin
    PostMessage(FormularioPadre.Handle, WM_SELECTEDCELLCHANGED, 0, 0);
end;

En el formulario padre:
Código Delphi [-]
...
protected
    procedure SumarCeldas(Message: TMessage); message WM_SELECTEDCELLCHANGED;
...
...

procedure TFormularioPadre.SumarCelda(Message: TMessage);
var
    I, B: Integer;
    selected_sum: Integer;
begin
    for I := to Screen.FormCount - 1 do
        if Screen.Forms[i].inheritsFrom(TAncestroVentanaHija) then
            with TAncestroVentanaHija(Screen.Forms[i]).Regilla do
                // sumar las celdas seleccionadas utilizando
                // la propiedad SelectedRows del grid.
end;

Saludos!
Espero que hallas entendido mi pseudo código y te ayude a resolver el problema.

ecfisa 29-12-2011 04:09:14

Hola AzidRain.

Siempre que todos los StringGrids (que haya en cada MDIChild) tengan el mismo nombre, otra opción que se me ocurre es:

MDIForm
Código Delphi [-]
type
  TOPer = (opSuma, opResta);
  TMDIForm = class(TForm)
    ...
  private
    function OperarGrid(Oper: TOper): Double;
  end;

...

implementation   

function TMDIForm.OperarGrid(Oper: TOper): Double;
var
  i: Integer;
begin
  Result:= 0;
  for i:= MDIChildCount-1 downto 0  do
    with MDIChildren[i].FindComponent('StringGrid1') as TStringGrid do
      case Oper of
        opSuma : Result:= Result + StrToFloat(Cells[Col,Row]);
        opResta: Result:= Result - StrToFloat(Cells[Col,Row]);
      end;
end;
...
Si se tratara de DBGrids cambiando el cast funciona igualmente (con SelectedField). La cosa se complicaría un poco si también existen campos no numéricos...


Saludos.

AzidRain 30-12-2011 01:06:10

Gracias a Chris y eficsa ya con sus ideas me aclaran lo que pensaban implementar, amabas me sirven. En cuanto implemento posteó como quedo al final. Sin duda a alguien le va a servir y le va a ahorrar tiempo ya que es bastante útil y evita estar haciendo reportes adicionales solo para saber una cifra.

chartres 30-12-2011 19:10:36

Mas facil todavia
 
imagino que usas delphi.

simplemente relaciona la Formas, osea menu File - Use unit y selecciona las unidades que ocupas que trabajen juntas, facil y rapido.

de ahi agregas ya sea variables o algun componente como un texedit en la forma padre para cada dato que
mandes

en las formas hijas que tengan el grid le pones en el evento que use x ejemplo

procedure Grid.oncellclic

//si agragaste componente edit
formapadre.texedit1.text:=grid.value;

//si es variable
formapadre.variable:=grid.value;

y asi puedes mandar y tomar datos de ambas formas.

el codigo no es tal como va, solo es para ilustrar

AzidRain 30-12-2011 20:54:52

Chartres, no es eso de lo que se trataba, es un poco mas complejo, lee bien las aportaciones de eficsa y Chris. ¿Has visto como en en excel si seleccionas varias celdas, automáticamente te da su suma (o cuenta o lo que sea) en un espacio de la ventana? Pues es lo que quiero implementar. Como lo han planteado ellos, es la forma más válida de hacerlo. Por otro lado mencioné que se trata de formas tipo MDI por lo que todas descienden de la misma clase por lo que para "comunicarse" con la forma padre no tienen de otra mas que con mensajes pues no tienen una variable que las instancíe directamente, además no queremos la suma de las celdas donde se hagan click, solo de las que esten seleccionadas.


La franja horaria es GMT +2. Ahora son las 16:44:19.

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