IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

[Thread] Construction dynamique


Sujet :

Composants VCL Delphi

  1. #1
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut [Thread] Construction dynamique
    Dans un thread je crée dynamiquement plusieurs items dans un contener (JvCaptionPanel) qui lui même va se mettre dans un autre contener (ScrollBox).

    Le problème vient de l'assignation du parent des items qui vont se loger dans le conterner jvCaptionPanel. Le programme se bloque des que j'assigne un label au JvCaptionPanel.

    Ci-dessous le code de création des divers items :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    procedure CreateItems(sName : string);
    var
      jvcnPanel : TjvCaptionPanel;
      lblSource : TLabel;
      lblDest   : TLabel;
      lblEtat   : TLabel;
    begin
      jvcnPanel := TJvCaptionPanel.Create(frmMain.ScrollBox1);
      With jvcnPanel do
      begin
        Align := alTop;
        CaptionPosition := dpTop;
        Name := 'jvcn' + sName;
        OutlookLook := true;
        Height := 73;
        Parent := frmMain.ScrollBox1;
        Visible := True;
      end;
     
      lblSource := TLabel.Create(frmMain.ScrollBox1.findComponent('jvcn' + sName));
      With lblSource do
      begin
        Left := 8;
        Top := 32;
        Parent := TJvCaptionPanel(frmMain.ScrollBox1.findComponent('jvcn' + sName)); <<----- Bloque ici en pas à pas
        Visible := True;
      end;
     
      lblDest := TLabel.Create(frmMain.ScrollBox1.findComponent('jvcn' + sName));
      With lblDest do
      begin
        Top := 48;
        Left := 8;
        Parent := TJvCaptionPanel(frmMain.ScrollBox1.findComponent('jvcn' + sName));
        Visible := True;
      end;
     
      lblEtat := TLabel.Create(frmMain.ScrollBox1.findComponent('jvcn' + sName));
      With lblEtat do
      begin
        Top := 80;
        Left := 8;
        Name := 'ET' + sName;
        Parent := TJvCaptionPanel(frmMain.ScrollBox1.findComponent('jvcn' + sName));
        Visible := True;
      end;
      Application.ProcessMessages;
     
    end;
    Si quelqu'un voit d'où vient le problème, je lui en serais reconnaissant ^^

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Points : 47
    Points
    47
    Par défaut
    Comme tu as dit que tu créais tes items dans un thread, j'imagine que tu fais cela dans la méthode Execute du thread.

    Sauf si tu es certain que la méthode que tu utilises est thread-safe, il faut toujours passer par la méthode Synchronize de TThread.

    Ce qui veut dire que dans le Execute tu appelles Synchronize(FaireCeci), et dans la méthode FaireCeci, tu crées tes items.

    Cela permet de suspendre ton thread pendant que FaireCeci s'exécute dans le thread principal de l'application.

    Voilà.

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Ma procédure est dans une unite udefs.pas séparé du thread (uThread.pas)

    bon j'ai trouvé d'où venait le problème et j'ai fait quelques modifications :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    procedure CreateItems(sName : string);
    var
      jvcnPanel : TjvCaptionPanel;
      lblSource : TLabel;
      lblDest   : TLabel;
      lblEtat   : TLabel;
      Compo : TComponent;
    begin
      jvcnPanel := TJvCaptionPanel.Create(frmMain.ScrollBox1);
      With jvcnPanel do
      begin
        Align := alTop;
        CaptionPosition := dpTop;
        Name := 'jvcn' + sName;
        OutlookLook := true;
        Height := 80;
        Parent := frmMain.ScrollBox1;
        Caption := '';
        Resizable := False;
        Locked := True;
        Visible := True;
      end;
     
      Compo := TJvCaptionPanel(frmMain.ScrollBox1.findComponent('jvcn' + sName));
      lblSource := TLabel.Create(Compo);
      With lblSource do
      begin
        Left := 8;
        Top := 24;
        Name := 'ES' + sName; <<---- en rajoutant ça ca passe
        Parent := TJvCaptionPanel(Compo);
        Caption := '';
        Visible := True;
      end;
     
      lblDest := TLabel.Create(Compo);
      With lblDest do
      begin
        Top := 40;
        Left := 8;
        Name := 'ED' + sName; <<---- en rajoutant ça ca passe
        Parent := TJvCaptionPanel(Compo);
        Caption := '';
        Visible := True;
      end;
     
      lblEtat := TLabel.Create(Compo);
      With lblEtat do
      begin
        Top := 56;
        Left := 8;
        Name := 'ET' + sName;
        Parent := TJvCaptionPanel(Compo);
        Caption := '';
        Visible := True;
      end;
      Application.ProcessMessages;
     
    end;
    Sinon impossible de faire fonctionner le synchronize avec cette fonction (ce qui me créer quelques soucis d'affichage).
    Est ce que je dois créer une fonction/procedure dans le thread qui va appeler la fonction/procédure puis synchronizer cette fonction ?

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    C'est bon j'ai trouvé ma réponse la

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/01/2007, 17h25
  2. [XUL] Construction dynamique d'un template
    Par Christophe Charron dans le forum Autres langages pour le Web
    Réponses: 9
    Dernier message: 05/09/2006, 21h42
  3. [MySQL] Construction dynamique d'un "list treeview"
    Par kilanepa dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/03/2006, 17h09
  4. Construction dynamique
    Par rvzip64 dans le forum Langage
    Réponses: 9
    Dernier message: 23/10/2005, 11h23
  5. [JTree] Construction dynamique
    Par raj dans le forum Composants
    Réponses: 7
    Dernier message: 09/12/2004, 17h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo