Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

janazi

dbgrid

Recommended Posts

Pessoal, estou tendo o seguinte problema, eu tenho 2 dbgrids, um com uma listagem de produtos, que quando clicados 2x inserem dados em uma tabela e esses dados preenchem meu segundo dbgrid, até ai tudo bem, só que eu preciso preencher depois alguns campos manualmente, mas como o segundo dbgrid pegou alguns campos "vazios" da tabela, ele limita sozinho o tamanho do campo, aparece lá (MEMO) e eu não consigo editar ele, fica como nulo.

 

o meu segundo problema é, eu não sei onde colocar um evento para quando inserir os dados nesse campo e sair da célula, fazer um cálculo das quantidades...eu não queria colocar um botão para isso, queria que fosse automático...conforme vou inserindo os dados, um edit com o valor da soma vai se auto somando...

eu tenho os seguintes campos nome, quantidade e valor, teria que ser algo que ao mudar a quantidade, ele multiplicasse o valor e mostrasse no edit.

 

Valeu!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

o segundo problema está resolvido, consegui fazer com oncolexit...eu tinha tentando antes, mas agora com um pouco mais de atenção deu certo, valeu!!do outro problema alguém tem idéia? Tem algum lugar que preciso configurar o dbgrid para não limitar o tamanho?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dependente se o campo é do tipo Memo ou se têm tamanho maior que 500, é colocado como o campo sendo do tipo Memo no grid, para editar uma forma seria usando o evento OnEditButtonClick, nele pode fazer algo do tipo:

 

var	form: TForm;	memo: TDBMemo;beginif DBGrid1.SelectedField = tabelaCAMPO_MEMO then	begin	form:=TForm.Create(nil);	try		form.Width:=240;		form.Height:=120;		form.Top:=Mouse.CursorPos.Y;		form.Left:=(Mouse.CursorPos.X)- 190;		form.BorderStyle:=bsToolWindow;		form.Caption:='Editando';		memo:=TDBMemo.Create(nil);		try			memo.Parent:=form;			memo.Align:=alClient;			memo.DataSource:=DataSource1;			memo.DataField:='CAMPO_MEMO';			form.ShowModal;			if tabela.State in [dsEdit,dsInsert] then				tabela.Post;			finally				memo.Free;		end;	finally		form.Free;		end;	end;
No caso ele vai criar uma janelhinha para que você possa editar o valor do memo....

Para que ele não limite o tamanho dos campos, você poderia adicionar os campos no projeto, deixando eles fixos e com os tamanhos desejados...

Compartilhar este post


Link para o post
Compartilhar em outros sites

o meu problema é que o campo no banco de dados é varchar com 30 caracteres, mas imagina que meu dbgrid tem 1 linha só com dados e nesse campo eu tenho somente o número 1 ou a palavra para, no primeiro caso, com número 1 eu não consigo alterar ele para 10 por ex, posso ir até 9 ou seja 1 caractere, se tiver a palavra para, ele ficaria com 4 caracteres de llimite entendeu?Será que pode ser erro no mysql? pq quando o campo é INT parece que não dá esse problema...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Provavelmente é erro de componente, no caso se o valor no campo contiver 5 caracters, você edita e não consegue digitar mais de 5 caracteres, seria isto ? você não tem nada configurado para bloquear, restringir a digitação ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

