Ir para conteúdo
Fórum Script Brasil
  • 0

Posição de um campo no dbGrid


nilegor

Pergunta

Olá, gostaria de saber como pegar a posição da coluna e da linha de um dbGrid e então gravar esse valor em uma variável, que provavelmente vai ser do tipo integer. Pois ao abrir o form, a dbGrid vai receber a posição que esta nas variáveis,retornando ao campo que estava antes. Alguém poderia me ajudar como poderia fazer isso ?

Link para o comentário
Compartilhar em outros sites

17 respostass a esta questão

Posts Recomendados

  • 0

gostaria de saber como pegar a posição da coluna e da linha de um dbGrid

procedure TForm1.DBGrid1CellClick(Column: TColumn);
   var Linha, Coluna : Integer;
begin
   Linha:= TStringGrid(DBGrid1).Row;
   Coluna := DBGrid1.SelectedIndex;

   Edit1.Text := IntToStr( Linha );
   Edit2.Text := IntToStr( Coluna );
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Seguinte, ao clicar no dbGrid vai salvar nas variáveis linha e coluna a posição do campo em que foi clicado, exatamente como esta abaixo:
procedure TfEstoque.DBGrid1CellClick(Column: TColumn);
var Linha, Coluna : Integer;
begin
Linha:= TStringGrid(DBGrid1).Row;
Coluna := DBGrid1.SelectedIndex;
Edit1.Text := IntToStr( Linha );
Edit2.Text := IntToStr( Coluna );
end;
até ai tudo ok, digamos que a variável linha receba a posição 2 e a coluna 4; A questão é, como faço para que ao abrir esse form onde tem a dbGrid, a posição da linha receba a posição 2 e a da coluna 4, para que fique selecionado o ultimo campo que estava selecionado antes de fechar o form.
Link para o comentário
Compartilhar em outros sites

  • 0

ok... voce tem que guardar em um arquivo ( ini ) a posição de linha e coluna que voce clicou no dbgrid

ao abrir o programa novamente, voce deve ler o arquivo ini e extrair a informação guardada

depois, basta referenciar novamente essa posição para o dbgrid e jogar o foco sobre ele para que mostre essa posição ( Linha e Coluna )

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, Grids, DBGrids, StdCtrls;

type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Query1: TQuery;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure DBGrid1CellClick(Column: TColumn);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Linha, Coluna : Integer;
implementation

{$R *.dfm}

uses IniFiles;

procedure GravaIni(aTexto: string);
var
  ArqIni: TIniFile;
begin
  // SALVAR O VALOR DE LINHA E COLUNA NO ARQUIVO INI
  ArqIni := TIniFile.Create('c:\Arquivo.ini');
  try
    ArqIni.WriteString('Linha', 'Coluna', aTexto);
  finally
    ArqIni.Free;
  end;
end;

procedure LeIni(var aTexto: string);
var
  ArqIni: TIniFile;
begin
  // LER OS VALORES DE LINHA E COLUNA DO ARQUIVO INI
  ArqIni := TIniFile.Create('c:\Arquivo.ini');
  try
    aTexto := ArqIni.ReadString('Linha', 'Coluna', aTexto);
  finally
    ArqIni.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GravaIni(inttostr(Linha) +','+ inttostr(Coluna));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  aTexto: string;
begin
   // LER A POSIÇÃO DE LINHA E COLUNA DO ARQ INI
   // COLOCAR O CURSOR NA ULTIMA POSIÇÃO SALVA
   LeIni(aTexto);
   ShowMessage(aTexto);
   TStringGrid(DBGrid1).Row := strtoint(copy(aTexto,1,1));
   DBGrid1.SelectedIndex := strtoint(copy(aTexto,3,1));
   DBGrid1.SetFocus;

   Edit1.Text := IntToStr( TStringGrid(DBGrid1).Row );
   Edit2.Text := IntToStr( DBGrid1.SelectedIndex );
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
   // PEGAR NOVA POSIÇÃO DE LINHA E COLUNA NO DBGRID
   Linha:= TStringGrid(DBGrid1).Row;
   Coluna := DBGrid1.SelectedIndex;
   Edit1.Text := IntToStr( Linha );
   Edit2.Text := IntToStr( Coluna );
end;

end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

jhonas, era exatamente isso que eu iria fazer, ler de um arquivo ini. Bom, esta quase 100%. Da forma que me passou, funciona perfeitamente para ler o arquivo.ini, porem não posso usar dessa forma, então coloquei no evento OnShow do form a leitura do arquivo:

