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

 Delphi Discussion :

callback form1 form2


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut callback form1 form2
    je souhaite afficher une fenêtre pendant un traitement, on m'a dit
    de mettre un callback sur ma fonction de traitement dans la fenêtre que je veux afficher pendant le traitement

    ainsi, je crée ma fenêtre
    j'affecte mon callback
    dans l'événement onshow je spécifie le callback
    J'affiche la fenêtre avec showmodal
    je libère la fenêtre

    je cherche un tuto ou même une rubrique d'aide, j'arrive pas à visualiser ce que c'est, j'ai chercher dans le forum et la faq "callback" ne renvoie pas de réponse à mon problème

    merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    En fait, le CallBack est très proche d'un Gestionnaire d'Evenement ... ce qui serait une meilleure approche entre Form ...

    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
    type
      TFormMain = class(TForm)
      private
        procedure Proc(Sender: TObject);
      end;
     
    type
      TFormModal = class(TForm)
      private
        FOnTruc: TNotifyEvent;
      pulic
        property OnTruc: TNotifyEvent read FOnTruc write FOnTruc;
      end;
     
    procedure TFormMain.ButtonModalClick(Sender: TObject);
    begin
      FormModal := TFormModal.Create(nil);
      try
        FormModal.OnTruc := FormMain.Proc;
        FormModal.ShowModal; 
      finally
        FormModal.Free();
      end;
     
    end;

  3. #3
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    Merci pour l'aide, bon alors j'y étais pas avec mes recherches, TNotifyEvent je connais pff

    avec TNotifyEvent la méthode ou function ou procedure doit avoir un paramètre (Sender: TObject); uniquement, si je veux mettre d'autre paramètres je dois déclarer un nouveau type c'est sa?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    TNotifyEvent est l'évènement Objet de Base !
    Comme le OnClick par exempel !

    si tu veux plus de paramètre, tu dois définir ton propre type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TOuiOuiEvent = procedure(Sender: TObject; Param1: Integer; Param2: string) of object;

  5. #5
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    génial, merci pour tous! je met resolu

  6. #6
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    j'enleve resolu car je bloke sur la fermeture je comprend pas ou mettre modalresult à ok pour fermer.

    ma mini fenetre:
    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
    Unit fmLoadCP;
     
    Interface
     
    Uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls;
     
    Type
      TLoadCP = Class(TForm)   
        pbLoad: TProgressBar;
        Label1: TLabel;
        Procedure FormActivate(Sender: TObject);
        Procedure FormCreate(Sender: TObject);
      Private
        FOnShowModal: TNotifyEvent;
        Started:      Boolean;
      Public
        Property OnShowModal: TNotifyEvent Read FOnShowModal Write FOnShowModal;
      End;
     
    Var
      LoadCP: TLoadCP;
     
    Implementation
     
    {$R *.dfm}
     
    Procedure TLoadCP.FormActivate(Sender: TObject);
    Begin
      If Not Started Then
      Begin
        Started := True;
        OnShowModal(Nil);
        ModalResult := mrOk;
      End;
    End;
     
    Procedure TLoadCP.FormCreate(Sender: TObject);
    Begin
      Started := False;
    End;
     
    End.
    mon appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        LoadCP := TLoadCP.Create(Main);
        With LoadCP Do
        Begin
          Try
            OnShowModal := LoadCodePostal;
            If ShowModal = mrOk Then
              MessageDlg('reussi', mtInformation, [mbOK], 0);
          Finally
            Free;
          End;
        End;
    sauf que ma procedure LoadCodePostal va jusqu'au bout puis rien aucune erreur ma fenetre reste c'est tout. j'ai essayé de mettre modalresult a la fin de LoadCodePostal sans succès sa reste ma mini fenetre avec la progressbar pleine, toutes mes requetes reussie et pas le message "reussie"

    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
    Procedure TMain.LoadCodePostal(Sender: TObject);
    Var
      NewCode: TStringList;
      I, Max:  Integer;
    Begin
      Try
        Application.ProcessMessages;
        NewCode := TStringList.Create; //je crée une liste
        NewCode.LoadFromFile(OpenTextFileDialog.FileName); //je charge mon fichier dans la liste
        If NewCode.Count > 30 Then //si la liste contient plus de 30 000 lignes il est sûrement correct
        Begin
          ADOQuery.SQL.Clear;
          ADOQuery.SQL.Add('DELETE FROM [code_postal];' + sLineBreak); //je vide la table des anciens codes
          ADOQuery.Prepared := True;
          ADOQuery.ExecSQL; //j'exécute ma requêtes
          I                 := 0;
          Max               := NewCode.Count - 1;
          LoadCP.pbLoad.Max := Max;
          While I <= Max Do //je boucle pour créer les requêtes afin de insérer les nouveaux codes
          Begin
            If NewCode[i] = '' Then //si la ligne est vide je la saute
              Continue;
            //je récupère dans chaque ligne les cinq premiers caractères, et la fin de la ligne moins les six premiers caractères
            ADOQuery.SQL.Clear;
            ADOQuery.SQL.Add('INSERT INTO [code_postal] (code, ville) VALUES (' + Copy(NewCode[i], 1, 5) + ', ''' + Copy(NewCode[i], 7, Length(NewCode[i])) + ''');' + sLineBreak);
            ADOQuery.Prepared := True;
            ADOQuery.ExecSQL; //j'exécute ma requêtes
            LoadCP.pbLoad.Position := I;
            Application.ProcessMessages;
            Inc(I);
          End;
        End
        Else
          ShowMessage('Moins de 30000 lignes le fichiers est sûrement incorrect!');
      Finally
        NewCode.Free; //je libère ma liste
      End;
    End;
    quelqu'un saurait m'expliquer? Merci

  7. #7
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    showmodal appele activate de la form puis met modalresult à o, du coup il existe un evenement apres activate?

    j'ai pompé Showmodal que j'override et j'ai inséré un appel à ma procédure dedans sa fonctionne parfaitement

  8. #8
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Salut,

    Au lieu de cette ligne dans Activate

    c'est plutôt ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if Assigned(FOnShowModal) then
      FOnShowModal(Self);

  9. #9
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    ah oui j'ai oublié sa merci

    voila ma form maintenant:
    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
    Unit fmLoadWait;
     
    Interface
     
    Uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls, ExtCtrls, Consts;
     
    Type
      TLoadWait = Class(TForm)
        pbLoad: TProgressBar;
        Label1: TLabel;
      Public
        Function ShowModal(OnShowModal: TNotifyEvent): Integer; Overload;
      End;
     
    Var
      LoadWait: TLoadWait;
     
    Implementation
     
    {$R *.dfm}
     
    Function TLoadWait.ShowModal(OnShowModal: TNotifyEvent): Integer;
    Var
      WindowList:     Pointer;
      SaveFocusState: TFocusState;
      SaveCursor:     TCursor;
      SaveCount:      Integer;
      ActiveWindow:   HWnd;
    Begin
      CancelDrag;
      If Visible Or Not Enabled Or (fsModal In FFormState) Or
        (FormStyle = fsMDIChild) Then
        Raise EInvalidOperation.Create(SCannotShowModal);
      If GetCapture <> 0 Then
        SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
      ReleaseCapture;
      Application.ModalStarted;
      Try
        Include(FFormState, fsModal);
        If (PopupMode = pmNone) And (Application.ModalPopupMode <> pmNone) Then
        Begin
          RecreateWnd;
          HandleNeeded;
        End;
        ActiveWindow   := GetActiveWindow;
        SaveFocusState := Forms.SaveFocusState;
        Screen.SaveFocusedList.Insert(0, Screen.FocusedForm);
        Screen.FocusedForm := Self;
        SaveCursor         := Screen.Cursor;
        Screen.Cursor      := crDefault;
        SaveCount          := Screen.CursorCount;
        WindowList         := DisableTaskWindows(0);
        Try
          Show;
          Try
            SendMessage(Handle, CM_ACTIVATE, 0, 0);
            ModalResult := 0;
    //--------------------------------------------------------------
            If Assigned(OnShowModal) Then
              OnShowModal(nil);
    //--------------------------------------------------------------
            Repeat
              Application.HandleMessage;
              If Application.Terminated Then
                ModalResult := mrCancel
              Else
              If ModalResult <> 0 Then
                CloseModal;
            Until ModalResult <> 0;
            Result := ModalResult;
            SendMessage(Handle, CM_DEACTIVATE, 0, 0);
            If GetActiveWindow <> Handle Then
              ActiveWindow := 0;
          Finally
            Hide;
          End;
        Finally
          If Screen.CursorCount = SaveCount Then
            Screen.Cursor := SaveCursor
          Else
            Screen.Cursor := crDefault;
          EnableTaskWindows(WindowList);
          If Screen.SaveFocusedList.Count > 0 Then
          Begin
            Screen.FocusedForm := Screen.SaveFocusedList.First;
            Screen.SaveFocusedList.Remove(Screen.FocusedForm);
          End Else
            Screen.FocusedForm := nil;
          If ActiveWindow <> 0 Then
            SetActiveWindow(ActiveWindow);
          RestoreFocusState(SaveFocusState);
          Exclude(FFormState, fsModal);
        End;
      Finally
        Application.ModalFinished;
      End;
    End;
     
    End.

  10. #10
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Je te propose une autre méthode :

    Code de la fiche de traitement

    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
     
    const
      WM_AfterShow = WM_USER + $1;
     
    type
      TfrmTraitement = class;
     
      TTraitementEvent = procedure(Sender: TfrmTraitement; var Resultat: Boolean) of object;
     
      TfrmTraitement = class(TForm)
        ProgressBar1: TProgressBar;
        procedure FormShow(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        FTraitement: TTraitementEvent;
        Success: Boolean;
        procedure WMAfterShow(var M: TMessage); message WM_AfterShow;
      public
        property Traitement: TTraitementEvent read FTraitement write FTraitement;
      end;
     
    var
      frmTraitement: TfrmTraitement;
     
    implementation
     
    {$R *.dfm}
     
    { TfrmTraitement }
     
    procedure TfrmTraitement.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if Success then
        ModalResult := mrOk
      else
        ModalResult := mrCancel;
    end;
     
    procedure TfrmTraitement.FormShow(Sender: TObject);
    begin
      PostMessage(Handle, WM_AfterShow, 0, 0);
    end;
     
    procedure TfrmTraitement.WMAfterShow(var M: TMessage);
    var
      Resultat: Boolean;
    begin
      if Assigned(FTraitement) then
      begin
        FTraitement(Self, Resultat);
        Success := Resultat;
        Close;
      end;
    end;
    l'appel donne:

    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      frmTraitement := TfrmTraitement.Create(Self);
      with frmTraitement do
      begin
        try
          Traitement := FaisUnTruc;
          if ShowModal = mrOk then
            MessageDlg('reussi', mtInformation, [mbOK], 0);
        finally
          Free;
        end;
      end;
    end;
     
    procedure TForm1.FaisUnTruc(Sender: TfrmTraitement; var Resultat: Boolean);
    var
      i: Integer;
    begin
      for i := 0 to 100 do
      begin
        Application.ProcessMessages;
        Sleep(20);
        Sender.ProgressBar1.Position := i;
      end;
      Resultat := True; //opération réussi false sinon
    end;

  11. #11
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    quel est l'avantage d'utiliser ta méthode par rapport a ce que j'ai posté merci.

  12. #12
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Citation Envoyé par ouiouioui
    du coup il existe un evenement apres activate?
    Ce post est une réponse à cette question avec notamment la création de l'aftershow.

    je vois au moins un avantage:
    y'a moins de lignes de code...

    mais bon ca ne reste qu'une suggestion.

  13. #13
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    donc il n'y a rien apres activate il faut soit poster un message soit modifier showmodal. C'était très interessant ce sujet pour moi merci à tous.

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

Discussions similaires

  1. de FORM1 à FORM2
    Par immmene dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 26/01/2010, 16h14
  2. Récupération données form1-->form2
    Par gwems dans le forum IHM
    Réponses: 8
    Dernier message: 25/02/2009, 15h32
  3. [VB6] intervertir form1 - form2
    Par zuly99 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 25/09/2007, 16h13
  4. appels form1/form2 - copier/coller MSFlexGrid1
    Par felix14 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 17/05/2006, 11h43
  5. [C#]composant Form1 -> Form2
    Par lalilo dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/01/2006, 19h36

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