ComboBox TypeCast

Delphi

19/02/2013

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;
Volmir Santos

Volmir Santos

Curtidas 0

Respostas

Perivaldo Martins

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

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
GOSTEI 0
Perivaldo Martins

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:
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

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

GOSTEI 0
Volmir Santos

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
GOSTEI 0
Rafael Cunha

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

Volmir Santos

19/02/2013

Hum
vou testar aqui
GOSTEI 0
Volmir Santos

Volmir Santos

19/02/2013

Ok Obrigado a todos pelas dicas
deu certo consegui o que precisava
Att
GOSTEI 0
Perivaldo Martins

Perivaldo Martins

19/02/2013

Ok Obrigado a todos pelas dicas
deu certo consegui o que precisava
Att


OK! E como ficou sua classe Estados?


Boa sorte e bons códigos!
GOSTEI 0
Marco Salles

Marco Salles

19/02/2013

Ok Obrigado a todos pelas dicas
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
GOSTEI 0
Marco Salles

Marco Salles

19/02/2013

Ok Obrigado a todos pelas dicas
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
GOSTEI 0
Volmir Santos

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.
GOSTEI 0
Volmir Santos

Volmir Santos

19/02/2013

AI intanciei a clasee a cada Laço como o amigo sugeriu ai deu certo
GOSTEI 0
José

José

19/02/2013

"Tendo a questão sido solucionada, estou encerrando este tópico. Abraço a todos"
GOSTEI 0
Perivaldo Martins

Perivaldo Martins

19/02/2013

Blza companheiro, o Marco havia falado isso mesmo.


Boa sorte e bons códigos!
GOSTEI 0
POSTAR