PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum Lentidão ao Exibir itens de MainMenu em TreeView (método recursivo) Delphi #559486

21/07/2016

0

Lentidão ao exibir itens de MainMenu em TreeView (método recursivo)!!!

Tenho um processo similar, para não dizer igual, porém tem hora que esse carregamento se torna muito lento, leva questão de minutos até para carregar o EXE e ainda ocupa uma carga de utilização da CPU em 25% de cada núcleo e fica como se fosse travado. Nas andanças pela web encontrei esse post abaixo que identifica a utilização do meu processo lógico, sou um programador novo e por mais que debuguei o processo está correto, e no debug pude constatar que o demora está bem nessa função recursiva na hora de montar a TreeView

A minha pergunta é: O que poderia estar causando a lentidão , hora sim hora não?

E olha que minha estrutura dos Nodes não considero enorme, São 17 Nodes e no máximo os filhos tem uns 3 subníveis cada em média...


========================= Exemplo co m mesma lógica achada na web ==================
Fonte: http://maikelscheid.blogspot.com.br/2009/05/exibir-itens-de-mainmenu-em-treeview_06.html

Surgida a partir da necessidade de leitores do blog, onde possuem estruturas carregadas com submenus em vários níveis em suas aplicações, reformulei a estrutura do post anterior desta vez utilizando um método que será invocado de forma recursiva para cada item de menu que possuir submenus. Nesta nova estrutura, não haverá limitação de níveis para que os itens sejam exibidos no TreeView.

Baseado na estrutura do post anterior, iremos declarar a mesma procedure e realizar a implementação do código conforme segue:
procedure TForm1.PreencherMenus(Menu: TMainMenu);
{função chamada para adicionar itens ou subitens de forma recursiva}
procedure AdicionaSubItens(mS, mI : TMenuItem; n : TTreeNode);
var
j,p: integer;//j= usado no for - p= guarda posiçao
a,b,c2: string;//guarda valores de texto a serem adicionados na Tree
sn, x, y: TTreeNode;//guarda posiçoes de nós da TreeView
begin
for j := 0 to mI.Count - 1 do
begin
{pega os itens do submenu}
mS := mI.Items[j];
{titulos de itens/submenus}
a := mI.Caption;
b := mS.Caption;
p := pos('&',b);
if p > 0 then
Delete(b,p,1);
if b <> '-' then
begin
x := TreeView1.Items.AddChild(n,b);
end;

{verifica se o item tem sub-itens, e então entra em recursividade}
if mI.Items[j].Count > 0 then
begin
c2 := mS.Caption;
AdicionaSubItens(mS,mS,x);//função recursiva
end;
end;
end;
var
i,p: integer;//i= contador - p=posição
a: string;//caption dos menus principais
mI,mS: TMenuItem;//guarda posiçoes e itens do menu
n,sn: TTreeNode;//posições e itens da tree
begin
TreeView1.Items.Clear;
sn := nil;
for i := 0 to Menu.Items.Count - 1 do
begin
mI := Menu.Items[i];
a := mI.Caption; // Titulos do menus
p := pos('&',a);
if p > 0 then
Delete(a,p,1);
n := TreeView1.Items.Add(sn,a); //nó
{Chama a função recursiva para adiçao dos itens de menu}
AdicionaSubItens(mS,Mi,n);

end;
for I := 0 to TreeView1.Items.Count - 1 do
if TreeView1.Items[i].Level <> 0 then
TreeView1.Items[i].StateIndex := 1;
end;

Nesta nova estrutura agora temos uma procedure (AdicionaSubItens) que será chamada para adicionar os itens de menu, e dentro dela mesma, há uma verificação quanto a existência de subitens, e em caso afirmativo, ela fará uma nova chamada a si mesma, tornando-se assim recursiva.

Fonte: http://maikelscheid.blogspot.com.br/2009/05/exibir-itens-de-mainmenu-em-treeview_06.html
Anderson Gaitolini

Anderson Gaitolini

Responder

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

Aceitar