GARANTIR DESCONTO

Fórum COMBOBOX #374578

04/09/2009

0

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


Lenasi

Lenasi

Responder

Posts

08/09/2009

Lenasi

Bom dia amigos, alguém poderia me ajudar?


Responder

Gostei + 0

08/09/2009

Afarias

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


Responder

Gostei + 0

08/09/2009

Lenasi

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


Responder

Gostei + 0

08/09/2009

Afarias

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:


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+


Responder

Gostei + 0

09/09/2009

Lenasi

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



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


Responder

Gostei + 0

09/09/2009

Afarias

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+


Responder

Gostei + 0

10/09/2009

Lenasi

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

    
    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.


Responder

Gostei + 0

10/09/2009

Afarias

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+


Responder

Gostei + 0

10/09/2009

Lenasi

[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


Responder

Gostei + 0

10/09/2009

Lenasi

[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´


Responder

Gostei + 0

10/09/2009

Afarias

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+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar