Fórum COMBOBOX #374578
04/09/2009
0
Bom dia a todos....
Bem primeiro gostaria de obter mais informações a respeito de quando clonamos um ClientDataSet....
O que podemos fazer com este clone???
Uma dpuvida , creio que seja possível, é a respeito do ComboBox.
Tenho um cadastro com dois combobox, um deles relaciono numa tabela onde gostaria que os itens do mesmo, fosse a junção de dois campo, gravando no cadatro atual o ID deste regsitro e o outro combobox relacionado a outra tabela, filtraria registros conforme seleção do primeiro combobox, tipo, no primeiro seleciono a Cidade e no segundo ComboBox, me mostraria os Bairros desta cidade....
Muito obrigado, fico no aguardo.
Tenham um bom dia...
Lenasi
Curtir tópico
+ 0Posts
08/09/2009
Lenasi
Gostei + 0
08/09/2009
Afarias
|clonamos um ClientDataSet....
|O que podemos fazer com este clone???
A princípio, TUDO! Tem alguma dúvida em particular?
|filtraria registros conforme seleção do primeiro combobox, tipo, no primeiro
|seleciono a Cidade e no segundo ComboBox, me mostraria os Bairros desta
|cidade....
A questão ficou um pouco confusa, mas pelo q entendo é possível sim, claro. Vc pode usar tanto Combobox padrão como um Lookup. Utilize o evento OnChange do 1º combo para atualizar o 2o. Se usar DBLookups tb é possível usar eventos do DataSource (apenas +1 opção de fazer)
qualquer dúvida manda ae
T+
Gostei + 0
08/09/2009
Lenasi
Então amigo,
De que forma coloco no 1º combo os regitros do dataset clonado?
Gostei + 0
08/09/2009
Afarias
var id: Integer; s: string; begin combo.Items.Clear; with ClientDataSet do begin First; while not Eof do begin id := FieldByName(´ID´).AsInteger; s := FieldByName(´NOME´).AsString; combo.Items.AddObject(s, TObject(id)); // typecast necessário Next; end; end; end;
no evento OnChange vc tem como pegar a string (Nome) e o ID associado:
s := combo.Items[combo.ItemIndex]; id := Integer(combo.Items.Objects[combo.ItemIndex]); // typecast necessário
T+
Gostei + 0
09/09/2009
Lenasi
var id: Integer; s: string; begin combo.Items.Clear; with ClientDataSet do begin First; while not Eof do begin id := FieldByName(´ID´).AsInteger; s := FieldByName(´NOME´).AsString; combo.Items.AddObject(s, TObject(id)); // typecast necessário Next; end; end; end;
s := combo.Items[combo.ItemIndex]; id := Integer(combo.Items.Objects[combo.ItemIndex]); // typecast necessário
Olá, Amigo,
A sua sugestão me ajudou bastante.
Um outro amigo também incrementou algo e acabei conseguindo fazer o que queria, Mas tem apenas um detalhe.
O Object que inserir é uma String, e não sei porque não estpá compilando devido algum erro:
veja o código:
procedure TFrmFamiliaPn.CoBoxModeloPneuChange(Sender: TObject); var LinhaProd: TStrings; S: String; St: TStringList; begin inherited; LinhaProd := TStrings(CoBoxModeloPneu.Items.Objects[CoBoxModeloPneu.ItemIndex]); St := TStringList.Create; DsPneu.cdsGenerico.Close; St.Add(´ SELECT PNDI_DESCRICAO´); St.Add(´ FROM PNEU_DIMENSAO´); St.Add(´ WHERE PNDI_LINHA = ´+LinhaProd);
Não estou conseguindo concactenar: WHERE PNDI_LINHA = ´+LinhaProd);
Valeu !!!
Gostei + 0
09/09/2009
Afarias
Opa... bom, o código que passei não é designado para uso com strings... alguns toques:
1) string <> TStrings
2) string e ponteiros são coisas diferentes (Classes no Delphi são ponteiros) -- Sendo assim type-cast de string como TObject não vai funcionar. Vc pode então usar PChars, mas se vc é iniciante isto pode complicar mais q ajudar vc.
3) vc pode usar TStrings mas tem que lembrar de destruir (em algum momento) todos os objetos que criar, ou terá memory leaks! ex:
for i := 0 to Pred(Combobox.Items.Count) do Combobox.Items.Objects[i].Free;
Quanto ao seu erro, ocorre devido ao ponto 1 q eu falei ai acima, TStrings<>string, assim vc precisa mudar o código para algo como:
St.Add(´ WHERE PNDI_LINHA = ´+LinhaProd.Text);
Entretanto... entretanto... Para casos como este seu, eu daria outra solução mais simples... StringLists podem conter strings associadas na forma: NOME=VALOR, dai vc pode fazer uso deste recurso!, ex:
1) preencha os items no combo (nome=valor)
ComboBox1.Items.Values[´ITEM 1´] := ´VALOR 1´;
2) No OnChange, leia o VALOR selecionado (não a string inteira)
Label1.Caption := ComboBox1.Items.ValueFromIndex[ComboBox1.ItemIndex];
3) Mude a propriedade Style do Combobox para csOwnerDrawFixed e no evento OnDrawItem coloque o código:
with TComboBox(Control) do Canvas.TextRect(Rect, Rect.Left+1, Rect.Top+1, Items.Names[Index]);
T+
Gostei + 0
10/09/2009
Lenasi
3) vc pode usar TStrings mas tem que lembrar de destruir (em algum momento) todos os objetos que criar, ou terá memory leaks! ex:
for i := 0 to Pred(Combobox.Items.Count) do Combobox.Items.Objects[i].Free;
Isso colocaria então no OnCLose do Form?
Quanto ao seu erro, ocorre devido ao ponto 1 q eu falei ai acima, TStrings<>string, assim vc precisa mudar o código para algo como:
St.Add(´ WHERE PNDI_LINHA = ´+LinhaProd.Text);
1) preencha os items no combo (nome=valor) [code]ComboBox1.Items.Values[´ITEM 1´] := ´VALOR 1´;
Como ficaria o código no meu caso?
Preciso guardar um Nome + um ID, só que este ID não pode ser visível no combobox. Pensei em colocá-lo juntos com um grande espaço do nome para não aparecer e depois pegar partes deste string...
O que acha?
[code]
3) Mude a propriedade Style do Combobox para csOwnerDrawFixed e no evento OnDrawItem coloque o código:
[/code]
O que faz este csOwnerDrawFixed e o ecento OnDrawItem?
Por hora obrigado pela ajuda.
Gostei + 0
10/09/2009
Afarias
No OnDestroy eu diria. Mas pode ser no OnClose tb. Depende de como/quando vc cria seus forms e preenche os objetos do combo.
Acho que vc não entendeu meus posts. Neles dou 2 soluções para seu caso, use uma delas ou ambas em conjunto.
Style= csOwnerDrawFixed faz com q o evento OnDrawItem seja ´disparado´. OnDrawItem dá a oportunidade ao programados de controlar COMO os items são desenhados.
No exemplo que passei, em vez de deixar o combo desenhar NOME=VALOR eu faço com que ele desenhe apenas NOME
Melhor ver do q apenas ler... experimente vc ai o código que passei e veja o que acontece.
Se ainda tiver dúvidas, manda!
T+
Gostei + 0
10/09/2009
Lenasi
with TComboBox(Control) do Canvas.TextRect(Rect, Rect.Left+1, Rect.Top+1, Items.Names[Index]);
Olá Amigo, está quase lá...
meu código deu erro:
procedure TFrmFamiliaPn.CoBoxModeloPneuDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin inherited; with CoBoxModeloPneu(Control) do Canvas.TextRect(Rect, Rect.Left+1, Rect.Top+1, Items.Names[Index]); end;
Erro:
[DCC Error] uFrmFamilia.pas(101): E2066 Missing operator or semicolon
Gostei + 0
10/09/2009
Lenasi
with TComboBox(Control) do Canvas.TextRect(Rect, Rect.Left+1, Rect.Top+1, Items.Names[Index]);
Olá Amigo, está quase lá...
meu código deu erro:
procedure TFrmFamiliaPn.CoBoxModeloPneuDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin inherited; with CoBoxModeloPneu(Control) do Canvas.TextRect(Rect, Rect.Left+1, Rect.Top+1, Items.Names[Index]); end;
Erro:
[DCC Error] uFrmFamilia.pas(101): E2066 Missing operator or semicolon[/quote:729c38a28a]
Descobri....
Eu troquei o TComboBox pelo Caption do meu... Errado !!!!
Voltei e deu certo....
Pra finalizar, não estou conseguindo juntar o valor mais a strins:
Veja:
St.Add(´ WHERE PNDI_LINHA = "´+CoBoxModeloPneu.Items.ValueFromIndex[CoBoxModeloPneu.ItemIndex]´"´) ;
Quero como resultado isso:
WHERE PNDI_LINHA = ´valor´
Gostei + 0
10/09/2009
Afarias
TComboBox(Control)
é um Type Cast onde eu digo: ´o objeto Control deve ser tratado como TCombobox´ ...
Se seu componente é um TCombobox, apenas deixe o código exatamente como está no exemplo, se não mude TCombobox pela classe do componente (mas não pelo nome do mesmo).
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)
Inserção de url
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.