Club Delphi  
    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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-04-2016
genyus00 genyus00 is offline
Miembro
 
Registrado: jun 2010
Posts: 29
Poder: 0
genyus00 Va por buen camino
Posicionar en la primer fila de una stringgrid

Buenas, en principio buscaba como Insertar un Botón en una celda de una StringGrid,
y en un hilo de aca lo encontre, pero esa solución presenta un problema si por ejemplo
uso un filtro y de acuerdo al filtro muestro datos en la stringgrid. Digamos que cada
fila de la stringgrid tiene una celda con un el botón insertado el cual va a cumplir la función
de edición de los datos de la fila seleccionada



y que al darle clic despliegue una ficha con la información completa de la fila editada,



al cerrar el formulario (ficha) y retornar a la stringgrid,



digamos que decido filtrar los datos y visualizarlos. Lo cual me obliga a limpiar la stringgrid
los que se traduce en eliminar todas las filas y pintarlas de nuevo surge el error porque para
la demo que encontre aca intenta hacer un posicionar en la ultima fila seleccionada,



Si selecciono la primera fila y vuelvo y filtro no se presenta el error..






Entonces como puedo hacer para que al salir de mi ventana (ficha) se posicione automáticamente
a la fila = 1.

Nota: utilizar : Grilla.row := 1; no funciona.

Este es el codigo del boton editar..

Código Delphi [-]
procedure TFrmPrincipal.GDREditColBtnClick(Sender: TGRDControl;
  AGrid: TGRDGrid; ACol, ARow: Integer);
var
  Usuario: TUsuario;
  canselect :  boolean;
//  ExtError: string;
begin
 Usuario := gloLisUsuario.BuscaPorCodigo(AGrid.Cells[2,ARow]);
 if FrmFicha = nil then
    FrmFicha := TFrmFicha.Create(Application);

 try
    DM.ReloadcombosCombos('FrmFicha');
    FrmFicha.ResetEdit(Usuario);
    FrmFicha.ShowModal;
    GrdUsuarios.Row := 1;//no me posiciona en la Fila 1, se queda en la ultima seleccionada
    finally
          FreeAndNil(FrmFicha);
    end;
 end;

Gracias por cualquier orientación.
Archivos Adjuntos
Tipo de Archivo: rar SGrdBtn.rar (239,0 KB, 12 visitas)
Responder Con Cita
  #2  
Antiguo 10-04-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
En algun lado cambias el valor de la propiedad RowCount?
Responder Con Cita
  #3  
Antiguo 10-04-2016
genyus00 genyus00 is offline
Miembro
 
Registrado: jun 2010
Posts: 29
Poder: 0
genyus00 Va por buen camino
Hola. Este es el codigo de mi combo buscar donde elijo el criterio de filtro.
he colocando en negrilla los llamados a las funciones principales, hasta llegar
a la función que limpia la stringgrid.

Código Delphi [-]
procedure TFrmPrincipal.cmbBuscarChange(Sender: TObject);
begin
 edtBuscar.Text:='';
 FiltrarUsuarios;
 end;

Código Delphi [-]
procedure TFrmPrincipal.FiltrarUsuarios();
var
   LstUsuarios:TStringList;
   PDepartamento, PCiudad, PSexo, PTipoDoc,POpcupacion: String;
begin
 PDepartamento:='';
 PCiudad:='';
 PSexo:='';
 PTipoDoc:='';
 POpcupacion:='';

 if cmbCiudades.ItemIndex<>-1 then//pot ciudad
    PCiudad := inttostr(TCiudad(cmbCiudades.Items.Objects[cmbCiudades.ItemIndex]).CiudadId);

 if cmbDepartamentos.ItemIndex<>-1 then//por departamento
    PDepartamento := inttostr(TDepartamento(cmbDepartamentos.Items.Objects[cmbDepartamentos.ItemIndex]).DepartamentoId);

 if cmbTipodeDocumento.ItemIndex<>-1 then//por tipodoc
    PTipoDoc := TTipoidentificacion(cmbTipodeDocumento.Items.Objects[cmbTipodeDocumento.ItemIndex]).TipoIdentificacionId;

 if cmbSexo.ItemIndex<>-1 then//por sexo
    PSexo := TSexo(cmbSexo.Items.Objects[cmbSexo.ItemIndex]).SexoId;

 if cmbOcupaciones.ItemIndex<>-1 then//por ocupacion
    POpcupacion := TOcupacion(cmbOcupaciones.Items.Objects[cmbOcupaciones.ItemIndex]).OcupacionId;

 if(PCiudad<>'')or(PDepartamento<>'')or(PTipoDoc<>'')or(PSexo<>'')or(POpcupacion<>'') then
    LstUsuarios := gloLisUsuario.Filtrar(PDepartamento, PCiudad, PSexo, PTipoDoc,POpcupacion)
  else
     LstUsuarios := gloLisUsuario.RetornaListaUsuarios;

 PresentaUsuarios(GrdUsuarios, LstUsuarios,uppercase(edtBuscar.Text), cmbBuscar.ItemIndex);
 end;

Código Delphi [-]
procedure PresentaUsuarios(var PGrdGrilla___ : TStringGrid; Usuarios:TStringList;strCadena1:string;Por:Integer);
var
   strCadena2: string;
   Usuario: TUsuario;
   Vr,Cont:Integer;
begin
 ConfigurarGrillaUsuarios(PGrdGrilla___);

 strCadena2:='';
 Cont:= 0;
 Vr:=0;

 while cont < Usuarios.Count do
       begin
        Usuario := TUsuario(Usuarios.Objects[Cont]);
        case por of
         1:strCadena2:=Uppercase(Usuario.strNombre);
         2:strCadena2:=Uppercase(Usuario.PrimerNombre+' '+Usuario.SegundoNombre+' '+Usuario.PrimerApellido+' '+Usuario.SegundoApellido);
         else
            strCadena2:='';
         end;

        if((Pos(strCadena1,strCadena2)<>0)and(trim(StrCadena1)<>''))or(strCadena2='') then
           begin
            AddUsuario(PGrdGrilla___,Vr,Usuario);
            Inc(Vr);
            PGrdGrilla___.RowCount := Vr+1;
            end;

        Cont := Cont+1;
        end;

 end;

Código Delphi [-]
procedure ConfigurarGrillaUsuarios(var PGrdGrilla___ : TStringGrid);
begin
 LimpiarGrilla(PGrdGrilla___);
 PGrdGrilla___.ColWidths[0]  := 50;  PGrdGrilla___.Cells[0, 0]  := 'Id.';
 PGrdGrilla___.ColWidths[1]  := 50; PGrdGrilla___.Cells[1, 0]  := 'Tipo ID';//'Tipo Cliente';
 PGrdGrilla___.ColWidths[2]  := 115; PGrdGrilla___.Cells[2, 0]  := 'Número ID';//'Nombre Programa';
 PGrdGrilla___.ColWidths[3]  := 170; PGrdGrilla___.Cells[3, 0]  := 'Apellidos';//'Razón Social';
 PGrdGrilla___.ColWidths[4]  := 170; PGrdGrilla___.Cells[4, 0]  := 'Nombres';//'Representante Legal';
 PGrdGrilla___.ColWidths[5]  := 170; PGrdGrilla___.Cells[5, 0]  := 'Teléfono(s)';//'Dirección';
 PGrdGrilla___.ColWidths[6]  := 220; PGrdGrilla___.Cells[6, 0]  := 'E-Mail';//'Teléfono(s)';
 PGrdGrilla___.ColWidths[7]  := 50; PGrdGrilla___.Cells[7, 0]  := 'Sexo';//'Correo Electrónico';
 PGrdGrilla___.ColCount := 10;
 PGrdGrilla___.RowCount := 2;
 end;

Código Delphi [-]
procedure LimpiarGrilla(var PGrdGrilla___ : TStringGrid);
var  i, j : Integer;
begin
  with PGrdGrilla___ do
        for i:=0 to PGrdGrilla___.RowCount - 1 do
            for j:=0 to PGrdGrilla___.ColCount - 1 do
                PGrdGrilla___.Cells[j, i] := '';

 PGrdGrilla___.FixedCols := 0;
 end;
Responder Con Cita
  #4  
Antiguo 10-04-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Yo no tocaría el RowCount, lo dejaría siempre en la cantidad de registros. Porque lo pones a 2? En qué momento se incrementa ese valor? Tu código problemático es el que modifica esa propiedad
Responder Con Cita
  #5  
Antiguo 10-04-2016
genyus00 genyus00 is offline
Miembro
 