é exatamente esse erro que você descreveu!! eu não coloquei nada para restringir não...o outro campo eu resolvi simplesmente mudando o o campo no bd para int não mudei nada no dbgrid, só no bd...isso que eu não estou entendendo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu achei o porque do erro, mas ainda não consegui resolver, se alguém souber, esse erro de limitação de caracteres só acontece quando eu coloco um WHERE na minha consulta...ex. select nome from cadastro (quando faço assim eu consigo editar sem problemas)mas se eu coloco whereselect nome from cadastro where nome = marceloa consulta vem normal, mas a edição fica limita aos caracteres do campo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que ele leva em consideração o n° de caracteres que o registro possui, no caso como você mencionou usando o where, ele deve somente trazer do BD n° X de posições, para poupar memória (quem sabe), faz um teste, adiciona os campos na sua qry, e deixa fixo eles no DBGRID, ou seja, não carrega em tempo de execução, para ver o que acontece...

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu fiz o que você falou, ao invés de abrir a query em tempo de execução, deixei aberta com um clausula quaquer no where, e retornou da mesma maneira, de algum modo ele limita mesmo os caracteres...só o estranho é que isso acontece só em campo varchar com Int não dá esse erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que quiz dizer é você colocar os campos no grid de forma fixa, no caso de dois cliques sobre o grid, vai abrir uma tela para informar os campos que vão compor o grid, clique em Add New, depois vai nas propriedades e no FieldName selecione o nome do campo desejado, assim pode ir fazendo com os campos que deseja que seja mostrado no GRID, tente fazer o teste desta forma...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah sim...isso eu já tinha feito também...em ambas as maneiras só o campo INT do mysql funciona, o restante eu não consigo editar...eu já to desistindo mesmo, to tentando arrumar uma outra forma de resolver isso...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais um teste :) logo após abrir a sua qry, veja o tamanho do campo que ele esta mostrando, de um ShowMessage, pode fazer algo do tipo:

 

ShowMessage(IntToStr(qry.FieldByName('NOME_DO_CAMPO').DisplayWidth));ShowMessage(IntToStr(qry.FieldByName('NOME_DO_CAMPO').Size));

Compartilhar este post


Link para o post
Compartilhar em outros sites

Retornando ao tópico depois de dois dias de folga...rs...fiz o teste que você falou e o retorno que recebi foi exatamente igual a quantidade de caracteres que tinha no campo, ex: "Marcelo" me retornou tanto no size quanto no width 7

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dependente se o campo é do tipo Memo ou se têm tamanho maior que 500, é colocado como o campo sendo do tipo Memo no grid, para editar uma forma seria usando o evento OnEditButtonClick, nele pode fazer algo do tipo:

 

var	form: TForm;	memo: TDBMemo;beginif DBGrid1.SelectedField = tabelaCAMPO_MEMO then	begin	form:=TForm.Create(nil);	try		form.Width:=240;		form.Height:=120;		form.Top:=Mouse.CursorPos.Y;		form.Left:=(Mouse.CursorPos.X)- 190;		form.BorderStyle:=bsToolWindow;		form.Caption:='Editando';		memo:=TDBMemo.Create(nil);		try			memo.Parent:=form;			memo.Align:=alClient;			memo.DataSource:=DataSource1;			memo.DataField:='CAMPO_MEMO';			form.ShowModal;			if tabela.State in [dsEdit,dsInsert] then				tabela.Post;			finally				memo.Free;		end;	finally		form.Free;		end;	end;
No caso ele vai criar uma janelhinha para que você possa editar o valor do memo....

Para que ele não limite o tamanho dos campos, você poderia adicionar os campos no projeto, deixando eles fixos e com os tamanhos desejados...

Tentei fazer um exemplo igual a esse passado, mas no meu exemplo não apareceu o EditButton, devo fazer mais alguma modificação??

 

abaixo está o meu exemplo no evento oneditbuttonclick

procedure TForm1.DBGrid1EditButtonClick(Sender: TObject);var	form: TForm;	memo: TDBMemo;beginif DBGrid1.SelectedField = table1State then	begin	form:=TForm.Create(nil);	try		form.Width:=240;		form.Height:=120;		form.Top:=Mouse.CursorPos.Y;		form.Left:=(Mouse.CursorPos.X)- 190;		form.BorderStyle:=bsToolWindow;		form.Caption:='Editando';		memo:=TDBMemo.Create(nil);		try			memo.Parent:=form;			memo.Align:=alClient;			memo.DataSource:=DataSource1;			memo.DataField:='State';			form.ShowModal;			if table1.State in [dsEdit,dsInsert] then				table1.Post;			finally				memo.Free;		end;	finally		form.Free;		end;	end;end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.