Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-08-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 20
rgstuamigo Va por buen camino
Trabajando con StringGrid

Hola amigos foristas, tengo un StringGrid el cual 5 columnas y una de ellas es solo para datos numericos, La situasion es la siguiente:
Cuando el usuario esta editando la columna numerica y esta poniendo numeros reales; internamente en el evento OnSetEditText de StringGrid se va sumando la columna y mostrando en un edit; el problema es cuando en ves de poner el caracter coma "," pone un punto , entonces ahi se produce un error al convertir a Float esa celda, quise solucionarlo haciendo una conversion llamando a un metodo que yo mismo me hize;pero cuando lo llamo
la celda se seleciona con azul por defecto, y por tanto si el usuario sigue introduciedo decimales ,estos se reeplazan a los que antes habia escrito;
Lo que quiero es la celda no se seleccione al al llamar a mi metodo,que internamente siga el cursor en donde corresponde.
Aqui pongo mi metodo que transforma un string que tiene punto(.) por otro string que tenga coma(,):

Código Delphi [-]
function TPrincipal.ToComaReal(s: String): String;//dentra un string //numerico que tiene  punto 
var p:Smallint;
begin
         p:=Pos('.',s);
       if(p>0)then
        begin
           Delete(s,p,1);
           Insert(',',s,p);
        end;
      result:=s;
end;

Y aqui el evento OnSetEditText:
procedure TPrincipal.tablaSetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
Begin
 if (ACol=3)and (value<>'') then
  begin
       if(pos('.',value)>0)then
       begin
         tabla.Cells[ACol,ARow]:=ToComaReal(tabla.Cells[ACol,ARow]);
         //El problema segun yo es aqui despues de llamar al metodo
         // la celda me aparece seleccionada 
       end;
//de aqui en adelante hay mas codigo
//donde hace la suma  correspondiente todo esta bien de aqui en adelante
//....... 
  end;

end;
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 23-04-2010 a las 22:52:55.
Responder Con Cita
  #2  
Antiguo 25-08-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 24
Caro Va por buen camino
Hola rgstuamigo, y que pasa si te introducen letras a parte del punto ¿como estas validando lo que se va introduciendo?, porque creo que sería mucho mejor que fueras validando a medida que introduce en tu celda, permitiendole solo ingresar numeros y la coma.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #3  
Antiguo 25-08-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 20
rgstuamigo Va por buen camino
Bueno en realidad esta todo dentro de un
Código Delphi [-]
 try
//...todo...... 
 end;
 except
  on E:Exception do
  begin
   E.Message:='Error al sumar la columna, Nose ha podido completar la suma TOTAL'+#13
   +'Tenga en cuenta que los datos de esta columnas solo pueden ser "NUMERICOS"';
   Application.ShowException(E);
Todo me funciona bien, lo he probado poniendo normalmente , es decir con coma , pero ahora el cliente me dice que no le gusta con coma y que es mejor con punto, ya sabes tu por comodida.
Solo quiero saber si existe una manera de desselecionar esa celda sin cambiar su contenido, poner el cursor en la ultima posicion, para seguir editando.
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 10-02-2010 a las 14:42:47.
Responder Con Cita
  #4  
Antiguo 25-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola, puedes tal como dice caro, capturar en el OnKeyDown

Código Delphi [-]
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
        if Key = 188 then Key := Word('.');
end;

o bien, justo en el principio del onsetedittext

Código Delphi [-]
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
var 
s : string;
begin
           s := stringreplace(value,',','.',[rfReplaceAll,rfIgnorecase]);
           try
                calculos_varios(strtofloat(s));
           except
           end;

end;
Responder Con Cita
  #5  
Antiguo 25-08-2008
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
punto a coma

Prueba asignando esto al evento OnKeyPress del StringGrid, esto reemplaza el punto por la coma.


Código Delphi [-]
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = '.' then Key:= ',';
end;
Responder Con Cita
  #6  
Antiguo 25-08-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 20
rgstuamigo Va por buen camino
Thumbs up

