Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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
[Truco] TDBGrid(Columna, Fila)

Hola.

He visto que varios han preguntado por la posibilidad de posicionarse en determinadas columnas y filas de un TDBGrid e hice un código
con algunos trucos 'sucios' para lograrlo.

No lo ví en la sección trucos así que decidí ponerlo aquí por si le sirve a alguien:
Código Delphi [-]
type
  TDBGridExt = Class(TDBGrid);
  TForm1 = class(TForm)
    ...
    DBGrid1: TDBGrid;
    ...
  private
    function DBgridColFil(ACol,AFil: integer; GE: TDBGridExt): string;
  public
  end;
...
implementation
...
function TForm1.DBgridColFil(ACol, AFil: integer; GE: TDBGridExt): string;
begin
  Result:= '';
  GE.DataSource.DataSet.MoveBy(1 - GE.Row); //  DataSet en fila 1 del DBGrid
  // Verifocar validez de ACol y AFil
  if (AFil > 0)and(ACol > 0)and(AFil < GE.RowCount)and(ACol < GE.ColCount) then
  begin
    GE.DataSource.DataSet.MoveBy(Afil-1); // Posicionarse en  AFil
    GE.Refresh;
    GE.FocusCell(ACol,AFil,True);         // Foco en la celda
    GE.SetFocus;
    Result:= GE.SelectedField.AsString;
  end
  else
    raise Exception.Create('Selección fuera de rango');
end;

Ejeplo de uso:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption:= DBGridColFil(2, 3, TDBGridExt(DBGrid1));
end;

Si Algún moderador cree que vale la pena, subo el código con un ejemplo funcional donde me indiquen.

Un saludo.
Responder Con Cita
  #2  
Antiguo 26-11-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ecfisa Ver Mensaje
Si Algún moderador cree que vale la pena, subo el código con un ejemplo funcional donde me indiquen.
Un saludo.
Vale la pena, pero creo que la sección de "trucos" está en sólo lectura mientras resolvemos unos problemillas en ella.
Responder Con Cita
  #3  
Antiguo 26-11-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Muy buen truco amigo ecfisa.
Yo tambien quiero agregar mi propia version del truco:
Para Posicionarme en una determinada fila y columna se puede hacerlo así:
Código Delphi [-]
TStringGrid(DBGrid1).Col:=2;
TStringGrid(DBGrid1).Row:=5;
DBGrid1.SetFocus;
Pero mejor hacer un método que me haga todo, idéntico al tuyo:
Código Delphi [-]
function TForm1.DBgridColFil(ACol, AFil: integer; Rejilla: TDBGrid): string;
begin
Result:='';
 if (ACol < 1)  or (ACol > TStringGrid(Rejilla).ColCount) or (AFil<1) or (AFil > TStringGrid(Rejilla).RowCount) then
    raise Exception.Create('Selección fuera de rango');
TStringGrid(Rejilla).Row:=AFil;
TStringGrid(Rejilla).Col:=ACol;
Rejilla.SetFocus;
Result:=Rejilla.SelectedField.AsString;//<---Linea agregada que me olvidé 
end;
Elemplo de uso:
Código Delphi [-]
 DBgridColFil(2,5,DBGrid1);
En otras palabras se puede hacer un casting a nuestro DBGrid convirtiendolo en un StringGrid normal y trabajarlo como tal.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 26-11-2010 a las 23:33:08.
Responder Con Cita
  #4  
Antiguo 26-11-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por rgstuamigo Ver Mensaje
[..] En otras palabras se puede hacer un casting a nuestro DBGrid convirtiendolo en un StringGrid normal y trabajarlo como tal.
¿No puede ser "peligroso" hacer eso?, uno es de BD y el otro no, no sé, no me inspira mucha confianza, pero si lo has probado y va bien, pues estupendo.
Responder Con Cita
  #5  
Antiguo 26-11-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿No puede ser "peligroso" hacer eso?
Bueno..., hay que tener el cuidado respectivo y probar hasta dónde puedes llegar, en éste caso tanto el StringGrid como el DBGrid tienen como ancestro(Padre) comun mas cercano a la clase TCustomGrid y por eso es permitido hacer dicho casting y accesar a tales propiedades.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 26-11-2010 a las 23:15:46.
Responder Con Cita
  #6  
Antiguo 26-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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
Hola rgstuamigo.

Está muy bien pensado, posiciona perfectamente.

Yo lo busque por el lado del TCustomDBGrid por que me permite posicionar y tambien obtener el campo de dicha posición.
Por ejemplo:
Código Delphi [-]
function TForm1.DBGridColFil(ACol, AFil: integer; GE: TDBGridExt): TField;
begin
  Result:= nil;
  GE.DataSource.DataSet.MoveBy(1 - GE.Row);
  if (AFil > 0)and(ACol > 0)and(AFil < GE.RowCount)and(ACol < GE.ColCount) then
  begin
    GE.DataSource.DataSet.MoveBy(Afil-1);
    GE.Refresh;
    GE.FocusCell(ACol,AFil,True);
    GE.SetFocus;
    Result:= GE.SelectedField;
  end
  else
    raise Exception.Create('Selección fuera de rango');
