Fórum Relacionar forms com um TreeView #279411
28/04/2005
0
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
Curtir tópico
+ 0Posts
28/04/2005
Ronaldo
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´.
Gostei + 0
28/04/2005
Diogoalles
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
Gostei + 0
29/04/2005
Diogoalles
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
Gostei + 0
29/04/2005
Ronaldo
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.
Gostei + 0
29/04/2005
Diogoalles
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
Gostei + 0
29/04/2005
Ronaldo
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:
Compare normalmente, como uma variavel qualquer.
if Lista[i].Node = Node then
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.
Gostei + 0
29/04/2005
Diogoalles
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
Gostei + 0
29/04/2005
Diogoalles
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;
Gostei + 0
29/04/2005
Ronaldo
setlength(Lista, length(Lista)+1);
i := High(Lista);
Ok?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)