Registrado: jun 2010
Posts: 29
Poder: 0
genyus00 Va por buen camino
Hola, si coloco el rowcount al numero total de registros que me devuelve la consulta, pasa lo mismo,
dado que si en la consulta anterior por decir algo: tenia visualizadas 20 filas y la ultima seleccionada
fuera la 15 y filtro de nuevo por algún criterio que me regrese por decir 10 filas, al no poder posicionar
a la fila 1, el mismo código implementado intenta hacer un posicionar a la ultima fila seleccionada, osea
la numero 15, la cual ya no existe.

el rowcount lo puedes ver en la función "PresentaUsuarios" despues del llamado a la funcion addusuario().
La inicio en 2, dado que la primer fila son los títulos y la segunda es donde muestro los datos del primer
adicionado, luego se incrementa el rowcount por si hay otro que mostrar. Gracias
Responder Con Cita
  #6  
Antiguo 11-04-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
No logro reproducirlo. Podrías crear un pequeño programa que reproduzca el problema y subir el código?
Responder Con Cita
  #7  
Antiguo 11-04-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Evalua la propiedad RowCount antes de intentar moverte a la primera (imprimela en pantalla)

Yo uso este codigo y si puedo moverme a la primer fila:

Código Delphi [-]
  TForm4 = class(TForm)
    StringGrid1: TStringGrid;
    Panel1: TPanel;
    btnCargarGrid: TButton;
    btnFiltrarGrid: TButton;
    procedure btnCargarGridClick(Sender: TObject);
    procedure btnFiltrarGridClick(Sender: TObject);
  private
    procedure CargarGrid(Items: TStrings);
    procedure LimpiarGrid;
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.btnCargarGridClick(Sender: TObject);
var
  Items: TStrings;
begin
  LimpiarGrid;
  Items := TStringList.Create;
  try
    Items.CommaText := 'Juan, Pedro, Marcos, Agustin, Daniel, German, Federico';
    CargarGrid(Items);
  finally
    Items.Free;
  end;
end;

procedure TForm4.btnFiltrarGridClick(Sender: TObject);
var
  Items: TStrings;
begin
  LimpiarGrid;
  Items := TStringList.Create;
  try
    // supongamos que se aplica la funcion "X" y devuelve estos nombres
    Items.CommaText := 'Juan, Pedro, Federico';
    CargarGrid(Items);

    // me paro en la primer fila, sin ningun problema
    StringGrid1.Row := 1;
  finally
    Items.Free;
  end;
end;

procedure TForm4.CargarGrid(Items: TStrings);
var
  I: Integer;
begin
  StringGrid1.RowCount := Items.Count + 1;
  for I := 0 to Items.Count - 1 do
  begin
    StringGrid1.Cells[0, I+1] := Items[i];
    StringGrid1.Cells[1, I+1] := Items[i];
    StringGrid1.Cells[2, I+1] := Items[i];
    StringGrid1.Cells[3, I+1] := Items[i];
  end;
end;

procedure TForm4.LimpiarGrid;
var
  I, J: Integer;
begin
  for I := 0 to StringGrid1.RowCount - 1 do
    for J := 0 to StringGrid1.ColCount - 1 do
      StringGrid1.Cells[I, J] := EmptyStr;
end;
Responder Con Cita
  #8  
Antiguo 11-04-2016
genyus00 genyus00 is offline
Miembro
 
Registrado: jun 2010
Posts: 29
Poder: 0
genyus00 Va por buen camino
Hola gracias por tu tiempo y ayuda en este tema. he probado el código y si que funciona, pero para
una stringgrid normal, la cuestion es con una en la que las celdas de una de sus columnas tenga
insertado un botón editar, como la del ejemplo del .zip. y como la que describo en el problema.
Gracias.
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
Eliminar fila de un StringGrid santiago14 Varios 6 28-06-2014 19:04:02
StringGrid doble fila mjjj Varios 3 11-07-2008 17:19:08
selecionar fila en StringGrid cojones OOP 4 05-02-2007 17:11:08
Resaltar Fila StringGrid Caro OOP 8 29-06-2006 15:50:57
Posicionar fila en un DBGRID-delphi Vivi Conexión con bases de datos 4 29-07-2005 21:49:23


La franja horaria es GMT +2. Ahora son las 03:45:53.


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