Fórum Relacionar forms com um TreeView #279411

28/04/2005

0

olá pessoal
Tenho um formprincipal. Neste form existe um Panel1 que possui um Treeview1. e no restante do form tenho um PnlPrincipal.
Acima do treevieww tenho um botão que abre uma tela para que eu selecione um cliente. Ao seleciona-lo, o nome é adicionado no treeview e é criada a tela de

cadastro deste cliente. Após posso selecionar um segundo cliente e o mesmo será adicionado ao treeiview e será também criada sua tela de cadastro. E assim

sucessivamente.
Com os cliente adicionados ao treeview, eu posso navegar entre eles e quando selecionar o cliente abre cria a sua tela de cadastro ou traz a tela para a

frente com o BringToFront se ela já estiver criada.
Até aqui tudo bem. O que acontece agora é que após o cliente estar no treeview ele tem a opção de chamar mais duas telas, a de Produtos e a de Pedidos.
Então qua o problema?
Acontece que, quando eu estiver com o cliente 1 selecionado no treeview ele pode chamar a sua tela de Pedidos por exemplo. Após isso eu posso mudar para o

Cliente 2 que está com a tela de cadastro ativa, se eu voltar para o Cliente 1 a tela ativa não serão a de Pedidos, mas sim a do seu cadastro. Isso ocorre

porque como dito acima, no treeview tem uma rotina que se a tela de cadastro já estiver criada a mesma é trazida para a frente ou senão ela é criada.

Então eu gostaria de saber uma forma de guardar em algum tipo de variável a tela ativa do cliente antes de mudar para um outro cliente(eu diferencio os forms

criados pelo Frm.Name - o BringtoFront também utiliza o Name do form.) . Como eu posso ter ´n´ clientes no treeview e cada cliente pode ter 3 forms, como eu

poderia saber o form ativo de cada cliente para quando sair dele e voltar nele depois ativar o form que já estava aberto?

obs.: eu tenho um treeview que é ligado a uma tabela, então no Onchange dele sempre sei na tabela qual o CD_CLiente ativo.. talves isso possa ajudar. E o nome do forms criados é sempre FrmCadastro+(CD_CLIENTE) por exemplo.

agradeco qq dica/sugestão/exemplo

abraço
Diogo.


Diogoalles

Diogoalles

Responder

Posts

28/04/2005

Ronaldo

Nao estou com o delphi aqui mas:


Cria um record
  type ListaNode = record
    node: TTreeNode;
    Tela: String; 


Cria uma matriz do tipo:

lista = array of ListaNode;

Cada vez que vc adicionar um node no treeview, adiciona tb na matriz.
Quando vc abrir uma tela para o node, procura ele na matriz e coloca o nome do formulário em ´Tela´.

Quando for abrir outra, é só verificar qual estava aberta em ´Tela´.


Responder

Gostei + 0

28/04/2005

Diogoalles

Ronaldo.. valeu mesmo... essa é a saída..
gostaria que vc desculpasse a minha ignorância, mas não trabalhei com arrays e record como vc especifiou .. só ouvi falar..

Então, criei o Type ListaNode e uma variavel lista = array of ListaNode.

agora apara adicionar poderia ser no evento Onaddition do treeview? pq neste momento tenho o codigo do cliente e tenho o nome do frm que foi criado. Isso eu cheguei a testar e estaria ok!
para adicionar arrays seria:
lista[i].node := node.selected;
lista[i].node := TblCliente.fieldbyname(´CD_CLIENTE´).text;
...
mas no caso como vou saber qual o valor de ´i´ ?
e como vou verificar se o cliente/form já foi adicionado?
como fazer para buscar?
existe um findkey? :roll: rsrs

valeu mesmo
abraço
Diogo


Responder

Gostei + 0

29/04/2005

Diogoalles

bom dia pessoal
como diz uma musica gaucha ´...passei a noite pensando, bebendo e tomando uns tragos..´, para mim ela foi adaptada e seria ´.. passei a noite acordado, programando sem nenhum resultado...´ hehehe

Deixando a brincadeira de lado, se alguem puder me dar uma ajuda em cima do que o Ronaldo propôs seria ótimo pq ñ tenho muita intimidade com esses Record e Arrays..


valeu
abraço
Diogo


Responder

Gostei + 0

29/04/2005

Ronaldo

Olá...

mas no caso como vou saber qual o valor de ´i´ ?


bem, em arrays desse tipo, voce deve primeiro mudar o tamanho do array, assim

setlength(listaNode, length(ListaNode)+1);

Já para adicionar:

lista[high(ListaNode)].node := node.selected;


e como vou verificar se o cliente/form já foi adicionado? 
como fazer para buscar? 
existe um findkey?  rsrs 



Não, nao tem um findkey,

Faça uma função para isso. O famoso For Next ja ajuda.


Ok?

Abraço.


Responder

Gostei + 0

29/04/2005

Diogoalles

Bem,
eu ja havia montado algo e agora não to conseguindo completar.. se puder me de uma maozinha...

Ao selecionar o Cliente eu executo o onclick do botão que cham o form de cadastro. Após eu tenho outros 2 botoes qeu chamam Pedidos e Produtos respectivamente.
Criei uma procedure que deverá receber como parametros o ´node´ e a ´tela´.
e dentro de cada botão eu passo o nome do form que está sendo criado e o treeview1.selected.

procedure TFormPrincipal.Verifica_Adiciona_Lista(Node:TTreeNode;Tela:String);
var
i : integer;
existe : boolean; // essa variável recebe True caso o Cliente ja esteja no treeview.
begin
ok := false;
// primeiro verifico se o array é diferente de Nil
if lista <> nil then
begin
{ após teria que fazer uma varredura para ver se o Cliente já está adicionado - o cliente está relacionado no treeview e é aqui um dos meus problemas }
// faço a varredura
for i := Low(lista) to High(lista)do
begin
{ aqui eu teria que verificar o Lista[i].Node e ver se ja está no tree, como ? }
// se encontrar ´existe := True´
end;
end;

// aqui verifica se se existe=true então altera a variavel Tela
if existe = true then
begin
// ai vou ter que fazer o loop de novo para encontrar o Cliente que ja existe, certo ?
// após altera a lista[x].Tela
end
else
begin
// aqui adiciona um novo


end;
end;

.... putz.. q coisa enrolada né??!!! :(

pode me dar uma forcinha?

valeu
Diogo


Responder

Gostei + 0

29/04/2005

Ronaldo

Bom, em primeiro lugar, evite fazer funções muito compridas.

Não misture assuntos, se vai fazer pesquisa, faça uma função para pesquisa.

Isso é só uma dica para o seu fonte ficar mais organizado e vc poder reutilizar as rotinas. :idea:

{ aqui eu teria que verificar o Lista[i].Node e ver se ja está no tree, como ? }


Compare normalmente, como uma variavel qualquer.
if Lista[i].Node = Node then



// ai vou ter que fazer o loop de novo para encontrar o Cliente que ja existe, certo ?

Você já descobriu a posição na matriz no laço anterior, agora é só verificar a tela :
if Lista[i].Tela = ´´ then



Ok?

Abraço.


Responder

Gostei + 0

29/04/2005

Diogoalles

ok Ronaldo..

consegui montar ´quase´ tudo
estou com problema no array.
se puder me esclareça.

estou declarando uma variavel global do form chamada lista = array of ListaNode;

em algum lugar tenho q definir o tamanho dela antes de começar a usar, certo? se sim, estou fazendo isso no Oncreate do form. SetLenght(lista,100).

ai estou com problema no adicionar um item sem apagar os que ja existem:

  TListaForms = record
    //TvNode : TTreeNode;
    CdPac : Integer;
    Frm   : String;
  end;


VAR
  Lista : Array of TListaForms;

implementation
...


procedure TFrmprincipal.Cliente_Frms(Cdcliente:Integer;Form:String);
var
  Adiciona,Existe : Boolean;
begin
  Adiciona := False;
  Existe   := False;

  if Lista <> nil then
  begin
    for i := Low(Lista) to high(Lista)do  // CORRETO ?
    begin
      if(Lista[i].Cdcliente = Tblcliente.FieldByName(´CD_CLIENTE´).Value)then
      begin
        // existe, então verifica se é necessário alterar o form ativo
        if not(Lista[i].Frm = Form)then
        begin
          // não é igual, altera o form ativo.
          ListaFrms[i].Frm := Form;
        end;
        Existe := True;
        Break;
      end;
      if Existe = False then
        Adiciona := True;
    end;
  end
  else
    Adiciona := True;

  // se não satisfez os itens acima, adiciona um record no array
  // A Q U I   E S T A   D A N D O   O   E R R O.
  if Adiciona = True then
  begin
    if ListaFrms <> nil then
      i := listafrms+1   // ISSO AQUI DEVE ESTAR ERRADO.. COMO SABER QUAL É O VALOR DE  ´i´  ??
    else
      i := 1;
        
    ListaFrms[i].CdPac := TblPac.FieldByName(´CD_PAC´).Value;
    ListaFrms[i].Frm   := Form;
  end;
end;


acima onde indiquei que ocorre o erro é que está o problema de saber qual o valor de ´i´.... ???

obrigado mais uma vez.

Diogo


Responder

Gostei + 0

29/04/2005

Diogoalles

:shock: corrigindo os codigos acima segue novamente eles abaixo:



  TListaForms = record 
    Cdcliente : Integer; 
    Frm         : String; 
  end; 


var 
  Lista : Array of TListaForms; 

implementation 
... 


procedure TFrmprincipal.Cliente_Frms(Cdcliente:Integer;Form:String); 
var 
  Adiciona,Existe : Boolean; 
begin 
  Adiciona := False; 
  Existe   := False; 

  if Lista <> nil then 
  begin 
    for i := Low(Lista) to high(Lista)do  // CORRETO ? 
    begin 
      if(Lista[i].Cdcliente = Tblcliente.FieldByName(´CD_CLIENTE´).Value)then 
      begin 
        // existe, então verifica se é necessário alterar o form ativo 
        if not(Lista[i].Frm = Form)then 
        begin 
          // não é igual, altera o form ativo. 
          ListaFrms[i].Frm := Form; 
        end; 
        Existe := True; 
        Break; 
      end; 
      if Existe = False then 
        Adiciona := True; 
    end; 
  end 
  else 
    Adiciona := True; 

  // se não satisfez os itens acima, adiciona um record no array 
  // A Q U I   E S T A   D A N D O   O   E R R O. 
  if Adiciona = True then 
  begin 
    if ListaFrms <> nil then 
      i := lista+1   // ISSO AQUI DEVE ESTAR ERRADO.. COMO SABER QUAL É O VALOR DE  ´i´  ?? 
    else 
      i := 1; 
        
    ListaFrms[i].Cdcliente := Tblcliente.FieldByName(´CD_CLIENTE´).Value; 
    ListaFrms[i].Frm   := Form; 
  end; 
end; 



Responder

Gostei + 0

29/04/2005

Ronaldo

i := lista+1 // ISSO AQUI DEVE ESTAR ERRADO.. COMO SABER QUAL É O VALOR DE ´i´ ??



setlength(Lista, length(Lista)+1);
i := High(Lista);

Ok?


Responder

Gostei + 0

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

Aceitar