COMBOBOX
Olá amigos !!!
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...
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
Curtidas 0
Respostas
Lenasi
04/09/2009
Bom dia amigos, alguém poderia me ajudar?
GOSTEI 0
Afarias
04/09/2009
|Bem primeiro gostaria de obter mais informações a respeito de quando
|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+
|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
Lenasi
04/09/2009
|Bem primeiro gostaria de obter mais informações a respeito de quando
|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+
Então amigo,
De que forma coloco no 1º combo os regitros do dataset clonado?
GOSTEI 0
Afarias
04/09/2009
Se vai usar um COMBO normal (não DBLookup) vc pode usar um loop simples. Eu particularmente gosto de adicionar as strings e o ´ID´ do registro associado, ex:
no evento OnChange vc tem como pegar a string (Nome) e o ID associado:
T+
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
Lenasi
04/09/2009
Se vai usar um COMBO normal (não DBLookup) vc pode usar um loop simples. Eu particularmente gosto de adicionar as strings e o ´ID´ do registro associado, ex:
no evento OnChange vc tem como pegar a string (Nome) e o ID associado:
T+
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
Afarias
04/09/2009
O Object que inserir é uma String, e não sei porque não estpá compilando devido algum erro: veja o código:
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
Lenasi
04/09/2009
[quote=´afarias´]
3) vc pode usar TStrings mas tem que lembrar de destruir (em algum momento) todos os objetos que criar, ou terá memory leaks! ex:
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:
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.
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
Afarias
04/09/2009
Isso colocaria então no OnCLose do Form?
No OnDestroy eu diria. Mas pode ser no OnClose tb. Depende de como/quando vc cria seus forms e preenche os objetos do combo.
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?
Acho que vc não entendeu meus posts. Neles dou 2 soluções para seu caso, use uma delas ou ambas em conjunto.
O que faz este csOwnerDrawFixed e o ecento OnDrawItem?
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
Lenasi
04/09/2009
[quote:a22bf6da57]
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]);
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
Lenasi
04/09/2009
[quote:729c38a28a=´afarias´][quote:729c38a28a]
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]);
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
Afarias
04/09/2009
Opa,
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+
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