ComboBox TypeCast
Gostaria da opiniao de alguem sobre a seguinte situacao
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;
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
Curtidas 0
Respostas
Perivaldo Martins
19/02/2013
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!
GOSTEI 0
Marco Salles
19/02/2013
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
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
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
GOSTEI 0
Perivaldo Martins
19/02/2013
Olá meu amigo Marco Salles!
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:
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!
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!
GOSTEI 0
Volmir Santos
19/02/2013
Bom dia
Seguinte Estou instanciando no onCreate do Form
Estado:=Testado.create;
e Destruindo o Objeto no OnDestroy do From
Seguinte Estou instanciando no onCreate do Form
Estado:=Testado.create;
e Destruindo o Objeto no OnDestroy do From
GOSTEI 0
Volmir Santos
19/02/2013
Mas entendi o que o Colega quis dizer
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
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
GOSTEI 0
Rafael Cunha
19/02/2013
Você tem que instanciar o objeto para cada item da lista, para ele possa fazer referencia ao objeto correto na lista.
GOSTEI 0
Volmir Santos
19/02/2013
Hum
vou testar aqui
vou testar aqui
GOSTEI 0
Volmir Santos
19/02/2013
Ok Obrigado a todos pelas dicas
deu certo consegui o que precisava
Att
deu certo consegui o que precisava
Att
GOSTEI 0
Perivaldo Martins
19/02/2013
Ok Obrigado a todos pelas dicas
deu certo consegui o que precisava
Att
deu certo consegui o que precisava
Att
OK! E como ficou sua classe Estados?
Boa sorte e bons códigos!
GOSTEI 0
Marco Salles
19/02/2013
Ok Obrigado a todos pelas dicas
deu certo consegui o que precisava
Att
deu certo consegui o que precisava
Att
Foi o que eu disse desde do inicio amigo
Olha o meu post
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
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
GOSTEI 0
Marco Salles
19/02/2013
Ok Obrigado a todos pelas dicas
deu certo consegui o que precisava
Att
deu certo consegui o que precisava
Att
Foi o que eu disse desde do inicio amigo
Olha o meu post
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
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
GOSTEI 0
Volmir Santos
19/02/2013
Esta é a minha Classe Estados
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.
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.
GOSTEI 0
Volmir Santos
19/02/2013
AI intanciei a clasee a cada Laço como o amigo sugeriu ai deu certo
GOSTEI 0
José
19/02/2013
"Tendo a questão sido solucionada, estou encerrando este tópico. Abraço a todos"
GOSTEI 0
Perivaldo Martins
19/02/2013
Blza companheiro, o Marco havia falado isso mesmo.
Boa sorte e bons códigos!
Boa sorte e bons códigos!
GOSTEI 0