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 :

Création de formes en continu


Sujet :

Delphi

  1. #21
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 490
    Points : 2 752
    Points
    2 752
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par cantador Voir le message
    non, non, il s'agit bien d'une erreur qui se produit sur le bouton fermer créé.
    dans le projet final, il n'y aura d'ailleurs plus de bordures, et donc plus de boutons (fermer, agrandir , réduire)
    @+
    Comme je te le disais don mon précédent message
    Si tu m'indiques la séquence que tu joues quand se produit l'erreur abstraite je peux adapter le programme
    Personnellement j'ai compilé l'appli avec XE7

  2. #22
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    l'erreur se produit juste après l'exécution de la procédure que je t'ai déjà communiquée.
    un point d'arrêt dedans ne donne rien.
    et du coup je ne peux pas savoir quelle forme la déclenche..
    ça semble aléatoire.

  3. #23
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 490
    Points : 2 752
    Points
    2 752
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par cantador Voir le message
    l'erreur se produit juste après l'exécution de la procédure que je t'ai déjà communiquée.
    un point d'arrêt dedans ne donne rien.
    et du coup je ne peux pas savoir quelle forme la déclenche..
    ça semble aléatoire.
    Je viens de le compiler avec Delphi 7 et j'ai eu l'erreur. Pour la corriger remplacer
    par
    Note: pas besoin de try ... except

  4. #24
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par cantador Voir le message
    @Ph. B.

    je suis sous D7 et on peut faire beaucoup de choses encore avec..
    Nobody is perfect !

    Citation Envoyé par cantador Voir le message
    je cogite sur les propositions de Paul TOTH.
    Moi, j'avais cogité à ton problème (D7 compatible), mais je n'avais pas eu le temps de le donner, à cause d'un vilain virus !
    Voici un squelette d'application (hors évolution comme la mise en Systray) d'une fiche qui peut se "cloner" et ainsi de suite et dont seule la 1° de la lignée peut terminer l'application ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    program Project1;
     
    uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        BPlus: TButton;
        BCroix: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        procedure BPlusClick(Sender: TObject);
        procedure BCroixClick(Sender: TObject);
      private
        { Déclarations privées }
        procedure AddForm;
        procedure CloseForm;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    var
      ListForm1: TList;
     
    procedure TForm1.AddForm;
    begin
      with TForm1.Create(nil) do
        Show;
    end;
     
    procedure TForm1.BPlusClick(Sender: TObject);
    begin
       AddForm;
    end;
     
    procedure TForm1.BCroixClick(Sender: TObject);
    begin
      CloseForm;
    end;
     
    procedure TForm1.CloseForm;
    begin
      Close;
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
    end;
     
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    var
      Idx: Integer;
    begin
      if (ListForm1.IndexOf(Self) = 0) and (ListForm1.Count > 1) then
      begin
        CanClose := MessageDlg('Tout fermer ?', mtconfirmation, mbYesNo, 0) = mrYes;
        if CanClose then
          for Idx := ListForm1.Count - 1 downto 1 do
            TForm1(ListForm1[Idx]).Close;
      end
      else
        CanClose := True;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      if ListForm1 = nil then
        ListForm1 := TList.Create;
      ListForm1.Add(Self);
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    var
      Idx: Integer;
    begin
      Idx := ListForm1.IndexOf(Self);
      if Idx >= 0 then
        ListForm1.Remove(Self);
      //
      if ListForm1.Count = 0 then
      begin
        ListForm1.Free;
        ListForm1 := nil;
      end;
    end;
     
    end.
    Pour un Delphi plus récent, j'aurais passé la variable globale de la partie implémentation en variable de classe...
    Philippe.

  5. #25
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    merci ALWEBER et Ph. B.

    je teste le tout demain et vous fais signe..

    cantador

  6. #26
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    @Ph. B.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        CanClose := MessageDlg('Tout fermer ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes;
    Nobody is perfect !

    Plus sérieusement, les applications qui durent sont celles qui répondent à un besoin ou celle qui en créé un.
    Autrement dit, bien souvent, ce sont les idées plus que le code qui font bouger les choses.

    pour la question en cours, vos deux propositions(Pb.B. et ALWEBER) fonctionnent et se rapprochent de celle que j'avais écrite au début, à savoir
    que la fermeture de la première forme créée ferme toutes les autres.
    Or, je souhaite que les formes soient indépendantes des unes des autres ce qui me fait tourner vers l'idée émise par Paul TOTH de cacher la première forme.
    En fait, ces solutions m'ont éclairé, car je vais procéder autrement :
    je vais créer une forme découpée sur une image qui offrira toutes les options avec des HotSpot dont le Post-it,
    qui sera alors un des choix possibles.
    lors du choix du Post-it (personnalisé..), il faudra nécessairement cacher alors la forme principale qui se réduira dans le tray avec un menu contextuel qui donnera la possibilité de ré-afficher cette forme ou de clore l'application.

    merci à tous

    cantador

  7. #27
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 490
    Points : 2 752
    Points
    2 752
    Billets dans le blog
    10
    Par défaut Cacher la première forme
    Citation Envoyé par cantador Voir le message
    @Ph. B.
    ...
    Or, je souhaite que les formes soient indépendantes des unes des autres ce qui me fait tourner vers l'idée émise par Paul TOTH de cacher la première forme.
    ...
    cantador
    Pour info dans le code du projet que je t'ai envoyé et repris ci dessous dans le premier appel à CreateForm la fiche créée est rendue visible, dans les appels suivants à CreateForm la fiche créée est rendue invisible visible.
    C'est pour cela que j'ai mis en second la création de Form1 qui est en fait la fiche principale
    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
     
    program ex19;
     
    uses
      Forms,
      ex19a in 'ex19a.pas' {Form1},
      ex19b in 'ex19b.pas' {Form2};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      Application.CreateForm(TForm2, Form2);
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.

  8. #28
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour
    Citation Envoyé par cantador Voir le message
    @Ph. B.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        CanClose := MessageDlg('Tout fermer ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes;
    Nobody is perfect !
    C'est la faute à Delphi 7 ! sur Seattle, ça marche...

    Cela dit, vous pouvez introduire cette constante : const mbYesNo = [mbYes, mbNo]; et là ça compilera et fonctionnera...
    Philippe.

  9. #29
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut le début du projet
    Bonjour,

    je vous communique le début du projet

    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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
     
    program Project1;
     
    uses
      Forms,
      Unit1 in 'Unit1.pas' {FMain};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      Application.CreateForm(TFMain, FMain);
      Application.ShowMainForm := false;
      Application.Run;
    end.
     
    **************************************
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
      Menus, ShellAPI;
     
    const WM_ICONTRAY = WM_USER + 1;
     
    type
      TFMain = class(TForm)
        BPlus: TButton;
        BCroix: TButton;
        PMTray: TPopupMenu;
        Ecrireunpostit1: TMenuItem;
        MenuItem1: TMenuItem;
        MenuItem2: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        procedure BPlusClick(Sender: TObject);
        procedure BCroixClick(Sender: TObject);
        procedure Ecrireunpostit1Click(Sender: TObject);
        procedure MenuItem2Click(Sender: TObject);
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Déclarations privées }
        TrayIconData: TNotifyIconData;
        procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY;
        procedure AddForm;
        procedure CloseForm;
     
      protected
        procedure WMNCHitTest(var msg: TWMNCHitTest); message WM_NCHITTEST;
      public
        { Déclarations publiques }
      end;
     
    var
      FMain: TFMain;
      ListForm1: TList;
      Idx: Integer;
     
    implementation
     
    {$R *.dfm}
     
    procedure TFMain.WMNCHitTest(var msg: TWMNCHittest);
    var
      pt: TPoint;
    begin
      inherited;
     
      pt := ScreenToClient(Point(msg.XPos, msg.YPos));
     
    {  if PtInRect(Rect(0, 0, ClientWidth - 4, 20), pt) then
        msg.Result := HTCAPTION // déplacement
      else    }
     
      if PtInRect(Rect(-4, -4, 4, 4), pt) then
        msg.Result := HTTOPLEFT // redimensionnement gauche-haut
      else
        if PtInRect(Rect(ClientWidth - 4, -4, ClientWidth, 4), pt) then
          msg.Result := HTTOPRIGHT // redimensionnement par droite-haut
        else
          if PtInRect(Rect(-4, 4, 4, ClientHeight - 4), pt) then
            msg.Result := HTLEFT // redimensionnement gauche
          else
            if PtInRect(Rect(-4, ClientHeight - 4, 4, ClientHeight), pt) then
              msg.Result := HTBOTTOMLEFT // redimensionnement par gauche-bas
            else
              if PtInRect(Rect(0, -4, ClientWidth, 4), pt) then
                msg.Result := HTTOP // redimensionnement par le haut
              else
                if PtInRect(Rect(ClientWidth - 4, 4, ClientWidth, ClientHeight - 4), pt) then
                  msg.Result := HTRIGHT // redimensionnement droit
                else
                  if PtInRect(Rect(ClientWidth - 4, ClientHeight - 4, ClientWidth, ClientHeight), pt) then
                    msg.Result := HTBOTTOMRIGHT // redimensionnement par droit-bas
                  else
                    if PtInRect(Rect(4, ClientHeight - 4, ClientWidth - 4, ClientHeight), pt) then
                      msg.Result := HTBOTTOM; // redimensionnement par le bas
     
    end;
     
     
    procedure TFMain.TrayMessage(var Msg: TMessage);
    var
      p: TPoint;
    begin
    // click sur l'icone dans le tray
      case Msg.lParam of
        WM_LBUTTONDOWN, WM_RBUTTONDOWN:
          begin
            SetForegroundWindow(Handle);
            GetCursorPos(p);
            PMTray.Popup(p.x, p.y);
            PostMessage(Handle, WM_NULL, 0, 0);
          end;
      end;
    end;
     
    procedure TFMain.AddForm;
    begin
      with TFMain.Create(nil) do
        Show;
    end;
     
    procedure TFMain.BPlusClick(Sender: TObject);
    begin
      AddForm;
    end;
     
    procedure TFMain.BCroixClick(Sender: TObject);
    begin
      CloseForm;
    end;
     
    procedure TFMain.CloseForm;
    begin
      Close;
    end;
     
    procedure TFMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
    end;
     
    procedure TFMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
    {
      if (ListForm1.IndexOf(Self) = 0) and (ListForm1.Count > 1) then
      begin
        CanClose := MessageDlg('Tout fermer ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes;
        if CanClose then
          for Idx := ListForm1.Count - 1 downto 1 do
            TForm1(ListForm1[Idx]).Close;
      end
      else
        CanClose := True;     }
    end;
     
    procedure TFMain.FormCreate(Sender: TObject);
    begin
      if ListForm1 = nil then
        ListForm1 := TList.Create;
      ListForm1.Add(Self);
     
      if ListForm1.Count > 1 then exit;
      with TrayIconData do
      begin
        cbSize := SizeOf(TrayIconData);
        Wnd := Handle;
        uID := 0;
        uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
        uCallbackMessage := WM_ICONTRAY;
        hIcon := Application.Icon.Handle;
        StrPCopy(szTip, Application.Title);
      end;
      Shell_NotifyIcon(NIM_ADD, @TrayIconData);
    end;
     
    procedure TFMain.FormDestroy(Sender: TObject);
    begin
      Idx := ListForm1.IndexOf(Self);
      if Idx >= 0 then
        ListForm1.Remove(Self);
     
      if ListForm1.Count = 0 then
      begin
        ListForm1.Free;
        ListForm1 := nil;
      end;
    end;
     
    procedure TFMain.Ecrireunpostit1Click(Sender: TObject);
    begin
      AddForm;
    end;
     
    procedure TFMain.MenuItem2Click(Sender: TObject);
    begin
      CloseForm;
    end;
     
    procedure TFMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      ReleaseCapture;
      Perform(WM_SYSCOMMAND, $F012, 0);
    end;
     
    end.
    en me servant de la méthode proposée par Ph. B. (mais la solution de ALWEBER est bien aussi)
    j'ai bien sûr ajouté et modifié quelques trucs..

    Le plus dur reste à faire..

    merci à tous

    cantador

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/04/2012, 19h48
  2. [Hudson] Création d'une plate-forme d'intégration continue
    Par PoichOU dans le forum Intégration Continue
    Réponses: 4
    Dernier message: 09/09/2011, 11h45
  3. Création d'une table en continu
    Par jmde dans le forum Access
    Réponses: 2
    Dernier message: 31/07/2006, 20h41
  4. Création image BMP
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 16h04

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