Array
(
)

DBGrid - Pegar texto de uma célula

Wbb
   - 06 ago 2004

Olá!

Gostaria de saber como pegar o texto de uma célula qualquer de um DBGrid. Eu sei que clicando com o mouse sobre a célula é fácil, conforme abaixo:

#Código

procedure Tform1.DBGrid1CellClick(Column: TColumn);
begin
label1.Caption := Column.Field.Value;
end;


Porém, eu preciso saber como pegar o texto de uma célula, apenas me movimentando pelas células do DBGrid por meio das setas do teclado. Ou seja, como obter o resultado do código acima, sem clicar na célula com o mouse e apenas usando as setas do teclado.

Valeu!
wbb


G1b4
   - 06 ago 2004

Caro wbb,
Ao invés de colocar um TLabel coloque um TDBText ligado ao mesmo TDataSource do TDBGrid....


Espero te-lo ajudado :wink: !!!


Wbb
   - 06 ago 2004

Caro g1b4!

Isto é só um exemplo... Não é a maneira que estou usando realmente.


G1b4
   - 06 ago 2004

Caro wbb,
Foi malz... a pressa não me deixou ver a situação...

Meu exemplo é pra apenas uma coluna...


Citação:

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
Label1.Caption:=Column.Field.Value;
end;


Faça assim... Utilizando o seu exemplo acima:

#Código


procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
DBGrid1.OnCellClick:=DBGrid1.OnCellClick;
end;


Assim você executa o seu OnCellClick navegando sem o mouse....

Espero AGORA te-lo ajudado !!!


G1b4
   - 06 ago 2004

esquece viajei.... :oops:


G1b4
   - 06 ago 2004

Coloque no form keypreview=true. Agora funciona :D ! O último que fiz, postei mas não testei. Fui testar depois. Mas esse eu testei....

#Código

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
Label1.Caption:=Column.Field.AsString;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
indice :integer;
begin
if (Sender as TForm).ActiveControl is TDBGrid then
if key in [vk_DOWN,vk_Up,vk_LEFT,vk_RIGHT] then begin
indice:=DBGrid1.Columns.Grid.SelectedIndex;
DBGrid1CellClick(DBGrid1.Columns.Items[indice]);
end;
end;


:wink:


Wbb
   - 09 ago 2004

Legal g1b4! Valeu!

Agora sem querer abusar, estou com um outro problema... Num campo numérico do banco de dados, que é mostrado no DBGrid, eu acessei o TFiled correspondente no Dataset e já coloquei as propriedades DisplayFormat e FormatEdit em #,0.00, além de colocar em True a propriedade Currency do mesmo TField, tudo isso com o objetivo de que o número seja mostrado como valor monetário. Até aí ok! Só que quando vou digitar um número neste campo do DBGrid e tento colocar mais de uma vírgula no número, ele aceita. Aí, ao tentar salvar este número com formato inválido, o Dataset gera um erro. Afinal um número com mais de uma vírgula é inválido.

Tem como impedir que o usuário consiga digitar mais de uma vírgula? Ou então se digitar, tem como reformatar o número antes de ser gerado o erro?

Valeu!
wbb


G1b4
   - 09 ago 2004


Citação:
Tem como impedir que o usuário consiga digitar mais de uma vírgula? Ou então se digitar, tem como reformatar o número antes de ser gerado o erro?


A primeira pergunta: você pode colocar uma variavel global do tipo inteira na sua Unit e no evento OnKeyPress fazer um contador, depois se o contador for=1, não permitirá mais a virgula.

Segunda Pergunta: Claro que sim, mas como saber onde formato o valor? Não tem como você saber qual é o valor pretendido. Neste caso, acho melhor gerar a mensagem do erro e limpar o campo...

Espero te-lo ajudado :wink: !!!


Wbb
   - 09 ago 2004

Quanto à variável global eu já tentei exatamente como você falou, e funciona. Só que tem um problema: Se o campo já estiver preenchido, eu identifico se já tem ou não vírgula ao entrar no campo. Até aí ok. Só que após entrar no campo, eu não tenho como saber o que foi digitado antes que seu conteúdo seja salvo no BD. É aí que o erro ocorre e é pelo mesmo motivo que eu não tenho como gerar uma mensagem ao usuário.

...!?! É complicado...

Obrigado pela atenção mesmo assim. Se descobrir algo e puder me enviar, seria extremamente útil.

Valeu!
wbb


G1b4
   - 09 ago 2004

Se o campo já tem valor e for identificado vírgula, você atribui à sua variável global o valor 1. Assim não poderá digitar mais a virgula. Só que tem uma coisa, caso o usuário apague a vírgula o campo não deixará colocar nova virgula. Então, no evento OnKeyPress você terá que sempre fazer a verificação´, se tiver virgula contador = 1 (não permite uso de virgula), caso não contador = 0(permite uso de virgula).
:wink: