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

Langage Delphi Discussion :

[D6] Associer chaque item d'un StringList à un processus


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut [D6] Associer chaque item d'un StringList à un processus
    Bonjour à tous

    J'ajoute des items dans un stringlist de façon continue.

    À chaque ajout d'item, je veux y associer un timer et un webbrowser.
    C'est très simple. Mais mes connaissance en programmation objet sont trop limitées pour y arriver

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, OleCtrls, SHDocVw, StdCtrls;
     
    type
      tMonComposant=class
      public
          Info:string;
          GlobaleDispatch:IDispatch;
          Alarme:ttimer;
          Navigateur:twebbrowser;
          constructor create;
      end;
     
      TForm1 = class(TForm)
        Timer1: TTimer;
        WebBrowser1: TWebBrowser;
        Button1: TButton;
        Edit1: TEdit;
        procedure WebBrowser1DocumentComplete(Sender: TObject;
          const pDisp: IDispatch; var URL: OleVariant);
        procedure WebBrowser1NavigateComplete2(Sender: TObject;
          const pDisp: IDispatch; var URL: OleVariant);
        procedure Button1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    var MaitreListe:tstringlist;
     
    constructor tMonComposant.create;
    begin
        alarme:=ttimer.create(nil);
        alarme.Enabled:=false;
        alarme.Interval:=60000;
        Navigateur:=twebbrowser.Create(nil);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var Moncomposant:TMonComposant;
    begin
        MonComposant:=tMonComposant.create;
        MaitreListe.AddObject(Edit1.text,MonComposant);
        MonComposant.alarme.OnTimer:=Timer1Timer;
        Moncomposant.Navigateur.OnDocumentComplete:=WebBrowser1DocumentComplete;
        Moncomposant.Navigateur.OnNavigateComplete2:=WebBrowser1NavigateComplete2;
        MonComposant.Navigateur.Navigate(Edit1.text);
    end;
     
    procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    begin
        if pdisp<>MonComposant.GlobaleDispatch then exit;//Comment faire savoir qui est Moncomposant
        //... divers traitement
        MonComposant.Alarme.Enabled:=true;
    end;
     
    procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    begin
        MonComposant.globaleDispatch:=pDisp;             //Idem
    end;
     
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
       MonComposant.Navigateur.Refresh2;                 //Idem
    end;
     
    ... 
     
    end.
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    le plus simple est de déporter le OnTimer dans TMonComposant

    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
     
    tMonComposant=class
      public
          Info:string;
          GlobaleDispatch:IDispatch;
          Alarme:ttimer;
          Navigateur:twebbrowser;
          constructor create;
          procedure OnTimer(Sender: TObject);
      end;
     
    constructor tMonComposant.create;
    begin
        alarme:=ttimer.create(nil);
        alarme.OnTimer := OnTimer; // procédure locale à TMonComposant
        alarme.Enabled:=false;
        alarme.Interval:=60000;
        Navigateur:=twebbrowser.Create(nil);
    end;
     
    procedure tMonComposant.OnTimer;
    begin
     // nous sommes bien dans le TMonComposant
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Merci beaucoup Paul !!!

    Mais, je comprend pas... (voir dans le code s'il-te-plaît)

    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
    tMonComposant=class
      public
          Info:string;
          GlobaleDispatch:IDispatch;
          Alarme:ttimer;
          Navigateur:twebbrowser;
          constructor create;
          procedure OnTimer(Sender: TObject);
          procedure OnDocumentComplete(Sender: TObject);//On déporte aussi ces deux procédures (je suppose)
          procedure OnNavigateComplete2(Sender: TObject);
      end;
    
    constructor tMonComposant.create;
    begin
        alarme:=ttimer.create(nil);
        alarme.OnTimer := OnTimer; //Là je comprend pas, le système (windows/ordinateur) déclenche un évènement via le alarme.Ontimer, 
                                              //mais on lui affecte, un "Ontimer" externe sans évènement en provenance de la machine...
        alarme.Enabled:=false;
        alarme.Interval:=60000;
        Navigateur:=twebbrowser.Create(nil);
        Navigateur.OnDocumentComplete:=OnDocumentComplete;//Je répète la même chose que ci-haut, mais je ne saisi toujours pas l'essence
        Navigateur.OnNavigateComplete2:=OnNavigateComplete2;//
    end;
    
    procedure tMonComposant.OnTimer;
    begin
     // nous sommes bien dans le TMonComposant
    //Oui mais d'où proviendra l'évènement?
    end;

    Merci encore

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    c'est pourtant exactement la même chose que ce que tu fais dans ton code (au nom de la fonction près)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      MonComposant.alarme.OnTimer:=Timer1Timer;
    vu le nom j'imagine que tu as créé Timer1Timer en plaçant un Timer sur la fiche et en double cliquant sur sa propriété OnTimer...mais tu aurais pu la déclarer toi même ça ne changeait rien au fonctionnement.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Merci Paul

    Comme je disais, je suis très très limité en connaissance de la programmation objet.

    Si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var a,b:integer;
     
    A:=B; //Je m'attend a ce que le contenue de B soit copier dans le réceptacle(cases mémoires) de A;
    Là si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alarme.OnTimer := OnTimer;
    Contrairement à l'exemple avec des entiers, je devrais plutôt m'attendre à ce que le réceptacle(cases Mémoires) OnTimer contienne l'adresse de la procédure alarme.OnTimer. Est-ce bien ça?

    Merci encore

    P.s.

    À moins que ça veuille plutôt dire quand le système déclenchera l'évènement de tMonComposant.alarme.Ontimer, alors exécute tMonComposant.Ontimer?

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    la propriété OnTimer du Timer contient en effet l'adresse de la méthode OnTimer de l'instance en cours de TMonComposant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      c: TmonComposant;
    begin
      c := TMonComposant.Create;
    // on obtient c.Alarme.OnTimer = c.OnTimer
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Est-ce que ça veut donc dire que quand le système déclenchera l'évènement de tMonComposant.alarme.Ontimer, alors il exécutera tMonComposant.Ontimer ?

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par sgmsg Voir le message
    Est-ce que ça veut donc dire que quand le système déclenchera l'évènement de tMonComposant.alarme.Ontimer, alors il exécutera tMonComposant.Ontimer ?
    oui, c'est le but, au lieu d'être dans la fiche, tu es directement dans le TMonComposant associé au timer.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Merci beaucoup!!!

    Super champion!

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut [D6] Associer chaque item d'un StringList à un processus LA SUITE. . .
    Bonjour a tous

    C'est la suite du message de hier.

    Tout compile il n'y a pas d'erreur.

    Toutefois. Si en faisant une requête webbrowser par la fiche, ça fonctionne (évidement). Mais par le composant, hormis la création, tout est mort: jamais OnDocumentComplete est déclenché .

    C'est le code complet, il faut déposer un bouton, un edit, un webbrowser sur la fiche
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, OleCtrls, SHDocVw, StdCtrls, es_boty;
     
    type
      tMonComposant=class
      public
          Info:string;
          Alarme:ttimer;
          Navigateur:twebbrowser;
          constructor create(Parametres:string);
          destructor destroy;override;
          procedure OnTimer(Sender: TObject);
          procedure OnDocumentComplete(Sender: TObject;const pDisp: IDispatch; var URL: OleVariant);
      end;
     
     
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        WebBrowser1: TWebBrowser;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure WebBrowser1DocumentComplete(Sender: TObject;
          const pDisp: IDispatch; var URL: OleVariant);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    var MaitreListe:tstringlist;
     
    destructor tMonComposant.destroy;
    begin
        alarme.free;
        Navigateur.free;
    end;
     
    constructor tMonComposant.create(Parametres:string);
    begin
        alarme:=ttimer.create(nil);
        alarme.Enabled:=false;
        alarme.Interval:=60000;
        alarme.OnTimer:=OnTimer;
        Navigateur:=twebbrowser.Create(nil);
        Navigateur.OnDocumentComplete:=OnDocumentComplete;
        Navigateur.Navigate(Parametres);
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    var i:integer;
    begin
        for i:=0 to MaitreListe.count-1 do
            MaitreListe.Objects[i].Free;
         maitreliste.Free;
    end;
    procedure tMonComposant.OnTimer(Sender: TObject);
    begin
        if Navigateur.Busy then Navigateur.Stop;
        Navigateur.Refresh2;
    end;
    procedure tMonComposant.OnDocumentComplete(Sender: TObject;const pDisp: IDispatch; var URL: OleVariant);
    begin
        if pDisp <> TWebBrowser(Sender).ControlInterface then exit;
        showmessage('Composant Ok!');
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
          maitreListe:=tstringlist.create;
          edit1.Text:='www.google.com';
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var Moncomposant:TMonComposant;
    begin
        MonComposant:=tMonComposant.create(Edit1.text);
        MaitreListe.AddObject(edit1.text,MonComposant);
        webbrowser1.Navigate(edit1.text);
    end;
     
    procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    begin
      if pDisp <> TWebBrowser(Sender).ControlInterface then exit;
      showmessage('Fiche Ok!');
    end;
     
    end.
    Merci d'avance

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Il faut associer le navigateur à la fiche

    Tirer de www.swissdelphicenter.ch

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button1Click(Sender: TObject);
    var Moncomposant:TMonComposant;
    begin
        MonComposant:=tMonComposant.create(Edit1.text);
        tWinControl(MonComposant.Navigateur).Name:='google';//pas de points, ou autres caractères exotiques 
        tWinControl(MonComposant.Navigateur).Parent:=Form1;
        ...
    end;
    Maintenant, on sait quoi faire,
    Mais pas pourquoi...

    Merci à tous

  12. #12
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Le Parent d'un composant est celui responsable de son affichage, d'où la nécessité de le renseigner.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/01/2015, 14h23
  2. Treeview: associé un objet à chaque Item ?
    Par TSalm dans le forum Framework .NET
    Réponses: 2
    Dernier message: 29/10/2007, 16h57
  3. Réponses: 3
    Dernier message: 27/11/2006, 15h50
  4. Avoir une valeur associé à chaque item d'un TComboBox
    Par dimdidi dans le forum Composants VCL
    Réponses: 10
    Dernier message: 10/03/2006, 09h15
  5. [TMenuItem] Comment ajouter un icone à chaque Item créé ?
    Par aliwassem dans le forum Composants VCL
    Réponses: 1
    Dernier message: 16/06/2005, 23h41

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