ComboBox TypeCast
19/02/2013
0
Tenho um combo onde nele mostro todas as siglas dos estados do brasil
porem isto esta gravado em banco e gostaria de carregar tambem neste combo o codigo
deste estado porem que fique invisivel para o usuario, pra posteriormente quando o usuario selecionar um estado
eu busque em banco todos os municipios deste estado e carregue em um outro combo.
seria muito mais confiavel buscar pelo codigo do que fazer uma busca do codigo de acordo com a Uf (sigla) que ele selecionou
Fiz um exemplo porem na hora de selecionar nao esta puxando certo sempre tras o ultimo que inseri
Segue o meu exmplo:
Pra Carregar:
with DM.qrAux do
begin
Close;
SQL.Clear;
SQL.Add(''Select EST_COD, EST_UF, EST_COD_IBGE ''+
''from PRI_ESTADO order by EST_UF asc; '');
Open;
First;
end;
while not DM.qrAux.Eof do
begin
//A variavel Estado é um objeto com estas propriedades
//aqui eu populo o Objeto Estado
Estado.Cod :=DM.qrAux.FieldByName(''EST_COD'').AsInteger;
Estado.Sigla:=DM.qrAux.FieldByName(''EST_UF'').AsString;
Estado.Ibge :=DM.qrAux.FieldByName(''EST_COD_IBGE'').AsInteger;
//Aqui Insiro no combo
cbbEstados.AddItem(Estado.Sigla, TObject(Estado));//Aqui a variável Estado foi typecasted de TEstados p/ TObject
DM.qrAux.Next;
end;
Pra mostar :
{Aqui nao esta funcionando Tras sempre o ultimo objeto inserido}
procedure TfrmConfSistema.cbbEstadosSelect(Sender: TObject);
begin
Estado:=TEstados (cbbEstados.Items. Objects [cbbEstados.ItemIndex]); // Agora, fez-se o typecast de TObject p/ TEstados
ShowMessage (''UF = ''+Estado.Sigla + #13#13#10 +
''Codigo do Estado: '' + IntToStr(Estado.Cod) + #13#10 +
''IBGE do Estado: '' + IntToStr(Estado.Ibge));
end;
Volmir Santos
Posts
20/02/2013
Perivaldo Martins
Pra mostar :
{Aqui nao esta funcionando Tras sempre o ultimo objeto inserido}
procedure TfrmConfSistema.cbbEstadosSelect(Sender: TObject);
begin
Estado:=TEstados (cbbEstados.Items. Objects [cbbEstados.ItemIndex]); // Agora, fez-se o typecast de TObject p/ TEstados
ShowMessage (''UF = ''+Estado.Sigla + #13#13#10 +
''Codigo do Estado: '' + IntToStr(Estado.Cod) + #13#10 +
''IBGE do Estado: '' + IntToStr(Estado.Ibge));
end;
Colega, pode ser que eu esteja enganado, mas como você não está recuperando as informações de nenhuma lista, os dados nas propriedades Sigla, Cod e IBGE vão ser sempre os do final da tabela percorrida em While Do.
Imagino que você tenha criado mais ou menos assim.
type TEstados = class private { Private declarations } ....
Ou será q foi diferente?
Boa sorte e bons códigos!
20/02/2013
Marco Salles
1) primeiro vc não precisa fazer o tyeCast de TEstado para TObject , porque invariavelmente TEstado é um TObjecto , porem
nen todo TObject é um TEstado
cbbEstados.AddItem(Estado.Sigla, TObject(Estado));//Aqui a variável Estado foi typecasted de TEstados p/ TObject *****
***Desnecessário
2) Esta puxando o Ultimo que vc escreveu pq vc esta sobescrevendo o valor das propriedades deste objeto ...
//A variavel Estado é um objeto com estas propriedades
//aqui eu populo o Objeto Estado
Estado.Cod :=DM.qrAux.FieldByName(''EST_COD'').AsInteger;
Estado.Sigla:=DM.qrAux.FieldByName(''EST_UF'').AsString;
Estado.Ibge :=DM.qrAux.FieldByName(''EST_COD_IBGE'').AsInteger;
Para funcionar dojeito que vc necessita vc tem que instanciar objetos do tipo TEstado , atribuir as informações
pertinentes a ele e depois sim retorna essas informações .
Algo do tipo
//A variavel Estado tem que ser instanciada acada iteração do Laço
Estado:=TEstado.create;
Estado.Cod :=DM.qrAux.FieldByName(''EST_COD'').AsInteger;
Estado.Sigla:=DM.qrAux.FieldByName(''EST_UF'').AsString;
Estado.Ibge :=DM.qrAux.FieldByName(''EST_COD_IBGE'').AsInteger;
[]sds
20/02/2013
Perivaldo Martins
duas observações
1) primeiro vc não precisa fazer o tyeCast de TEstado para TObject , porque invariavelmente TEstado é um TObjecto , porem
nen todo TObject é um TEstado
cbbEstados.AddItem(Estado.Sigla, TObject(Estado));//Aqui a variável Estado foi typecasted de TEstados p/ TObject *****
***Desnecessário
Também não vejo necessidade dessa TypeCast.
Ficando assim:
cbbEstados.AddItem(Estado.Sigla, Estado);
2) Esta puxando o Ultimo que vc escreveu pq vc esta sobescrevendo o valor das propriedades deste objeto ...
//A variavel Estado é um objeto com estas propriedades
//aqui eu populo o Objeto Estado
Estado.Cod :=DM.qrAux.FieldByName(''EST_COD'').AsInteger;
Estado.Sigla:=DM.qrAux.FieldByName(''EST_UF'').AsString;
Estado.Ibge :=DM.qrAux.FieldByName(''EST_COD_IBGE'').AsInteger;
Isso porque ele não está armazenando esses dados em lugar algum, eles serão sempre sobrescritos, ou será que alguma lista armazenando esses dados?
Para funcionar dojeito que vc necessita vc tem que instanciar objetos do tipo TEstado , atribuir as informações
pertinentes a ele e depois sim retorna essas informações .
Algo do tipo
//A variavel Estado tem que ser instanciada acada iteração do Laço
Estado:=TEstado.create;
Estado.Cod :=DM.qrAux.FieldByName(''EST_COD'').AsInteger;
Estado.Sigla:=DM.qrAux.FieldByName(''EST_UF'').AsString;
Estado.Ibge :=DM.qrAux.FieldByName(''EST_COD_IBGE'').AsInteger;
Marco, acho que deve instanciar Estado no OnCreate ou algo assim, mas mesmo assim, acho que vai continuar do mesmo jeito, mas esperar o feedback do colega.
Boa sorte e bons códigos!
20/02/2013
Volmir Santos
Seguinte Estou instanciando no onCreate do Form
Estado:=Testado.create;
e Destruindo o Objeto no OnDestroy do From
20/02/2013
Volmir Santos
Pois acredito que nao consigo gravar varios valores pra um mesmo objeto
ele tem varias propriedades nao nao consigo armazenar varias vezes valores diferentes
vai armazenar sempre a ultima
Mas ai nao vejo uma solucao para o meu problema
20/02/2013
Rafael Cunha
20/02/2013
Volmir Santos
deu certo consegui o que precisava
Att
20/02/2013
Perivaldo Martins
deu certo consegui o que precisava
Att
OK! E como ficou sua classe Estados?
Boa sorte e bons códigos!
20/02/2013
Marco Salles
deu certo consegui o que precisava
Att
Foi o que eu disse desde do inicio amigo
Olha o meu post
pertinentes a ele e depois sim retorna essas informações .
Algo do tipo
//A variavel Estado tem que ser instanciada acada iteração do Laço
20/02/2013
Marco Salles
deu certo consegui o que precisava
Att
Foi o que eu disse desde do inicio amigo
Olha o meu post
pertinentes a ele e depois sim retorna essas informações .
Algo do tipo
//A variavel Estado tem que ser instanciada acada iteração do Laço
20/02/2013
Volmir Santos
unit UnEstados;
interface
uses
System.SysUtils, System.Classes, Data.DBXFirebird, Data.DB, Data.SqlExpr,
Windows, Messages, Graphics, Controls, Forms, Dialogs,
DBCtrls, ExtCtrls, IniFiles, IdBaseComponent, IdComponent, IdIPWatch,
IdMessage, IdTCPConnection, IdTCPClient, IdMessageClient, IdSMTP,
IdExplicitTLSClientServerBase, IdSMTPBase, Datasnap.Provider, Datasnap.DBClient,
Data.DBXDataSnap, IndyPeerImpl, Data.DBXCommon,
IPPeerClient, Data.FMTBcd, UnConexao, U_DM, UnFuncoes,
ZConnection, ZDataset, ZAbstractConnection,ZAbstractRODataset, ZAbstractDataset;
type
TEstados = class
private
FIbge: Integer;
FSigla: string;
FCod: Integer;
FNome: string;
FCod_Pais: Integer;
FQry: TZQuery;
procedure SetCod(const Value: Integer);
procedure SetIbge(const Value: Integer);
procedure SetNome(const Value: string);
procedure SetSigla(const Value: string);
procedure SetCod_Pais(const Value: Integer);
procedure SetQry(const Value: TZQuery);
public
constructor Create;
property Cod:Integer read FCod write SetCod;
property Nome:string read FNome write SetNome;
property Sigla:string read FSigla write SetSigla;
property Ibge:Integer read FIbge write SetIbge;
property Cod_Pais:Integer read FCod_Pais write SetCod_Pais;
property Qry:TZQuery read FQry write SetQry;
published
end;
implementation
{ TEstados }
constructor TEstados.Create;
begin
Qry := TZQuery.Create(nil);
Qry.Connection := DM.con1;
end;
procedure TEstados.SetCod(const Value: Integer);
begin
FCod := Value;
end;
procedure TEstados.SetCod_Pais(const Value: Integer);
begin
FCod_Pais := Value;
end;
procedure TEstados.SetIbge(const Value: Integer);
begin
FIbge := Value;
end;
procedure TEstados.SetNome(const Value: string);
begin
FNome := Value;
end;
procedure TEstados.SetQry(const Value: TZQuery);
begin
FQry := Value;
end;
procedure TEstados.SetSigla(const Value: string);
begin
FSigla := Value;
end;
end.
20/02/2013
Volmir Santos
20/02/2013
José
20/02/2013
Perivaldo Martins
Boa sorte e bons códigos!
Clique aqui para fazer login e interagir na Comunidade :)