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 :

Redémarrer une application


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut Redémarrer une application
    Bonjour

    j'ai un soucis avec un code pour redémarrer mon application...

    J'ai une boite MessageDlg qui me permet de vider une section "Programmes" (des icônes posés sur la fiche) dans un fichier Ini
    Je choisi oui dans la boite et le code ne fonctionne pas - la section est vidée mais le programme ne redémarre pas !

    Par contre j'ai testé si il y n'y a pas d’icône sur la fiche et en prenant le même choix oui, le code fonctionne et le programme redémarre parfaitement
    quelqu'un voit il où ça cloche ?

    A vous lire
    Merci
    Beauserge

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TAccueil.SpeedBtnEffaceProgClick(Sender: TObject);
    begin
      if MessageDlg('Voulez vous vraiment effacer les raccourcis programmes de cette fiche ?' + #13 + '! un redémarrage de LISTLOG est impératif !', mtwarning, [mbYes, mbNo],0) =mrYes then
      begin
        FicIni.EraseSection('Programmes'); // Effacer la section Programmes du fichier Ini
        Close;
        ShellExecute(0,'OPEN','LISTLOG.exe', Nil, Nil, SW_SHOW);
      end;
    end;

  2. #2
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Tu fermes ton logiciel avant d'ouvrir le suivant je pense que c'est normal et qu'il faut plutôt inverser ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ShellExecute(0,'OPEN','LISTLOG.exe', Nil, Nil, SW_SHOW);
    Close;
    En revanche si je peux te conseiller il serait préférable de gérer cela dans ton logiciel, c'est toujours pénible de devoir redémarrer un programme ..

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut
    Bonjour Retwas

    Cela ne change rien, le problème est identique.

  4. #4
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Bonjour,


    moi je tenterai plutôt de faire ça le plus loin possible de la fin du processus en cour ...

    du genre dans la section finalization de la fiche:

    une variable globale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     var
       bReload: Boolean = False;
    à la fin de l'unité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    initialization
    finalization
      if bReload then
        ShellExecute(0,'OPEN','LISTLOG.exe', Nil, Nil, SW_SHOW);
    end.
    et dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TAccueil.SpeedBtnEffaceProgClick(Sender: TObject);
    begin
      if MessageDlg('Voulez vous vraiment effacer les raccourcis programmes de cette fiche ?' + #13 + '! un redémarrage de LISTLOG est impératif !', mtwarning, [mbYes, mbNo],0) =mrYes then
      begin
        FicIni.EraseSection('Programmes'); // Effacer la section Programmes du fichier Ini
        bReload := True;
        Close;
      end;
    end;
    à voir ... peut être que ça suffira
    Cordialement,
    @+

  5. #5
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,
    avant de fermer ton application, si ton close ferme la fenêtre principale, tu devais aussi faire FicIni.free ?
    A+
    Charly

  6. #6
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    on peut même aller plus loin et placer l'appel dans le dpr ...

    pour utiliser cette version il suffit de supprimer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    initialization
    finalization
      if bReload then
        ShellExecute(0,'OPEN','LISTLOG.exe', Nil, Nil, SW_SHOW);
    end.

    et dans le dpr:
    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
    program Project1;
     
    uses
      ShellAPI,
      Forms,
      Unit1 in 'Unit1.pas' {Form1};
     
    {$R *.res}
    const
      SW_SHOW = 5;
    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
      if bReload then
        ShellExecute(0,'OPEN','LISTLOG.exe', Nil, Nil, SW_SHOW);
    end.
    :

    le reste est pareil

    Cordialement,
    @+

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut
    Bonsoir Cirec

    J'ai essayé tes 2 méthodes et c'est toujours la même chose...

    Par contre, j'ai constaté une chose mais avec mon ancien code, c'était pareil ;
    si je charge une icône sur la fiche, que je ferme normalement le programme, que je le réouvre et clique sur mon bouton pour déclencher mon code, là le fichier Ini se vide et le programme redémarre.

    Pourquoi cela fonctionne après un 2ème lancement et pas lors de la 1er fois ?



    P. S our le fichier Ini (en réponse à Charly, si je je libère, j'ai une erreur violation !

    Cordialement
    Beauserge

  8. #8
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    re,

    je pense, vu ce que tu viens de dire, que le problème vient de ta gestion du TIniFile ...

    ... une violation d'accès à la libération de ce dernier n'est pas normale !

    peux tu nous donner un peu plus de code ... par Ex. la création du ini où et comment ...
    ou mieux encore un exemple qui reproduit l'erreur ?

  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
    Je ne sais plus pourquoi...
    Mais c'est le genre de truc qui se fait facilement avec deux programmes.

    Quand le programme doit être redémarrer, il appelle un autre programme, se ferme. L'autre programme appelle le premier programme, il se ferme.

    Un plus est de s'assurer avant de lancer le programme qu'il n'y a pas d'instance en cour d'exécution.

    Une autre façon, c'est un programme qui communique avec des sockets par exemple pour vérifier que l'autre programme n'est pas planté. Et s'il ne répond pas, il lance un autre instance...

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Ce ne sont pas ces quelques lignes qui posent problème. Même Close n'a pas d'effet immédiat et pourrait être à la première ligne. Close de la fiche principale génère un Application.Terminate qui n'est rien d'autre qu'un PostQuitMessage (asynchrone).
    ShellExecute non plus n'est pas problématique. La seule chose qui pourrait coincer est l'accès à une ressource verrouillée mais c'est sur la deuxième instance que ça se verrait.

    Il faut plutôt regarder ce qui se passe dans OnClose, OnDestroy, OnDeactivate.

    Pas de message d'erreur ?

  11. #11
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,
    il faut peut être laisser le temps au fichier ini de s'écrire sur le disque avant de le relire à l'ouverture de l'application après sa fermeture ?

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut
    Bonjour à tous

    Oui effectivement, il semblerait que le Fichier Ini soit en cause mais je n'arrive pas à voir à quel endroit (à force d'avoir la tête dans le code, cela devient de moins en moins clair :-)


    Voici un bout du code pour vous aider à trouver la faille...

    --------------------------------

    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
    {A l'ouverture de la fiche} 
    procedure TAccueil.FormCreate(Sender: TObject);
    var
      hinte:string; // pour structure icone
      j:integer;    // pour structure icone
      x:integer; // pour drag drop raccourci
     begin
      FicIni := TIniFile.Create(ExtractFilePath(Application.ExeName)+ 'ListLog.ini');
    	// ExtractFilePath pour que le .ini se trouve dans le même directory que l'exécutable
      Logiciels1.Items[0].caption := FicIni.ReadString('Element','Bureautique', caption);
      Logiciels1.Items[2].caption := FicIni.ReadString('Element','Base de données', caption);
      Logiciels1.Items[4].caption := FicIni.ReadString('Element','Disque dur', caption);
      Logiciels1.Items[6].caption := FicIni.ReadString('Element','Divers', caption);
      Logiciels1.Items[8].caption := FicIni.ReadString('Element','Gestion perso', caption);
      Logiciels1.Items[10].caption := FicIni.ReadString('Element','Graphisme', caption);
      Logiciels1.Items[13].caption := FicIni.ReadString('Element','Internet', caption);
      Logiciels1.Items[15].caption := FicIni.ReadString('Element','Jeux', caption);
      Logiciels1.Items[17].caption := FicIni.ReadString('Element','Mp3', caption);
      Logiciels1.Items[19].caption := FicIni.ReadString('Element','Programmation Applications', caption);
      Logiciels1.Items[21].caption := FicIni.ReadString('Element','Programmation HTML', caption);
      Logiciels1.Items[23].caption := FicIni.ReadString('Element','Utilitaires', caption);
     
      Screen.Cursor:=crHourGlass;  // pour drag drop
      Combien:=-1;                // pour drap drop
    	for x:=0 to 16 do  // Installer les programmes drap drop   - maximum 15 icones
    begin
      if FicIni.ReadString('Programmes',IntToStr(x),'')<>''
      then AjouterProg;
      notifyStruc.cbSize:=SizeOf(notifyStruc);  // code relatif à structure icone
      notifyStruc.Wnd:=Handle;
      notifyStruc.uID:=1;
      NotifyStruc.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE;
      { On verra WM_MYMESSAGE plus tard }
      NotifyStruc.uCallbackMessage := WM_MYMESSAGE;
      { Definit que l'icone de l'application sera l'icone par défaut }
      NotifyStruc.hIcon :=  Application.Icon.Handle;
      { Définir l'Hint de l'icône, c-a-d le texte qui sera affiché quand la souris reste longtemps dessus }
      hinte:='Cliquer moi pour ouvrir menu ListLog !';
      for j:=0 to length(hinte)-1 do NotifyStruc.szTip[j] := hinte[j+1];
    	NotifyStruc.szTip[length(hinte)]:=#0;
    	 Shell_NotifyIcon(NIM_ADD,@NotifyStruc);//ajoute la petite icône dans la barre des taches
    	   end;
          Screen.Cursor:=crDefault;// fin installation programmes
    end;
     
     
    {A la fermeture de la fiche}
    procedure TAccueil.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    	  FicIni.WriteString('Element','Bureautique', Logiciels1.Items[0].caption);
    	  FicIni.WriteString('Element','Base de données', Logiciels1.Items[2].caption);
    	  FicIni.WriteString('Element','Disque dur', Logiciels1.Items[4].caption);
    	  FicIni.WriteString('Element','Divers', Logiciels1.Items[6].caption);
    	  FicIni.WriteString('Element','Gestion perso', Logiciels1.Items[8].caption);
    	  FicIni.WriteString('Element','Graphisme', Logiciels1.Items[10].caption);
    	  FicIni.WriteString('Element','Internet', Logiciels1.Items[13].caption);
    	  FicIni.WriteString('Element','Jeux', Logiciels1.Items[15].caption);
    	  FicIni.WriteString('Element','Mp3', Logiciels1.Items[17].caption);
    	  FicIni.WriteString('Element','Programmation Applications', Logiciels1.Items[19].caption);
    	  FicIni.WriteString('Element','Programmation HTML', Logiciels1.Items[21].caption);
        FicIni.WriteString('Element','Utilitaires', Logiciels1.Items[23].caption);
      if (@NotifyStruc<>NIL) then   //retire la petite icône de la barre des taches
    	   Shell_NotifyIcon(NIM_DELETE,@NotifyStruc);
    end;
     
     
    {PROCEDURE PERSO POUR DRAP DROP RACCOURCIS}
     
    {Faire apparaitre les programmes}
    Procedure TAccueil.AjouterProg;
    var
    Limage:TObject;
    Icone:TIcon;
    LeProg:String;
    begin
    Inc(Combien);
    // Nom du programme
    LeProg:=FicIni.ReadString('Programmes',IntToStr(Combien),'');
    // Créer l'image qui recevra l'icone du programme.
    // ça peut être un bouton ou tout ce que tu veux.
    Icone:=TIcon.Create;
    Limage:=Timage.Create(self);
    TImage(Limage).Parent:= Accueil;
    TImage(Limage).Top:=70; // Distance à partir du haut de la fiche (données d'origine = 50)
    TImage(Limage).Left:=Combien*(32+15)+15;
    TImage(Limage).AutoSize:=True;
    TImage(Limage).Picture.Icon:=Imaj.Picture.Icon;
    TImage(Limage).OnMouseDown:=ImageMouseDown;
    TImage(Limage).Hint:='N''existe PLUS !!';
    TImage(Limage).ShowHint:=True;
    TImage(Limage).Name:='Image'+IntToStr(Combien);
    TImage(Limage).Tag:=Combien;
       // Si le Programme existe BIEN alors afficher SON icone...
       if FileExists(LeProg) then
       begin
       // Récupérer l'icone.
       Icone.Handle:=ExtractIcon(Handle,Pchar(LeProg),0);
          if Icone.Handle<>0
          then TImage(Limage).Picture.Icon:=Icone;
    	TImage(Limage).Hint:=ExtractFileName(LeProg);
    	end
       // Sinon afficher Image Par Defaut.
    	else TImage(Limage).Picture.Assign(Image.Picture);
    Icone.Free;
    end;
     
    {FIN DE PROCEDURE PERSO POUR DRAP DROP RACCOURCIS}
     
    {Lancer le programme ou supprimer le programme}
    procedure TAccueil.ImageMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
    Prog, Chemin:String;
    Objet:TObject;
    Memoire:TStringList;
    W:Word;
    begin
    	if ssCtrl in Shift then   // Si Ctrl Appuyé, on va Draguer !!!
       begin
    	Timage(Sender).BeginDrag(True);
       Exit;
    	end;
    Prog:=Ficini.ReadString('Programmes',IntToStr(Timage(Sender).Tag),'');
       if Button=mbLeft then // Click Gauche, Démmarer le programme.
       begin
       Screen.Cursor:=crHourGlass;
       // ShowMessage(IntToStr(Timage(Sender).Tag)+'"'+Prog+'"');
       Chemin:=ExtractFilePath(Prog);
       W:=ShellExecute(Handle,'OPEN',Pchar(Prog),Nil,PChar(Chemin),sw_show);
       Screen.Cursor:=crDefault;
        if W<33
          then ShowMessage('Impossible de lancer: '+Prog);
    	end;
    	 if Button=mbRight then // Supprimer un programme:
    	begin
     // Si demande de suppression , demander confirmation.
    	 if x<>-500 then
    		if MessageDlg('Supprimer  '+Prog+' ???',mtWarning,[mbYes,mbNo],0)=mrNo
    		then Exit;
    	// Supprimer le programme
       FicIni.WriteString('Programmes',IntToStr(Timage(Sender).Tag),'');
    	Memoire:=TStringList.Create; //Mettre en mémoire les AUTRES programmes.
    	   for x:=0 to Combien  do
          begin
             if FicIni.ReadString('Programmes',IntToStr(x),'')<>''
             then Memoire.Add(FicIni.ReadString('Programmes',IntToStr(x),''));
          Objet:=FindComponent('Image'+IntToStr(x));  // Supprimer les images
    	   Timage(Objet).Free;
          end;
    	FicIni.EraseSection('Programmes'); // Effacer la section Programmes du fichier Ini
       Combien:=-1;
          for x:=0 to Memoire.Count-1 do
          begin
          // Recréer la section Programmes du fichier Ini
          FicIni.WriteString('Programmes',IntToStr(x),Memoire[x]);
    	   // Réinstaller les programmes restant.
          AjouterProg;
          end;
       Memoire.Free;
       end;
    end;
     
    // Effacer tous les raccourcis programmes (pour libérer place pour drag and drop)
    procedure TAccueil.SpeedBtnEffaceProgClick(Sender: TObject);
    begin
     if MessageDlg('Voulez vous vraiment effacer les raccourcis programmes de cette fiche ?' + #13 + '               ! un redémarrage de LISTLOG est impératif !', mtwarning, [mbYes, mbNo],0) =mrYes then
    		begin
        FicIni.EraseSection('Programmes'); // Effacer la section Programmes du fichier Ini
        bReload := True;  // redemarrage ListLog
          Close;
         end;
    end;

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    AMHA il faudrait mieux libérer le fichier TIniFile dans chaque procédures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ini:=TIniFile.Create(nomfichierini)
    try
      .....
    finally
      ini.free;
    end;
    NB. pour preuve que j'ai lu le source, Hinte:='Cliquer moi .....' me choque 'Cliquez moi...' serait plus grammaticalement parlant juste
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut
    Merci SergioMaster pour cette grossière erreur de français que je viens de rectifier !

    Pour ce qui est du FicIni, peu importe où je place un FicIni.free ou plusieurs, j'ai une erreur violation systématique !

  15. #15
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 658
    Points : 3 599
    Points
    3 599
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Pour ma part, ce que j'aurai tendance à faire, c'est :
    - une procédure qui lit le fichier ini et alimente des attributs de Form1. Cette procedure serait appelé dans le FormCreate. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.LectureIni;
    var
       ficini : TInifile;
    begin
       ficini := TInifile.create(monFichierIni);
       // Lecture du fichier ini et alimentation des attributs
       // [...]
       ficini.free;
    end;
    - une procédure qui écrit dans le fichier ini à partir des attributs de Form1. Cette procedure serait appelé dans le FormDestroy. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.EcritureIni;
    var
       ficini : TInifile;
    begin
       ficini := TInifile.create(monFichierIni);
       // Ecriture du fichier ini à partir des attributs
       // [...]
       ficini.free;
    end;
    - en dehors de ces deux procédures, on ne touche pas au fichier ini (qui ne sert qu'à faire persister les valeurs des attributs) mais uniquement les attributs de Form1.

    Ainsi, dans la procédure SpeedBtnEffaceProgClick, après avoir posé la question, tu as juste à supprimer le nécessaire de l'attribut correspondant en mémoire. L'application en tient directement compte (pas nécessaire de redémarrer l'application) et à la fermeture de l'application la nouvelle valeur de l'attribut sera sauvegardée dans le fichier ini (=> prêt pour le prochain démarrage de l'appli).
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  16. #16
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut
    J'ai essayé ta méthode SergioMaster mais erreur violation à chaque fois

    A+
    Beauserge

    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    AMHA il faudrait mieux libérer le fichier TIniFile dans chaque procédures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ini:=TIniFile.Create(nomfichierini)
    try
      .....
    finally
      ini.free;
    end;
    NB. pour preuve que j'ai lu le source, Hinte:='Cliquer moi .....' me choque 'Cliquez moi...' serait plus grammaticalement parlant juste

  17. #17
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut
    Oui je suis d'accord avec toi gbegreg, cela aurait été la solution pour des enregistrements simple (je procéde ainsi dans la majorité de mes applis) - mais là, la procédure la plus importante enregistre des raccourcis de programmes et crée des icônes en dynamique..
    Je ne vois pas du tout comment procéder pour réaliser la méthode que tu préconises.
    De plus, certaines parties du codes avaient été faite avec un ami à l'époque et je m'y pers un peu dans certaine procédures que je n'ai pas écrite moi même ....

    A+
    Beauserge


    Citation Envoyé par gbegreg Voir le message
    Bonjour,

    Pour ma part, ce que j'aurai tendance à faire, c'est :
    - une procédure qui lit le fichier ini et alimente des attributs de Form1. Cette procedure serait appelé dans le FormCreate. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.LectureIni;
    var
       ficini : TInifile;
    begin
       ficini := TInifile.create(monFichierIni);
       // Lecture du fichier ini et alimentation des attributs
       // [...]
       ficini.free;
    end;
    - une procédure qui écrit dans le fichier ini à partir des attributs de Form1. Cette procedure serait appelé dans le FormDestroy. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.EcritureIni;
    var
       ficini : TInifile;
    begin
       ficini := TInifile.create(monFichierIni);
       // Ecriture du fichier ini à partir des attributs
       // [...]
       ficini.free;
    end;
    - en dehors de ces deux procédures, on ne touche pas au fichier ini (qui ne sert qu'à faire persister les valeurs des attributs) mais uniquement les attributs de Form1.

    Ainsi, dans la procédure SpeedBtnEffaceProgClick, après avoir posé la question, tu as juste à supprimer le nécessaire de l'attribut correspondant en mémoire. L'application en tient directement compte (pas nécessaire de redémarrer l'application) et à la fermeture de l'application la nouvelle valeur de l'attribut sera sauvegardée dans le fichier ini (=> prêt pour le prochain démarrage de l'appli).

  18. #18
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Beauserge Voir le message
    J'ai essayé ta méthode SergioMaster mais erreur violation à chaque fois
    s'il y a violation c'est que le code est mal ficelé puisque ce que j'ai proposé est juste un encapsulage un peu plus fini du code proposé par gbreg
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  19. #19
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut
    Oui je me doute qu'il y a un couac mais le problème c'est que j'ai beau fouiller mon code dans tous les sens et modifier des lignes, j'arrive pas à voir d’où vient le hic !



    Citation Envoyé par SergioMaster Voir le message
    s'il y a violation c'est que le code est mal ficelé puisque ce que j'ai proposé est juste un encapsulage un peu plus fini du code proposé par gbreg

  20. #20
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    fournir le code plutôt que me citer aurait été plus judicieux
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. redémarrer une application
    Par aroussi_sanaa dans le forum Général Java
    Réponses: 3
    Dernier message: 11/09/2009, 00h54
  2. Réponses: 16
    Dernier message: 13/10/2008, 17h32
  3. Redémarrer une application
    Par rangdalf dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/03/2008, 07h13
  4. redémarrer une application
    Par reloadead dans le forum Langage
    Réponses: 5
    Dernier message: 20/06/2007, 15h12
  5. Comment redémarrer une application?
    Par liv dans le forum MFC
    Réponses: 5
    Dernier message: 24/01/2005, 14h40

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