Verificando o tipo do campo selecionado no DBGrid
Ola amigos,
gostaria de saber como faço para pegar o tipo do campo que está selecionado no DBGrid.
Alguém pode me ajudar ?
gostaria de saber como faço para pegar o tipo do campo que está selecionado no DBGrid.
Alguém pode me ajudar ?
Fábio Banhos
Curtidas 0
Respostas
Marco Salles
18/02/2012
Olá Fábio Banhos tudo bem . Então eu escrevi uma classe que pode ser utilizada para esta finalidae
http://marcosalles.wordpress.com/2011/03/28/classe-generica-para-transformar-tipos-enumerados-para-tstrings/
Após adicionar a unit uEnunConvertString no seu projeto de uses a esta Unidade no Form que esta o DbGrid
Adicone um Variável do tipo FLista:Tstrings na secção Private deste form
Instancie esta variável no evento OnShow e Destrua no Ondestroy
procedure TForm2.FormShow(Sender: TObject);
begin
Flista:=TStringList.Create;
TConvert<TFieldType>.PopulateListEnum(Flista);
end;
Agora em qq evento coloque
procedure TForm2.Button3Click(Sender: TObject);
begin
showmessage(FLista.Strings[integer(DBGrid1.SelectedField.DataType)]);
end;
ps) tem outros modos de fazer tb , mas acredito que qq um deles # deste processo irá cair num case
http://marcosalles.wordpress.com/2011/03/28/classe-generica-para-transformar-tipos-enumerados-para-tstrings/
Após adicionar a unit uEnunConvertString no seu projeto de uses a esta Unidade no Form que esta o DbGrid
Adicone um Variável do tipo FLista:Tstrings na secção Private deste form
Instancie esta variável no evento OnShow e Destrua no Ondestroy
procedure TForm2.FormShow(Sender: TObject);
begin
Flista:=TStringList.Create;
TConvert<TFieldType>.PopulateListEnum(Flista);
end;
Agora em qq evento coloque
procedure TForm2.Button3Click(Sender: TObject);
begin
showmessage(FLista.Strings[integer(DBGrid1.SelectedField.DataType)]);
end;
ps) tem outros modos de fazer tb , mas acredito que qq um deles # deste processo irá cair num case
GOSTEI 0
Fábio Banhos
18/02/2012
Vou começar a implementar agora MARCO ;)
Mas tipo, tenho uma unit chamada Biblioteca onde coloco todas as procedures, funcions e variaveis que seja comum a todo projeto, como validação de CPF por exemplo. Eu poderia colocar a classe escrita por você nessa unit ou devo realmente adicionar a uEnunConvertString no meu projeto ?
Mas tipo, tenho uma unit chamada Biblioteca onde coloco todas as procedures, funcions e variaveis que seja comum a todo projeto, como validação de CPF por exemplo. Eu poderia colocar a classe escrita por você nessa unit ou devo realmente adicionar a uEnunConvertString no meu projeto ?
GOSTEI 0
Marco Salles
18/02/2012
Veja bem , modestia a parte é uma unidade bem feita e poderosa
se voce adicionar no seu projeto toda vez que voce for utiliza-la em outro projeto terá mais trabalho
porque tem que achar o caminho onde ela se encontra , e adicionar no novo dpr .. Processo chato e não
muito recomendável
voce pode Adicionar esta unit com Patch Files do delphi , assim ela pode ser utilizada em qq aplicação
mas antes voce tem que experimenta-la , pode ser que não seja isso tudo como eu imagino ..
se voce adicionar no seu projeto toda vez que voce for utiliza-la em outro projeto terá mais trabalho
porque tem que achar o caminho onde ela se encontra , e adicionar no novo dpr .. Processo chato e não
muito recomendável
voce pode Adicionar esta unit com Patch Files do delphi , assim ela pode ser utilizada em qq aplicação
mas antes voce tem que experimenta-la , pode ser que não seja isso tudo como eu imagino ..
GOSTEI 0
Fábio Banhos
18/02/2012
Consegui fazer o que queria.
Achei o tipo do campo da coluna selecionada no grid com o seguinte comando:
dbgrdPesquisa.Columns[dbgrdPesquisa.SelectedIndex].Field.DataType
Veja o código implementado:
procedure TfrmPadraoPesquisa.edtPesquisaChange(Sender: TObject);
var CampoSelecionado: String;
begin
inherited;
if not (cdsPesquisa.IsEmpty) and (Trim(edtPesquisa.Text) <> ) then
begin
CampoSelecionado := dbgrdPesquisa.Columns[dbgrdPesquisa.SelectedIndex].Field.FieldName;
if (dbgrdPesquisa.Columns[dbgrdPesquisa.SelectedIndex].Field.DataType = ftString) then
begin
cdsPesquisa.Filtered := False;
cdsPesquisa.Filter := CampoSelecionado + LIKE + edtPesquisa.Text + %;
cdsPesquisa.Filtered := True;
end
else if (dbgrdPesquisa.Columns[dbgrdPesquisa.SelectedIndex].Field.DataType = ftInteger) then
begin
cdsPesquisa.Filtered := False;
cdsPesquisa.Filter := CampoSelecionado + = + edtPesquisa.Text;
cdsPesquisa.Filtered := True;
end;
end
else
begin
cdsPesquisa.Filtered := False;
end;
end;
Achei o tipo do campo da coluna selecionada no grid com o seguinte comando:
dbgrdPesquisa.Columns[dbgrdPesquisa.SelectedIndex].Field.DataType
Veja o código implementado:
procedure TfrmPadraoPesquisa.edtPesquisaChange(Sender: TObject);
var CampoSelecionado: String;
begin
inherited;
if not (cdsPesquisa.IsEmpty) and (Trim(edtPesquisa.Text) <> ) then
begin
CampoSelecionado := dbgrdPesquisa.Columns[dbgrdPesquisa.SelectedIndex].Field.FieldName;
if (dbgrdPesquisa.Columns[dbgrdPesquisa.SelectedIndex].Field.DataType = ftString) then
begin
cdsPesquisa.Filtered := False;
cdsPesquisa.Filter := CampoSelecionado + LIKE + edtPesquisa.Text + %;
cdsPesquisa.Filtered := True;
end
else if (dbgrdPesquisa.Columns[dbgrdPesquisa.SelectedIndex].Field.DataType = ftInteger) then
begin
cdsPesquisa.Filtered := False;
cdsPesquisa.Filter := CampoSelecionado + = + edtPesquisa.Text;
cdsPesquisa.Filtered := True;
end;
end
else
begin
cdsPesquisa.Filtered := False;
end;
end;
GOSTEI 0
Marco Salles
18/02/2012
então Fabio , foi o que eu ohe disse .. Desde do inicio
Com IFs ou CASES voce consegui
ps) tem outros modos de fazer tb , mas acredito que qq um deles # deste processo irá cair num case
Tudo bem que voce imprementou Dois IFS , mas sua pergunta inicial foi como saber pegar o tipo do campo
selecionado na Grid , e isto são muitas as possibilidades ...
TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, // 0..4
ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, // 5..11
ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, // 12..18
ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, // 19..24
ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, // 25..31
ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd, // 32..37
ftFixedWideChar, ftWideMemo, ftOraTimeStamp, ftOraInterval, // 38..41
ftLongWord, ftShortint, ftByte, ftExtended, ftConnection, ftParams, ftStream, //42..48
ftTimeStampOffset, ftObject, ftSingle); //49..51
se voce pergunta-se que queria saber se era somente o ftInteger ou o ftString Ai a resposta seria outra
Com IFs ou CASES voce consegui
ps) tem outros modos de fazer tb , mas acredito que qq um deles # deste processo irá cair num case
Tudo bem que voce imprementou Dois IFS , mas sua pergunta inicial foi como saber pegar o tipo do campo
selecionado na Grid , e isto são muitas as possibilidades ...
TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, // 0..4
ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, // 5..11
ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, // 12..18
ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, // 19..24
ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, // 25..31
ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd, // 32..37
ftFixedWideChar, ftWideMemo, ftOraTimeStamp, ftOraInterval, // 38..41
ftLongWord, ftShortint, ftByte, ftExtended, ftConnection, ftParams, ftStream, //42..48
ftTimeStampOffset, ftObject, ftSingle); //49..51
se voce pergunta-se que queria saber se era somente o ftInteger ou o ftString Ai a resposta seria outra
GOSTEI 0
Fábio Banhos
18/02/2012
Entendi!
Bom, a principio só irei trabalhar com esses dois tipos, mas fiquei curioso em utilizar aquela sua unit.
Como esse é um projeto teste para um processo de seleção, procurei utilizar códigos mais familiares.
Acho que deveria ter especificado mais a minha duvida mesmo.
Obrigado por estar sempre me ajudando MARCO.
Abraço.
Bom, a principio só irei trabalhar com esses dois tipos, mas fiquei curioso em utilizar aquela sua unit.
Como esse é um projeto teste para um processo de seleção, procurei utilizar códigos mais familiares.
Acho que deveria ter especificado mais a minha duvida mesmo.
Obrigado por estar sempre me ajudando MARCO.
Abraço.
GOSTEI 0
Marco Salles
18/02/2012
se é um processo de seleção no minimo utilize o case ao inves de dois if concatenados
GOSTEI 0