end;

...
begin
   Caption:= DBGridColFil(4, 3,TDBGridExt(DBGrid1)).AsString;
  ...

No sé si se puede obtener el campo trabajándolo como TStringGrid... , pero será cosa de buscarle la vuelta...

Saludos.
Responder Con Cita
  #7  
Antiguo 26-11-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Sí, bueno, por supuesto que se puede hacer, pero siempre me ha producido cierto "reparo" hacer estas cosas, aunque también las hago cuando hace falta, claro.


Edito: era respondiendo a rgstuamigo

Última edición por Casimiro Notevi fecha: 26-11-2010 a las 23:32:19.
Responder Con Cita
  #8  
Antiguo 26-11-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Cita:
Empezado por ecfisa Ver Mensaje
...No sé si se puede obtener el campo trabajándolo como TStringGrid... , pero será cosa de buscarle la vuelta...
...
A Caray se me olvidó esa linea de agregarle a la funcion que hize, pero ya lo he agregado.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #9  
Antiguo 26-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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
Cita:
Empezado por rgstuamigo Ver Mensaje
A Caray se me olvidó esa linea de agregarle a la funcion que hize, pero ya lo he agregado.
Saludos...
Acabo de probarlo y funciona correctamente.
Mejor entonces, ahora tienen dos trucos para elegir.
Y como en esto siempre hay más de una forma correcta de hacer algo, en cualquier momento se suma un tercero o cuarto...


Un saludo.

Última edición por ecfisa fecha: 26-11-2010 a las 23:48:45.
Responder Con Cita
  #10  
Antiguo 27-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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
Hola rgstuamigo.

Cuando quise cambiar el resultado de la función a TField para que me devuelva el campo no lo realiza. Es decir devuelve el valor del campo correctamente como string, pero no el campo en sí:

Código Delphi [-]
function TForm1.DBgridColFil(ACol, AFil: integer; Rejilla: TDBGrid): TField;
begin
  Result:= nil;
  if (ACol < 1)or(ACol > TStringGrid(Rejilla).ColCount)or(AFil<1)or(AFil > TStringGrid(Rejilla).RowCount) then
    raise Exception.Create('Selección fuera de rango');
  TStringGrid(Rejilla).Row:=AFil;
  TStringGrid(Rejilla).Col:=ACol;
  Rejilla.SetFocus;
  Result:= Rejilla.SelectedField;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption:= DBGridColFil(SpinEdit1.Value,SpinEdit2.Value, DBGrid1).AsString;
end;

Me toma los cambios de columna pero no el de las filas, probalo a ver si estoy haciendo algo equivocado...

Un saludo.
Responder Con Cita
  #11  
Antiguo 27-11-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Thumbs up

Cita:
Empezado por ecfisa Ver Mensaje
Hola rgstuamigo.

Cuando quise cambiar el resultado de la función a TField para que me devuelva el campo no lo realiza. Es decir devuelve el valor del campo correctamente, pero no el campo:
...
...
Me toma los cambios de columna pero no el de las filas...
Tenés toda la razón, y eso ocurre por que al Dataset no lo hemos movido para nada, en todo caso habrá que moverlo con el método MoveBy para que tambien el dataset se posicione en el campo expecífico.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #12  
Antiguo 01-12-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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
Cita:
Empezado por rgstuamigo Ver Mensaje
Tenés toda la razón, y eso ocurre por que al Dataset no lo hemos movido para nada, en todo caso habrá que moverlo con el método MoveBy para que tambien el dataset se posicione en el campo expecífico.
Saludos...
Exacto, así como está, sólo posiciona bien en pantalla, pero al no desplazar el DataSet, la línea:
Código Delphi [-]
  Result:= Rejilla.SelectedField.AsString;
puede devolver cualquier valor dependiendo del registro donde este posicionado en ese momento.

Un saludo.
Responder Con Cita
Respuesta



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
Fila del TDBGrid Val Conexión con bases de datos 3 20-06-2007 13:45:03
Dibujar encabezado Columna TDBGrid eureka OOP 3 21-11-2005 03:02:44
Nro de fila en TDBGrid lucasarts_18 Varios 16 11-06-2005 16:26:17
Como Ordenar Un Tdbgrid Con Clic En Columna cmena Varios 4 03-05-2004 16:52:34
Como Fijar Una Columna De Un Tdbgrid cmena Varios 0 22-04-2004 18:41:37


La franja horaria es GMT +2. Ahora son las 21:25:20.


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