Gracias A todos por compartir y responder, la verdad son diferentes formas de hacerlo y me han dado nuevas perspectivas de programcion, lo resolvi con el codigo de ecfisa pero tiene un pequeño detalle, que el evento se realiza para todas las columnas del stringGrid; como seria para hacerlo que solo cambie los puntos por las comas solo en una columna especifica.
Saludos....
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #7  
Antiguo 25-08-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 24
Caro Va por buen camino
Hola de nuevo, primero para mi sería mucho mejor que controlaras en el momento que escribe, en vez de mostrale un mensaje que ha escrito mal, para ello puedes hacerlo de esta forma.

Código Delphi [-]
     Coordenadas : TGridCoord;//variable global
.................
.................
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 //Obtenemos la columna y fila de la posición X y Y
 Coordenadas := StringGrid1.MouseCoord(X,Y);
end;

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
 //Si nuestra columna es la 3 entonces, solo le permitimos escribir numeros y la coma.
 if Coordenadas.X=3 then
  begin
   if not( key in ['0'..'9',',',#8]) then
    key := #0;
  end;
end;

Ahora para que el cursor se vaya al final de todo lo que se ha escrito en esa celda se puede usar SelStart y SelLength, según esta pagina http://www.swissdelphicenter.ch/torr...ode.php?id=349 , se puede usar la propiedad ImplaceEditor del StringGrid. Mas o menos quedaría asi el codigo:

Código Delphi [-]
  type
    //De esta forma podremos acceder a ImplaceEdit ya que esta protejido  
   TStringG = class(TStringGrid); 
  ..................
  .................

  StringGrid1.SetFocus;
  //Aprovechamos la columna y fila que tenemos en coordenadas
  StringGrid1.Col := Coordenadas.X; 
  StringGrid1.Row := Coordenadas.Y;
  //ponemos el cursor al final
  TStringG(StringGrid1).InPlaceEditor.SelStart :=  TStringG(StringGrid1).InPlaceEditor.SelLength;

Para reemplazar el punto por la coma, sería mejor que utilizaras la función StringReplace, como te dice el amigo Coso.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #8  
Antiguo 25-08-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 24
Caro Va por buen camino
Cita:
Empezado por rgstuamigo Ver Mensaje
Gracias A todos por compartir y responder, la verdad son diferentes formas de hacerlo y me han dado nuevas perspectivas de programcion, lo resolvi con el codigo de ecfisa pero tiene un pequeño detalle, que el evento se realiza para todas las columnas del stringGrid; como seria para hacerlo que solo cambie los puntos por las comas solo en una columna especifica.
Saludos....
Pense que si el usuario escríbe un punto, supongo que también lo quiera ver en el StringGrid como punto y tu para hacer tus calculos, haces todo lo demas, la parte de la conversión y todo eso. Para lo ultimo que preguntas revisa el codigo que te puse la parte de MouseCoord.

Otra cosita, por favor utiliza etiquetas delphi para encerrar tu codigo, así s eentedera y vera mucho mejor. [delphi ] [ /dephi] esatas etiquetas pero sin los espacios.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #9  
Antiguo 25-08-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 20
rgstuamigo Va por buen camino
Thumbs up

Muchas Gracias caro y todos...por sus respuesta pero si alguien puede aguegar mas al asunto no esta demas que comparta su experiencia programando. Saludos....
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #10  
Antiguo 25-08-2008
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
solo en columna

Es sólo una comprobación mas.



Código Delphi [-]
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
with StringGrid1 do
begin
if (Key = '.') and ( Col = 0 ) then Key:= ','; // Col = 0,1,2... etc
end;
end;
Responder Con Cita
  #11  
Antiguo 26-08-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 20
rgstuamigo Va por buen camino
Thumbs up

Gracias ecfisa por responder y agregar tu opcion....Saludos
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #12  
Antiguo 27-08-2008
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
de nada

Me alegra que te haya servido.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Trabajando con ListView Ledian_Fdez OOP 2 15-04-2010 23:22:22
trabajando con ListView !!! Ledian_Fdez C++ Builder 11 09-07-2008 22:43:01
trabajando en red jdg C++ Builder 2 18-02-2007 16:10:48
Trabajando con ListBox gsilvei Varios 1 11-07-2006 16:16:38
Trabajando con DLL b3nshi Varios 1 16-03-2005 18:21:55


La franja horaria es GMT +2. Ahora son las 00:34:07.


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
Copyright 1996-2007 Club Delphi