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 :

Question sur Mutex et pour" Send Data To Previous Instance"


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2013
    Messages : 20
    Par défaut Question sur Mutex et pour" Send Data To Previous Instance"
    Salut à tous

    Voilà je vous detail mon probleme:

    L'utilisateur clique sur un bouton de Surpervision et ça execute mon appli si elle etait en arrière plan elle viens en premier plan
    si elle n'existe pas elle se s'ouvre n'ormalement

    et je voudrais que si elle est en en arrière plan au moment du click de la Surpervision actualiser des champs TdateTime.
    j'ai testé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    initialization
      // prüfen ob Programm schon läuft
      mHandle := CreateMutex(nil, True, 'Kurve_kxz5t79');
      // Anwendung läuft bereits
      if GetLastError = ERROR_ALREADY_EXISTS then
        begin
         // MessageBox(0, 'Kurve laeuft bereits.', 'Programmstart verweigert.', 16);
    
          THauptBild1.AufrufenProgramm('ChargenDokumentation');  
          Halt(muHALT_ALLREADY_RUNS);
          Form1.DateTimePicker:=now;
        end;
    et ça
    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
    program Kurve;
    uses
      Forms,
      Windows,
      SysUtils,
      VSKDataBase in 'VSKDataBase.pas',
      Logger in 'Logger.pas',
      gfc in 'gfc.pas',
      Global in 'Global.pas',
      HmProcessusDuration in 'HmProcessusDuration.pas',
      Kurve_Rost in 'Kurve_Rost.pas' {Form_Kurve_Rost_Show},
      Tabelle_Rost in 'Tabelle_Rost.pas' {Form_Tabelle_Rost},
      LpRost in 'LpRost.pas',
      FormSuchenUnterTeilnummer in 'FormSuchenUnterTeilnummer.pas' {Form_SuchenUnterTeilnummer},
      FormStartBild in 'FormStartBild.pas' {Form_StartBild},
      FormSuchenUnterStoerung in 'FormSuchenUnterStoerung.pas' {Form_SuchenUnterStoerung},
      Login in 'Login.pas' {LoginForm},
      ParameterDiffusions in 'ParameterDiffusions.pas' {Form_ParameterDiffusions},
      KurveDiffusions in 'KurveDiffusions.pas' {Form_KurveDiffusions},
      DiffusionsRechnen in 'DiffusionsRechnen.pas',
      LpModelAnlage in 'LpModelAnlage.pas',
      KurveProzess in 'KurveProzess.pas' {FormKurveProzess},
      PopupRostKurve in 'PopupRostKurve.pas' {FormPopupRostKurve},
      reinit in 'reinit.pas',
      FormAnlage_Belegung in 'FormAnlage_Belegung.pas' {Form_AnlageBelegung},
      FormOfenbuch in 'FormOfenbuch.pas' {Form_Ofenbuch},
      HauptBild in 'HauptBild.pas' {HauptBild1},
      ShellAPI,
      advgrid in 'advgrid.pas';
    
    {$R *.res}
    
    begin
    
    
      //ReportMemoryLeaksOnShutdown := (DebugHook <> 0);
      if IsPrevInstance = 0 then  begin
        Application.Initialize;
        Application.CreateForm(THauptBild1, HauptBild1);
        Application.CreateForm(TFormPopupRostKurve, FormPopupRostKurve);
        Application.CreateForm(TForm_Kurve_Rost_Show, Form_Kurve_Rost_Show);
        Application.CreateForm(TForm_Tabelle_Rost, Form_Tabelle_Rost);
        Application.CreateForm(TForm_SuchenUnterTeilnummer, Form_SuchenUnterTeilnummer);
        Application.CreateForm(TForm_SuchenUnterStoerung, Form_SuchenUnterStoerung);
        Application.CreateForm(TLoginForm, LoginForm);
        Application.CreateForm(TForm_ParameterDiffusions, Form_ParameterDiffusions);
        Application.CreateForm(TForm_KurveDiffusions, Form_KurveDiffusions);
        Application.CreateForm(TFormKurveProzess, FormKurveProzess);
        Application.CreateForm(TForm_AnlageBelegung, Form_AnlageBelegung);
        Application.CreateForm(TForm_Ofenbuch, Form_Ofenbuch);
        Application.CreateForm(TForm_StartBild, Form_StartBild);
        Form_StartBild.ImageSprache1Click(nil);
        Application.Run;
      end
      else begin
    
         AfficherInstance(IsPrevInstance);
         
        //SendDataToPreviousInstance ;
        Form1.DateTimePicker:=now;
      end;
    
    end.

    mais ça plante car non assigné

    Y a t'il un autre moyen de communiquer avec une appli (autre que les Messages vu que depuis la supervision je ne peut envoyer de Message)

    Merci d'avance
    Nicolas
    Cdlt

  2. #2
    Membre expérimenté
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2014
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Décembre 2014
    Messages : 111
    Par défaut
    Salut,
    Ben moi je virerais ton Form1.DateTimePicker:=now; de l' initialization
    et le mettrais dans l'évènement OnActivate de ta Form1. Ainsi à chaque lancement "et" à chaque activation ton DateTimePicker sera à jour.
    Tcho.
    soilog

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 932
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 932
    Par défaut
    C'est à la deuxième instance d'envoyer une notification à la première avant de s'arrêter.

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2013
    Messages : 20
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    C'est à la deuxième instance d'envoyer une notification à la première avant de s'arrêter.
    Oui c'est bien ce que que je voudrais faire.

    Mais comment faire est-ce possible?
    J'ai pensé qu'à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.DateTimePicker:=now;
    Faire un sendmessage ou un postmessage de la 2eme vers la premiere

  5. #5
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Bonsoir.

    Voici comment j'avais fait (Delphi7 sous Windows) pour un programme nommé "FiboNotes".
    Si on tente d'ouvrir une deuxième instance de l'application, envoi d'un message à l'application déjà active réceptionné dans la procedure DefaultHander. Si ma mémoire est bonne, il faut déclarer l'unité ShellApi.

    Code dans l'unité de Form1 :

    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
    TForm1 = class(TForm)
    //...
    public
          procedure DefaultHandler(var Msg); override; 
    end;
     
    var
        Form1: TForm1;
        FIBONOTES_APPLICATION_RESTORE : cardinal; 
     
    implementation
     
    procedure TForm1.DefaultHandler;
    // restore l'application si 2° appel de l'application
    begin
       inherited DefaultHandler(Msg);
       if TMessage(Msg).Msg= FIBONOTES_APPLICATION_RESTORE then
       begin
          if not Application.Active then Application.Restore;
          Application.BringToFront;
         // mettre ici la réinitialisation de DateTime
       end;
    end;
    Le code dans le fichier programme (obligation de passer par "RegisterWindowMessage" pour pouvoir utiliser le message HWND_BROADCAST).

    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
    var
      HMutex: THandle;
     
    begin
         FIBONOTES_APPLICATION_RESTORE:= RegisterWindowMessage('FiboNotes_Application_Restore');
         SetLastError(NO_ERROR);
         HMutex := CreateMutex (nil, true, 'FiboNotes_Application_IsRunning');
         if (HMutex = 0) or (GetLastError = ERROR_ALREADY_EXISTS) then
              SendMessage(HWND_BROADCAST, FIBONOTES_APPLICATION_RESTORE, 0, 0)
         else
         begin
              Application.Initialize;
              Application.CreateForm(TForm1, Form1);
              //...  
             Application.Run;
         end;
         if HMutex <> 0 then CloseHandle(HMutex);
    end.
    J'espère que ceci te sera utile.

    Thierry

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2013
    Messages : 20
    Par défaut
    Citation Envoyé par ThWilliam Voir le message

    J'espère que ceci te sera utile.
    Merci Thierry
    j'ai testé ton code et ça marche du premier coup ,
    Alors oui utile ça l'est !
    C'est exactement ce que je voulais
    encore merci

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

Discussions similaires

  1. question sur un livre pour debutant
    Par sybil dans le forum Livres
    Réponses: 13
    Dernier message: 21/09/2008, 03h05
  2. Question sur Ado.net pour débutant
    Par Arnaud Malabeux dans le forum VB.NET
    Réponses: 2
    Dernier message: 12/05/2007, 10h39
  3. Réponses: 3
    Dernier message: 09/09/2006, 23h03
  4. question sur le raccourci pour la sécurité
    Par yoyoo dans le forum Sécurité
    Réponses: 6
    Dernier message: 08/08/2006, 10h58

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