Montar colunas do DBGrid em Run-Time
Pessoal estou montando uma SQL em run-time, e quero adicionar todos os campos da SQL a lista TField do TDataSet, e consequentemente ligar os campos (TField) do TDataSet a um DBGrid.
É para uma tela de pesquisa:
QLoq.SQL.Clear;
QLoq.SQL.Add(´Select codigo, cidade from cidades´);
QLoq.Fields.Add(´Codigo´) // +/- assim
QLoq.Fields.Add(´Cidade´) // +/- assim
DBGrid.Columns.Add;
DBGrid.Columns.Add;
DBGrid.Columns.Fieldname:=´Codigo´
DBGrid.Columns.Fieldname:=Cidades´
Compreendes?
É para uma tela de pesquisa:
QLoq.SQL.Clear;
QLoq.SQL.Add(´Select codigo, cidade from cidades´);
QLoq.Fields.Add(´Codigo´) // +/- assim
QLoq.Fields.Add(´Cidade´) // +/- assim
DBGrid.Columns.Add;
DBGrid.Columns.Add;
DBGrid.Columns.Fieldname:=´Codigo´
DBGrid.Columns.Fieldname:=Cidades´
Compreendes?
Valberaguiar
Curtidas 0
Respostas
Rômulo Barros
11/05/2004
Utilize a propriedade Columns do seu DBGrid para adicionar as colunas e, em seguida, sete a mesma para o seu field, através do FieldName da coluna indicada :lol:
GOSTEI 0
Valberaguiar
11/05/2004
É exatamente isso q estou tentando fazer.... Dava pra dar um exemplo? Pfv...
Obrigado!!
Obrigado!!
GOSTEI 0
Rômulo Barros
11/05/2004
procedure TForm1.BitBtn1Click(Sender: TObject); begin ClientDataSet1.Close; ClientDataSet1.CommandText := ´select matricula from pessoal_pes´; DBGrid1.DataSource := DataSource1; DBGrid1.Columns[0].Title.Caption := ´a´; DBGrid1.Columns[0].FieldName := ´matricula´; ClientDataSet1.Open; end; end.
GOSTEI 0
Khundalini
11/05/2004
Particularmente, a melhor, mais elegante e mais prática forma de configurar as colunas de um TDBGrid (ou melhor, um descedente de TCustomDBGrid) é usar a propriedade Visible dos TFields de um dataset para True. Isso pode ser feito tanto em tempo de projeto (a.k.a. Design-Time) como em tempo de execução (a.k.a. Run-Time). Todos os TFields, por default, possuem a propriedade Visible com o valor True. Portanto, fica mais fácil configurar um grid, pois você só precisaria configurar a propriedade para False apenas para os campos que você não quer mostrar. Exemplo:
procedure TDataModule1.Table1AfterOpen(DataSet: TDataSet);
begin
Table1.FieldByName(´SALARIO´).Visible := False;
end;
A dica vale mesmo se você não tiver objetos TField criados em tempo de projeto ou em tempo de execução.
[]s
Rubem Rocha
Manaus, AM
procedure TDataModule1.Table1AfterOpen(DataSet: TDataSet);
begin
Table1.FieldByName(´SALARIO´).Visible := False;
end;
A dica vale mesmo se você não tiver objetos TField criados em tempo de projeto ou em tempo de execução.
[]s
Rubem Rocha
Manaus, AM
GOSTEI 0
Valberaguiar
11/05/2004
Amigos, com a ajuda de vcs o meu problema está bem próximo de uma solução, porém já abusando um pouco mais da presteza de vcs.
[b:e5b7b6a2b5]Qloq.Close;
Qloq.FieldList.Clear;[/b:e5b7b6a2b5]
[b:e5b7b6a2b5]Qloq.SQL.Clear;[/b:e5b7b6a2b5] //Não tenho nenhum campo no Editor de Campo do Delphi e nem SQL. OK Até 100¬.
[b:e5b7b6a2b5]Qloq.SQL.Add(´Select Codigo, Cliente, Fantasia From Clientes´);[/b:e5b7b6a2b5]
//Agora defino a SQL em run-time q ora pode ser com cliente e 3 campo e ora com cidades com apenas um campo.
[b:e5b7b6a2b5]Qloq.FieldDefs.Add(´Codigo´, ftInteger, 0, False);
Qloq.FieldDefs.Add(´Cliente´, ftString, 40, False);
Qloq.FieldDefs.Add(´Fantasia´, ftString, 40, False);[/b:e5b7b6a2b5] //Aqui adicionei os campo ao Editor de campo (não sei se esse é o meio mais apropriado para faze-lo). Lembrando sempre q como o Form vai ser usado para localizar tanto ´Clientes´ como ´Cidades´ e outros..... não tem como eu sabe em Design-Time quantos campo são...
[b:e5b7b6a2b5]DBGrid1.Columns.Add;[/b:e5b7b6a2b5] //Para ´Código´
[b:e5b7b6a2b5]DBGrid1.Columns.Add;[/b:e5b7b6a2b5] //Para ´Cliente´
[b:e5b7b6a2b5]DBGrid1.Columns.Add;[/b:e5b7b6a2b5] //Para ´Fantasia´
//Adiciono as colunas para o DBGrid... (3, 2, 1....)
Pessoal até parece está dando certo.... Só falta eu definir as mascáras dos campo para q por exemplo o campo código aparece no grid formatado (0000000010...).
Estava tentando definir as mascáras com:
Qloq.FieldByname(´Codigo´).DisPlayFormat:=´#0000000000´;
só q não tem esse propriedade....
[/b]
[b:e5b7b6a2b5]Qloq.Close;
Qloq.FieldList.Clear;[/b:e5b7b6a2b5]
[b:e5b7b6a2b5]Qloq.SQL.Clear;[/b:e5b7b6a2b5] //Não tenho nenhum campo no Editor de Campo do Delphi e nem SQL. OK Até 100¬.
[b:e5b7b6a2b5]Qloq.SQL.Add(´Select Codigo, Cliente, Fantasia From Clientes´);[/b:e5b7b6a2b5]
//Agora defino a SQL em run-time q ora pode ser com cliente e 3 campo e ora com cidades com apenas um campo.
[b:e5b7b6a2b5]Qloq.FieldDefs.Add(´Codigo´, ftInteger, 0, False);
Qloq.FieldDefs.Add(´Cliente´, ftString, 40, False);
Qloq.FieldDefs.Add(´Fantasia´, ftString, 40, False);[/b:e5b7b6a2b5] //Aqui adicionei os campo ao Editor de campo (não sei se esse é o meio mais apropriado para faze-lo). Lembrando sempre q como o Form vai ser usado para localizar tanto ´Clientes´ como ´Cidades´ e outros..... não tem como eu sabe em Design-Time quantos campo são...
[b:e5b7b6a2b5]DBGrid1.Columns.Add;[/b:e5b7b6a2b5] //Para ´Código´
[b:e5b7b6a2b5]DBGrid1.Columns.Add;[/b:e5b7b6a2b5] //Para ´Cliente´
[b:e5b7b6a2b5]DBGrid1.Columns.Add;[/b:e5b7b6a2b5] //Para ´Fantasia´
//Adiciono as colunas para o DBGrid... (3, 2, 1....)
Pessoal até parece está dando certo.... Só falta eu definir as mascáras dos campo para q por exemplo o campo código aparece no grid formatado (0000000010...).
Estava tentando definir as mascáras com:
Qloq.FieldByname(´Codigo´).DisPlayFormat:=´#0000000000´;
só q não tem esse propriedade....
[/b]
GOSTEI 0
Khundalini
11/05/2004
O método FieldByName() de um descendente de TDataSet retorna um objeto TField, e a propriedade DisplayFormat pertence a um descendente de TField, chamado TNumericField (consulta o help do Delphi).
Portanto, se quiser definir a máscara de um campo numérico, você precisa fazer um typecast (conversão de tipo), assim:
TNumericField(Query1.FieldByName(´Codigo´)).DisplayFormat := ´#000´;
O peixe foi pescado!
[]s
Rubem Rocha
Manaus, AM
Portanto, se quiser definir a máscara de um campo numérico, você precisa fazer um typecast (conversão de tipo), assim:
TNumericField(Query1.FieldByName(´Codigo´)).DisplayFormat := ´#000´;
O peixe foi pescado!
[]s
Rubem Rocha
Manaus, AM
GOSTEI 0
Valberaguiar
11/05/2004
B I N G O!!!!!!! ... B I N G O!!!!!!!.. B I N G O!!!!!!!
:D :D :D
Meu amigo valeu!!!!
:D :D :D
Meu amigo valeu!!!!
GOSTEI 0
Valberaguiar
11/05/2004
Caros colegas....
TIntegerField(Pesquisa.FieldByName(´ID_Pedido´)).DisplayFormat := ´#0000000000´;
o que é cenessário fazer para este type cast funciona com DBExpress, TSQLDataSet?
Grato!!!!
TIntegerField(Pesquisa.FieldByName(´ID_Pedido´)).DisplayFormat := ´#0000000000´;
o que é cenessário fazer para este type cast funciona com DBExpress, TSQLDataSet?
Grato!!!!
GOSTEI 0
Valberaguiar
11/05/2004
Sempre retorna um erro: ´No argument for format ´¬s´
mas antes de de fazer o type cast adiciono o campo:
FieldDefs.Add(´ID_Pedido´, ftInteger, 0, False);
Grato!!!!
mas antes de de fazer o type cast adiciono o campo:
FieldDefs.Add(´ID_Pedido´, ftInteger, 0, False);
Grato!!!!
GOSTEI 0