var
aTexto: string;
begin
LeIni(aTexto);
TStringGrid(DBGrid1).Row := strtoint(copy(aTexto,1,1));
DBGrid1.SelectedIndex := strtoint(copy(aTexto,3,1));
DBGrid1.SetFocus;
end;
A posição é lida perfeitamente, porem, parece que 'buga' o dbGrid, pois se eu tentar clicar "selecionar" qualquer outra linha, não deixa, parece que trava na ultima linha onde esta selecionado pela ultima vez. O que eu percebi é que o indicador do dbGrid ">" fica sempre na primeira linha, independente se o campo que esta selecionado esta em outro linha, acho que é por isso que esta dando esse problema. O indicador teria que acompanhar a campo selecionado, sera que é por isso que esta dando esse pequeno problema ?
Link para o comentário
Compartilhar em outros sites

  • 0

O indicador teria que acompanhar a campo selecionado...

O DBgrid reflete a posição do registro em que está o cursor ....

quando voce define uma nova posição de celula no DBGrid

voce deve definir tambem a posição do registro ( Tabela ) nessa celula

procedure TForm1.Button2Click(Sender: TObject);
var
  aTexto: string;
begin
   // LER A POSIÇÃO DE LINHA E COLUNA DO ARQ INI
   // COLOCAR O CURSOR NA ULTIMA POSIÇÃO SALVA
   LeIni(aTexto);
   ShowMessage(aTexto);

   TStringGrid(DBGrid1).Row := strtoint(copy(aTexto,1,1));
   DBGrid1.SelectedIndex := strtoint(copy(aTexto,3,1));

   DBGrid1.SetFocus;
   // INDICAR A POSIÇÃO DO REGISTRO DA TABELA NO DBGRID
   query1.RecNo := TStringGrid(DBGrid1).Row;

   Edit1.Text := IntToStr( TStringGrid(DBGrid1).Row );
   Edit2.Text := IntToStr( DBGrid1.SelectedIndex );
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

com o SQLQuery1 tambem funciona .. lembrando que o SQLQuery1 deve estar ativo

procedure TForm1.Button2Click(Sender: TObject);
var
  aTexto: string;
begin
   // LER A POSIÇÃO DE LINHA E COLUNA DO ARQ INI
   // COLOCAR O CURSOR NA ULTIMA POSIÇÃO SALVA
   LeIni(aTexto);
   ShowMessage(aTexto);

   TStringGrid(DBGrid1).Row := strtoint(copy(aTexto,1,1));
   DBGrid1.SelectedIndex := strtoint(copy(aTexto,3,1));

   DBGrid1.SetFocus;
   
   // INDICAR A POSIÇÃO DO REGISTRO DA TABELA NO DBGRID
   SQLQuery1.RecNo := TStringGrid(DBGrid1).Row;

   Edit1.Text := IntToStr( TStringGrid(DBGrid1).Row );
   Edit2.Text := IntToStr( DBGrid1.SelectedIndex );
end;

ou tente

ClientDataSet1.RecNo := TStringGrid(DBGrid1).Row;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, 99%. Seguinte, usando <ClientDataSet1.RecNo := TStringGrid(DBGrid1).Row;> pegou a posição da forma correta, porem esta acontecendo algo estranho, pois qualquer registro que seleciono e leio, funciona somente se a posição estiver até a 10ª coluna do dbGrid apenas, depois da 10ª a leitura da posição não funciana, se eu salvar a posição da coluna 12 por exemplo e linha 3, ao ler a posição volta para a primeira coluna ou para a segunda as vezes, mas a linha selecionada ainda continua a 3, achei estranho pois até a 10ª coluna esta funcionando perfeitamente.

Link para o comentário
Compartilhar em outros sites

  • 0

funciona somente se a posição estiver até a 10ª coluna do dbGrid apenas, depois da 10ª a leitura da posição não funciana.

Se voce observar o numero de linhas que são mostradas no dbgrid, deve ser 10 linhas, a partir dai começa a rolagem dos registros ... certo ?

por mais registros que voce faça rolar no dbgrid, o numero de linhas mostradas no dbgrid será sempre o mesmo

então quando o decimo primeiro registro aparece no dbgrid, ele não sera o decimo primeiro no dbgrid, e sim, o decimo

e quando o decimo segundo registro aparece no dbgrid, ele não sera o decimo segundo no dbgrid, e sim, o decimo

e quando o decimo terceiro registro aparece no dbgrid, ele não sera o decimo terceiro no dbgrid, e sim, o decimo... etc

OBS: voce deve se basear no numero do registro da tabela .... se o numero do registro for maior que o numero de linhas no dbgrid, então voce deve posicionar o registro no centro do dbgrid para depois então mostrar a referencia ( > ) do registro na posição em que foi salvo os parametros de Linha e Coluna

exemplo: se voce salvou a posição do registro no dbgrid como 15,2 ou seja linha 15 e coluna 2 ( nesse caso voce fez rolar o dbgrid )

na verdade o valor da linha e coluna na celula do dbrig não será essa ( pois o escopo ( visual ) do dbgrid será de apenas 10 linhas )

então nesse caso voce deve pesquisar o valor da posição do registro na tabela e determinar qual posiçao da linha do dbgrid voce quer que esse registro seja exibido.

parece complicado, mas até que é bem smples de resolver ... quer tentar fazer isso sozinho ?

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

veja as modificações

var
  Form1: TForm1;
  Linha, Coluna : Integer;
implementation

{$R *.dfm}

uses IniFiles;

procedure GravaIni(aTexto: string);
var
  ArqIni: TIniFile;
begin
  // SALVAR O VALOR DE LINHA E COLUNA NO ARQUIVO INI
  ArqIni := TIniFile.Create('c:\Arquivo.ini');
  try
    ArqIni.WriteString('Linha', 'Coluna', aTexto);
  finally
    ArqIni.Free;
  end;
end;

procedure LeIni(var aTexto: string);
var
  ArqIni: TIniFile;
begin
  // LER OS VALORES DE LINHA E COLUNA DO ARQUIVO INI
  ArqIni := TIniFile.Create('c:\Arquivo.ini');
  try
    aTexto := ArqIni.ReadString('Linha', 'Coluna', aTexto);
  finally
    ArqIni.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GravaIni(inttostr(Linha) +','+ inttostr(Coluna));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  aTexto: string;
begin
   // LER A POSIÇÃO DE LINHA E COLUNA DO ARQ INI
   // COLOCAR O CURSOR NA ULTIMA POSIÇÃO SALVA
   LeIni(aTexto);
   ShowMessage(aTexto);

   ClientDataSet1.RecNo := strtoint(copy(aTexto,1,(pos(',',aTexto)-1)));

   if ClientDataSet1.RecNo > 12 then // numero de linhas no dbgrid
      TStringGrid(DBGrid1).Row := 6
   else
      TStringGrid(DBGrid1).Row := ClientDataSet1.RecNo;

   DBGrid1.SelectedIndex := strtoint(trim(copy(aTexto,pos(',',aTexto)+1,2)));
   DBGrid1.SetFocus;

   Edit1.Text := IntToStr( TStringGrid(DBGrid1).Row );
   Edit2.Text := IntToStr( DBGrid1.SelectedIndex );
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
   // PEGAR NOVA POSIÇÃO DE LINHA E COLUNA NO DBGRID
   Linha:= ClientDataSet1.RecNo; // numero da linha do registro
   Coluna := DBGrid1.SelectedIndex;
   Edit1.Text := IntToStr( Linha );
   Edit2.Text := IntToStr( Coluna );
end;

end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, perfeito. Esta funcionando perfeitamente, obrigado., só vou pedir mais uma coisa referente a isso, poderia apenas me explicar exatamente o que acontece nesse código : strtoint(trim(copy(aTexto,pos(',',aTexto)+1,2))). Obrigado pela ajuda, abraço.

Link para o comentário
Compartilhar em outros sites

  • 0

exemplo: se voce salvou a posição do registro no dbgrid como 15,2 ou seja linha 15 e coluna 2

então ao ler o valor do arquivo ini, voce teria

aTexto := ArqIni.ReadString('Linha', 'Coluna', aTexto);

aTexto := 15,2

usando o comando (copy(aTexto,pos(',',aTexto)+1,2))

DBGrid1.SelectedIndex := strtoint(trim(copy(aTexto,pos(',',aTexto)+1,2)));

voce vai copiar a string aTexto a partir da virgula ( , ) + 1 posição, 2 caracteres

aTexto := 15,2 ..... seria isso >>>> 2 ou seja a posição da coluna que foi salva no arquivo ini

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...