Construction menu dans un thread
Bonjour,
Je suis sur un petit projet composé d'un client delphi et d'une appli php.
Le client à besoin de construire une partie de son menu en requetant l'appli php, pour afficher des liens web définis dans le portail php.
Le client recupere un flux xml de l'appli php, et le parse pour créer son menu, jusqu'a present je faisais ça au lancement du client, mais si le serveur web est long à repondre cela "bloque" l'appli.
J'ai donc voulu faire ça dans un thread, en suivant la faq delphi.
Je bloque sur l'ajout de l'item dans le menu qui me génere une violation d'accés....
voici la partie de création du menu:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
for j:=0 to xmldoc.ChildNodes.Nodes[I].ChildNodes.Count-1 do
begin
if xmldoc.ChildNodes.Nodes[I].ChildNodes.nodes[j].nodename='link' then
begin
//construit l'item menu lien web
ItemMenu:=TMenuItem.Create(Application);
ItemMenu.Caption:=xmldoc.ChildNodes.Nodes[I].ChildNodes.nodes[j].AttributeNodes['name'].text;
ItemMenu.Hint:=xmldoc.ChildNodes.Nodes[I].ChildNodes.nodes[j].AttributeNodes['url'].text;
ItemMenu.OnClick:=FicMain.Link_Browser;
ficmain.Menu_links.Insert(ficmain.Menu_links.Count,ItemMenu);// <= violation d'accés
ficmain.Menu_main.MenuAdded;
end;
end; |
Apparement quand on touche a un objet vcl il faut sortir le code qui le modifie dans une methode appelée par synchronise, donc j'ai tenté :
Code:
1 2 3 4 5 6 7 8 9
|
procedure MenuThread.Updatemenu;
var
ficmain:Tf_main;
begin
ficmain.Menu_links.Insert(ficmain.Menu_links.Count,ItemMenu_org);
ficmain.Menu_main.MenuAdded;
end; |
et remplacé les lignes
Code:
1 2 3
|
ficmain.Menu_links.Insert(ficmain.Menu_links.Count,ItemMenu);
ficmain.Menu_main.MenuAdded; |
par Synchronize(Updatemenu) (ItemMenu_org est une variable de la classe du thread, que j'initialise avec ItemMenu avant d'apeller le Synchronize).
Donc si quelqu'un peut m'aiguiller merci beaucoup, je suis aussi preneur d'une eventuelle solution plus adapté à cette problematique de creation du menu au lancement ;)
merci d'avance.