Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   evaluar expresion en dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=79138)

CrazySoft 10-06-2012 04:51:41

evaluar expresion en dbgrid
 
Estimados amigos tengo una duda como puedo evaluar una expresión numérica dentro de un dbgrid o que componente puedo usar
Por ejemplo
Que en un campo de tipo numérico ingrese 12-3 o 2*3 o 100*10/3-5 y que devuelva el resultado en el mismo o permita realizar el cambio del resultado mediante otra operacion

Gracias

Casimiro Noteví 10-06-2012 09:06:12

Mira este hilo, creo que es lo que buscas.

CrazySoft 10-06-2012 14:34:35

Gracias, pero lo que quiero es que me perimita realizarlo en la grilla, que sea parte de la grilla

Casimiro Noteví 10-06-2012 14:53:03

No lo entiendo, en el dbgrid aparece lo que hay en la base de datos. Si en la base de datos has guardado "12*(3/5)", entonces en el dbgrid aparecerá exactamente eso.
Ahora tú debes tomar ese texto y hacer el cálculo (para eso sirve la función que te he enlazado antes) y ahora puedes presentar el resultado en una columna calculada del dbgrid o donde quieras, eso ya depende de lo que quieras hacer.

CrazySoft 10-06-2012 16:30:31

Perdon lo que quiero es que se evalue automaticamte la expresion que le de y me almacene solo el valor no la expresion, lo que hice hasta el momento es usar el componente CalcExpress, y un edit que lo inclui al DBGrid, mi problema esta en que no puedo salir de la celda con las teclas de cursor o una ves terminado de editar

lo que hice fue a un dbgrid

Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
const IsChecked: array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
Begin
        if (Column.Field.FieldName = 'Expresion') then
            with Expresion do begin
                Left := Rect.Left + DBGrid1.Left + 1;
                Top := Rect.Top + DBGrid1.Top + 1;
                Width := Rect.Right - Rect.Left + 2;
                Width := Rect.Right - Rect.Left + 2;
                Height := Rect.Bottom - Rect.Top + 2;
                text := FloatToStr(ADOTable1Expresion.Value);
                Visible := True;
            end;
end;

procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin

    if (DBGrid1.SelectedField.FieldName = 'Expresion') then Expresion.Visible := False;
end;

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
    if (key = Chr(9)) then Exit;

    if (DBGrid1.SelectedField.FieldName = 'Expresion')
        then
    begin
        Expresion.SetFocus;
        SendMessage(Expresion.Handle, WM_Char, word(Key), 0);
    end;

end;

procedure TForm1.ExpresionClick(Sender: TObject);
begin
    DBGrid1.DataSource.Edit;

end;
procedure TForm1.ExpresionKeyPress(Sender: TObject; var Key: Char);
var
    CalcExpress1: TCalcExpress;
    args: array[0..100] of extended;
begin
    if key = #13 then
    begin
        CalcExpress1 := TCalcExpress.Create(self);
        CalcExpress1.Formula := Expresion.text;

        if DBGrid1.DataSource.State in [dsEdit, dsInsert] then
            ADOTable1Expresion.Value := CalcExpress1.calc(args);

        Expresion.text := floattostr(CalcExpress1.calc(args));
        CalcExpress1.free;
    end;
end;


mas conctratmente aqui esta el ejemplo

http://crazy-soft.net/descargas/DBGridExpresion.rar

Gracias, o hay algun componente que me realice lo que estoy hacendo

Casimiro Noteví 10-06-2012 16:59:38

Sí, más o menos se entiende lo que estás haciendo, pero realmente, ¿qué es lo quieres hacer?, lo mismo hay otras opciones más cómodas para hacer lo que quieres.

CrazySoft 10-06-2012 18:10:42

poder realizar una simple operacion de suma, resta, multiplicacion o division en la grilla

o que otra opcion mas sencilla hay

gracias

Casimiro Noteví 10-06-2012 18:36:11

Si lo haces en el dbgrid estás accediendo directamente a los datos en la base de datos, seguramente la mejor opción (si quieres hacerlo en el dbgrid) sea usar los métodos gettext y settext del mismo, busca por esos términos. Básicamente es "interceptar" lo escrito y hacer el cálculo y que al dbgrid (al dataset, realmente) le lleguen los datos ya calculados.

CrazySoft 10-06-2012 18:54:15

Gracias, pero hice la prueba y no me permite el ingreso de los operadores * y / para poder calcular
o hay un ejemplo bajo la manga


La franja horaria es GMT +2. Ahora son las 02:32:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi