ComboBox TypeCast

19/02/2013

2

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;
Responder

Posts


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!
Responder

20/02/2013

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

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
Responder
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!
Responder

20/02/2013

Volmir Santos

Bom dia
Seguinte Estou instanciando no onCreate do Form
Estado:=Testado.create;

e Destruindo o Objeto no OnDestroy do From

Responder

20/02/2013

Volmir Santos

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
Responder

20/02/2013

Rafael Cunha

Você tem que instanciar o objeto para cada item da lista, para ele possa fazer referencia ao objeto correto na lista.
Responder

20/02/2013

Volmir Santos

Hum
vou testar aqui
Responder

20/02/2013

Volmir Santos

Ok Obrigado a todos pelas dicas
deu certo consegui o que precisava
Att
Responder
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!
Responder

20/02/2013

Marco Salles

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
Responder

20/02/2013

Marco Salles

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
Responder

20/02/2013

Volmir Santos

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.
Responder

20/02/2013

Volmir Santos

AI intanciei a clasee a cada Laço como o amigo sugeriu ai deu certo
Responder

20/02/2013

José

"Tendo a questão sido solucionada, estou encerrando este tópico. Abraço a todos"
Responder
Blza companheiro, o Marco havia falado isso mesmo.


Boa sorte e bons códigos!
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira