Clicar no treeview e abrir um item relacionado no menu

Delphi

26/04/2004

Tenho uma rotina para ´jogar´ os item de um MainMenu para um treeview, tudo em tempo de execução. O que eu quero fazer é algo parecido com o programa da receita federal, você seleciona um item do treeview e abre o formulário correspondente, que já foi declarado num item do MainMenu.

Obrigado


Tchoninho

Tchoninho

Curtidas 0

Respostas

Motta

Motta

26/04/2004

Use o método AddObjects ao invés de simplesmente Add para criar os TTreeNodes, assim vc cria um vinculo com o Menu

AddObjects permite vincular o Node a um objeto, passe o Item de menu neste caso

No evento OnChanching do TreeView faça

TMeNuItem(Node.Data).Click(Nil);

Faça algo parecido, mas não chamo um form, não testei mas creio que funciona...

vide o help para mais detalhes


GOSTEI 0
Tchoninho

Tchoninho

26/04/2004

Mota,

Tentei mas não deu certo, o código:
TMeNuItem(Node.Data).Click(Nil);
fica causando erro de violação de acesso.

Se possível me passe parte do código fonte para que eu teste.


Obrigado.


GOSTEI 0
Motta

Motta

26/04/2004

publica o codigo todo


GOSTEI 0
Tchoninho

Tchoninho

26/04/2004

Segue o código:

//  z é uma variavel púlica
z:pointer;

procedure TForm1.AualizaTree(tv: TTreeView; fMenuPrinc: TMainMenu;
  fMenu: TMenu);
var i,j,posic:integer;
    a,b: string;
    mI,mS: TMenuItem;
    n,tn: TTreeNode;
begin
  tv.Items.Clear;
  tn := nil;
  tn := tv.Items.AddObjectFirst(tn,´Menus liberados´,z);
  for i := 0 to fMenuPrinc.Items.Count - 1 do begin
    mI := fMenu.Items[i];
    a := mI.Caption;
    posic := pos(´&´,a);
    if posic > 0 then
      Delete(a,posic,1);
    n := tv.Items.AddObject(tn,a,z);
    for j := 0 to mI.Count - 1 do begin
      mS := mI.Items[j];
      b := mS.Caption;
      posic := pos(´&´,b);
      if posic > 0 then
        Delete(b,posic,1);
      if b <> ´-´ then
        tv.Items.AddObject(n,b,z)
      end;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 AtualizaTree(treeview1,form1.mmenu1,form1.Menu);
end;

procedure TForm1.sobre1Click(Sender: TObject);
begin
  showmessage(´teste treeview e mainmenu´);
end;

procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode;   var AllowChange: Boolean);
begin
  z:=tmenuitem(node.Data);

end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Tmenuitem(z).Click;
end;



GOSTEI 0
Motta

Motta

26/04/2004

troque z pelo proprio Item de menu

...
mI := fMenu.Items[i];
a := mI.Caption;
posic := pos(´&´,a);
if posic > 0 then
Delete(a,posic,1);
n := tv.Items.AddObject(tn,a,fMenu.Items[i]);
...


procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode; var AllowChange: Boolean);
begin
if assigened(node.Data) then
tmenuitem(node.Data).OnClick;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
//
end;


GOSTEI 0
Tchoninho

Tchoninho

26/04/2004

Motta, não compilou por causa desde comando:

[color=red:00bc0566f1]..if assigened(node.Data) then ..[/color:00bc0566f1]


O delphi não o reconhece.

procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode; var AllowChange: Boolean); 
begin 
if assigened(node.Data) then 
tmenuitem(node.Data).OnClick; 
end; 



GOSTEI 0
Motta

Motta

26/04/2004

if assigned(node.Data) then



fazer as coisas no bloco di notas ....


GOSTEI 0
Tchoninho

Tchoninho

26/04/2004

Cara compilou legal mas quando clico no treeview não executa o que esta relacionado no menu;
O código esta abaixo:

[color=darkblue:763bb5ca9f]
procedure TForm1.AtualizaTree(tv: TTreeView; fMenuPrinc: TMainMenu;
  fMenu: TMenu);
 var i,j,posic:integer;
    a,b: string;
    mI,mS: TMenuItem;
    n,tn: TTreeNode;
begin
  tv.Items.Clear;
  i:=0;
  tn := nil;
//  tn := tv.Items.AddChildObjectFirst(tn,´Menus liberados´,fMenu.Items[i]);
  for i := 0 to fMenuPrinc.Items.Count - 1 do begin
    mI := fMenu.Items[i];
    a := mI.Caption;
    posic := pos(´&´,a);
    if posic > 0 then
      Delete(a,posic,1);
    n := tv.Items.AddChildObject(tn,a,fmenu.items[i]);
    for j := 0 to mI.Count - 1 do begin
      mS := mI.Items[j];
      b := mS.Caption;
      posic := pos(´&´,b);
      if posic > 0 then
        Delete(b,posic,1);
      if b <> ´-´ then
        tv.Items.AddChildObject(n,b,fmenu.items[i]);
      end;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
AtualizaTree(treeview1,form1.mainmenu1,form1.Menu);
end;

procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode;
  var AllowChange: Boolean);
begin
if assigned(node.Data) then
tmenuitem(node.Data).Click;
end;

procedure TForm1.web1Click(Sender: TObject);
begin
  showmessage(´vc clicou em web ´);
end;

procedure TForm1.Colar1Click(Sender: TObject);
begin
  showmessage(´vc clicou em colar´);
end;

procedure TForm1.Abrir1Click(Sender: TObject);
begin
  showmessage(´vc clicou em abrir´);
end;

procedure TForm1.Fechar1Click(Sender: TObject);
begin
  showmessage(´vc clicou em fechar´);
end;

end.
[/color:763bb5ca9f]


GOSTEI 0
Motta

Motta

26/04/2004

procedure TForm1.AtualizaTree(tv: TTreeView; fMenuPrinc: TMainMenu;
fMenu: TMenu);
var i,j,posic:integer;
a,b: string;
mI,mS: TMenuItem;
n,tn: TTreeNode;
begin
tv.Items.Clear;
i:=0;
tn := nil;
// tn := tv.Items.AddChildObjectFirst(tn,´Menus liberados´,fMenu.Items[i]);
for i := 0 to fMenuPrinc.Items.Count - 1 do begin
mI := fMenu.Items[i];
a := mI.Caption;
posic := pos(´&´,a);
if posic > 0 then
Delete(a,posic,1);
n := tv.Items.AddChildObject(tn,a,fmenu.items[i]);
for j := 0 to mI.Count - 1 do begin
mS := mI.Items[j];
b := mS.Caption;
posic := pos(´&´,b);
if posic > 0 then
Delete(b,posic,1);
if b <> ´-´ then
tv.Items.AddChildObject(n,b,mI.Items[j]); // <<== aqui vc guarda o objeto que tem a lógica
end;
end;
end;


GOSTEI 0
POSTAR