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 :

Gestion d'évènements sans TForm


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Gestion d'évènements sans TForm
    Bonjour,

    Je cherche depuis plusieurs heures sur le forum ^^, avec la fonctione rechercher mais quand on sait pas quoi rechercher ca aide pas .

    Je veux faire une application sans aucune interface graphique juste un exe en mémoire mais je n'arrive pas du tout a utiliser les evenements et tout ca pour que le programme continu de tourner et pas ce lancer faire deux trucs puis quitter.

    Je veux utiliser un composant IRC mais c'est composant doivent avoir des evenements associés.

    Si quelqu'un pouvait m'aider a gérer ce probleme, car quand c'est dans une form aucune soucis mais des qu'il ne doit plus y avoir de Form ca devient beaucoup plus compliqué a gerer.

    Merci beaucoup

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Comment ajouter un évènement à un composant créé dynamiquement ?

    Pour continuer de tourner sans s'arrêter, fais une boucle couplée à une variable de contrôle de fin de programme et un Sleep :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
      ProgramTerminated: Boolean = False;
     
    begin
      CreateComponents;
      try
        while not ProgramTerminated do
          Sleep(5000);
      finally
        FreeComponents;
      end;
    end.
    L'utilisation d'un DataModule est également une idée judicieuse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DataModule := TMainDataModule.Create(nil);
    try
      while not DataModule.Terminated do
        Sleep(5000);
    finally
      DataModule.Free;
    end;
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour ta réponse mais comment faire pour avoir un traitement spontanée par IRC ? (Je dois utiliser un thread ? et les evenement se declencheront?) car si il ya 5 secondes de batements a chaques fois :S

    Merci beaucoup Je vais continuer a me documenter

  4. #4
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Peux-tu montrer le code que tu as produit stp ? Je pense que tu as dû mal interpréter ce que je voulais dire... Mais je ne vois pas comment le ré-expliquer autrement : il sera plus facile de t'indiquer dans ton code ce qui ne va pas.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Et tout simplement creer un composant TapplicationEvent dynamique avec un parent à nil ca devrais marcher non ?

    Ensuite ya plus qu'a affecter dynamiquement les gestionaires aux evenements .... notment le "OnMessage".

    Ensuite il est question de surcharge de wndproc, qui existe pour les classes, dont je crois qu'il existe une version "procedure" pour l'entree generale de l'application.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  6. #6
    Futur Membre du Club
    Inscrit en
    Août 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Merci vous deux pour vos aides, voila je viens d'écrire un debut mais ca marche pas (normal ^^)

    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
     
    program Project1;
     
    uses
      SysUtils, AppEvnts, Classes;
     
    type
       TMainObject = class(TComponent)
          ApplicationEvent: TApplicationEvents;
          private
             procedure idle;
          public
             constructor Create; reintroduce;
             destructor Destroy; reintroduce;
       end;
     
    procedure TMainObject.idle;
    begin
       sleep(500);
    end;
     
    constructor TMainObject.Create;
    begin
       ApplicationEvent := TApplicationEvents.Create(self);
       ApplicationEvent.OnIdle = idle;
    end;
     
    destructor TMainObject.Destroy;
    begin
       ApplicationEvent.Free;
    end;
     
    begin
       TMainObject.Create;
    end.

  7. #7
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    OnIdle est au moins une fonvtion de type : Procedure(Sender : TObject; Done : Boolean) of Object.

    Il te manque donc le parametre "sender" a ta fonction ....

    Autre chose : L'application boucle sur le tableau d'evenement, piochant le premier evenement, le traite et passe au suivant.
    Quand la table est vide, il appelle OnIdle. Si le parametre Done est a false, il boucle sur cet appel tant que la table d'evenement est vide sinon attends qu'un evenement arrive.

    Faire un sleep(500) dans ce gestionaire d'evenement a pour effet que le temps d'execution de cet evenement sera de 500ms.

    Le systeme ne reprenant la main qu'apres l'evenement traité, il ne pourra continuer sa boucle et traiter d'autres evenements qu'apres les 500ms d'execution de l'evenement OnIdle ....
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    J'ai pas vu mais ce n'ets pas le mot clef "reintroduce" mais "override" qui est necessaire pour le destructor .... Quand au Constructor, soit on met rien (redefinition) soit on met "Virtual" pour permettre uen surcharge ulterieure.

    "Reintroduce" est tres rarement utilisé.

    Je te conseille de faire un petit tour sur l'aide et les tutos au sujet de la surcharge/redefinition des methodes (virtual/override/reintroduce/abstract/overload) et eventuelement de revenir poster des question pour preciser certains points
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  9. #9
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    c'est à peut prés comme une application serveur non?
    le meilleur composant delphi qi peut te donnée une idée c'est TTimer:
    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
    { TTimer }
    
    constructor TTimer.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FEnabled := True;
      FInterval := 1000;
      FWindowHandle := Classes.AllocateHWnd(WndProc);end;
    
    destructor TTimer.Destroy;
    begin
      FEnabled := False;
      UpdateTimer;
      Classes.DeallocateHWnd(FWindowHandle);
      inherited Destroy;
    end;
    
    procedure TTimer.WndProc(var Msg: TMessage);
    begin
      with Msg do
        if Msg = WM_TIMER then
          try
            Timer;
          except
            Application.HandleException(Self);
          end
        else
          Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
    end;
    aussi tu peut voir le code source de wsocket de ICS
    en plus voir cotée C, il peut te donnée une idée
    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
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
     	// TODO: Place code here.
    	MSG msg;
    	HACCEL hAccelTable;
    
    	// Initialize global strings
    	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    	LoadString(hInstance, IDC_FGG, szWindowClass, MAX_LOADSTRING);
    	MyRegisterClass(hInstance);
    
    	// Perform application initialization:
    	if (!InitInstance (hInstance, nCmdShow)) 
    	{
    		return FALSE;
    	}
    
    	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_FGG);
    
    	// Main message loop:
    	while (GetMessage(&msg, NULL, 0, 0)) 
    	{
    		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    	}
    	return msg.wParam;
    }
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  10. #10
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Anoter que si il adapte le composant TTimer a son cas, il va en fait creer un derivé de TComponent pour avoir acces a wndProc, qu'il va surcharger afin de reperer les evenements executer des gestionaires d'evenement au prealablement crée pour executer les traitements associés.

    En gros, il refait un TApplicationEvent
    Jetter un coup d'oeil aux sources du TApplicationEvent t'apprendra pas mal de choses
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 449
    Points : 24 856
    Points
    24 856
    Par défaut
    Pour le override, il faut conserver les mêmes paramètres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    constructor Create(AOwner: TComponent); override;
    le reintroduce est une nouveauté de Delphi6, avant cela ne faisait rien, cela retire juste un warning en fait qui fut inventé au même moment (en D3 cela n'était pas possible c'est pour cela que l'on a CreateNew avec Dummy, en D4/5 possible mais pouvait porter à confusion lié au problème des méthodes statiques ou virtuelles),

    reintroduce permet de déclarer une méthode redéfinie (overload) et surchargé (override), avec des paramètres différents quand celle-ci est déjà virtuel, en fait, c'est une sorte de overload retro-actif + override

    Sinon, le plus simple reste une MainForm avec ShowMainForm a false, avec les composants TCP IP posé sur la Form

    Pour info, il suffit de remplacer la boucle RUN du Application, par une boucle tient cela donnerait ceci

    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
    program KeepMasterSortServer;
     
    uses
      Forms; // cela déclenche tout un ensemble de initialization dont celle Controls qui instancie un TApplication, ce qui peut faciliter la créate de Handle de Processus.
     
    var
      RepeatTerminated: Boolean = False;
     
    begin
      Application.Initialize;
     
      AddExitProc(DoneApplication);
      repeat
        try
          if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
          begin
            TranslateMessage(Msg);
            DispatchMessage(Msg);
     
            case Msg.Message of
              WM_QUIT : RepeatTerminated := True;
              WM_MACHIN : FaireBidule;
            end; 
          end;
        except
          HandleException(Self);
        end;
      until RepeatTerminated;
    end.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon, le plus simple reste une MainForm avec ShowMainForm a false, avec les composants TCP IP posé sur la Form
    [/CODE]
    c'est ce que je fait moi, mais avec Application.ShowMainForm
    Pour cacher la fiche principale au démarrage, définissez ShowMainForm à False dans le fichier principal du projet avant l'appel de Application.Run. Assurez-vous que la propriété Visible de la fiche est aussi à False.
    si tu utlise des composant DB, mieux d'utlisé un TForm, sa pas grand impacte sur la taille de votre exe, essaye simplement d'utilisé le minimaum de composant tiérce
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 449
    Points : 24 856
    Points
    24 856
    Par défaut
    Sinon, le DataModule est fait pour cela aussi !
    Mais comme ce n'est pas une forme, cela ne fait pas durer la boucle du Run ...

    sinon, il y a aussi l'application console, ou le service windows, conçu pour ce type de fonctionnement ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Gestion d'événements sans interface graphique
    Par Marie Br dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 21/07/2014, 18h03
  2. Problème avec la gestion des événements
    Par CynO dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 10h07
  3. [JTable] gestion des événements
    Par soulhouf dans le forum Composants
    Réponses: 4
    Dernier message: 19/08/2005, 13h21
  4. Gestion des évènements lors d'un clique sur une image.
    Par yoghisan dans le forum Débuter
    Réponses: 7
    Dernier message: 23/06/2005, 19h04
  5. Gestion d'événements hors tables
    Par Quentin dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 11/02/2005, 00h09

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