Jump to content
Fórum Script Brasil
  • 0

Posição de um campo no dbGrid


nilegor
 Share

Question

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 to comment
Share on other sites

17 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...