FAQ C++ BuilderConsultez toutes les FAQ

Nombre d'auteurs : 60, nombre de questions : 670, dernière mise à jour : 21 novembre 2010  Ajouter une question

 

Cette F.A.Q. a été réalisée à partir des questions fréquemment posées sur le forum C++ Builder de developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette F.A.Q. ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, contactez pottiez

Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.

L'équipe C++ Builder de Developpez.

Commentez cette FAQ : Commentez


SommaireInterface bisGestion de l'exécution (7)
précédent sommaire suivant
 

Pour cela, utilisez la fonction system, déclarée dans stdlib.h, qui prend pour argument la commande à exécuter :

Code c++ : Sélectionner tout
1
2
3
#include <stdlib.h> 
//... 
system("dir *.*");

Mis à jour le 1er septembre 2004 Geronimo

Pour récupérer le résultat de l'exécution d'une commande, il suffit d'utiliser la fonction system, définie dans stdlib.h, pour lancer une commande, et de spécifier une redirection de sortie (celles-ci fonctionnent aussi bien sous DOS/Windows que sous Linux) :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
#include <stdlib.h> 
  
// Version DOS/Windows : 
system("dir *.* > results.txt"); 
  
// Version Linux : 
/* L'option -l permet d'avoir les détails 
   des fichiers                           */ 
system("ls -l > results");
Le résultat de la commande se situe maintenant dans le fichier results.txt ou results.

Mis à jour le 1er septembre 2004 Geronimo

Utilisez la fonction ShellExecute.
Pour lancer Notepad, par exemple :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
ShellExecute(NULL,  // Handle de la fenêtre parent 
                 "open", // Action à effectuer 
                 "notepad.exe", // Fichier 
                 "", // Paramètres 
                 "", // Répertoire par défaut 
                 SW_SHOWDEFAULT // Manière d'afficher 
                 );
Attention, les chaînes passées en arguments de cette fonction sont des chaînes C standard. Pour passer des AnsiString en arguments, utilisez la méthode c_str() :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
// Affiche une boîte de dialogue "Ouvrir un fichier" et ouvre le fichier avec notepad. 
if (OpenDialog1->Execute()) 
{ 
  ShellExecute(NULL,  // Handle de la fenêtre parent 
                   "open", // Action à effectuer 
                   "notepad.exe", // Fichier 
                   OpenDialog1->FileName.c_str(), // Paramètres 
                   ExtractFilePath(OpenDialog1->FileName).c_str(), // Répertoire par défaut 
                   SW_SHOW // Manière d'afficher 
                   ); 
}

Mis à jour le 1er septembre 2004 Geronimo

Cela peut être effectué grâce aux fonctions ParamCount() et ParamStr(), la seconde prenant en argument le numéro de l'argument.
Dans l'exemple suivant, nous chargeons dans un TMemo le fichier placé en argument de la ligne de commande. Placez le code suivant dans le constructeur de votre fiche :

Code c++ : Sélectionner tout
1
2
if ( ParamCount() > 0 ) 
    Memo1->Lines->LoadFromFile(ParamStr(1));

Mis à jour le 1er septembre 2004 Geronimo

Il est souvent utile d'avertir l'utilisateur par un message rapide, pour lui faire part d'une information ou pour lui signaler une erreur. Il existe différentes méthodes. Les plus simples et les plus utiles sont ShowMessage et MessageDlg.

ShowMessage permet d'afficher un message tout simple dans une fenêtre. Elle prend pour argument une AnsiString qui est le contenu du message.

Code c++ : Sélectionner tout
ShowMessage("Tâche effectuée");
L'autre méthode, plus perfectionnée, est MessageDlg. Cette fonction permet de personnaliser un peu la boîte de dialogue :

Code c++ : Sélectionner tout
MessageDlg("La tâche a été effectuée correctement", mtInformation, TMsgDlgButtons() << mbOK, 0);
Cette fonction permet d'afficher un message (AnsiString passée en premier argument). Le second argument indique le type de boîte de dialogue. mtInformation affiche une icône "information" dans la boîte de dialogue. Enfin, l'avant-dernier argument permet de choisir quels boutons seront disponibles dans la boîte de dialogue. Le dernier argument permet de lier la boîte de dialogue à une rubrique d'aide. Un des grands avantages de cette fonction est qu'elle permet de savoir quel bouton a été enfoncé s'il y en avait plusieurs :

Code c++ : Sélectionner tout
1
2
3
if (MessageDlg("Le document n'a pas été sauvegardé, voulez-vous le sauvegarder avant de quitter ?",  
     mtConfirmation, TMsgDlgButtons() << mbYes << mbNo, 0) == mrYes) 
    Sauver();
Dans ce code, la méthode Sauver est appellée si le bouton Oui est cliqué. Pour plus de détails sur le fonctionnement de MessageDlg, consultez l'aide de C++Builder.

Mis à jour le 1er septembre 2004 Geronimo

Lors d'un traitement long, l'application ne traite plus les messages Windows de la queue de messages.
Le résultat est en général une application qui ne répond plus aux événements utilisateurs, ou qui ne se redessine plus.

Dans ce cas, il faut faire un appel à la méthode ProcessMessages de la classe Application dans la boucle. L'exemple présenté ci-dessous déclenche une tâche ininterrompue lors du clic sur un bouton. Nous dessinons un quadrillage par rebonds successifs du pinceau sur les bords de la fenêtre. Déclarons tout d'abord une variable Stop en global :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
//... 
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
#pragma resource "*.dfm" 
TForm1 *Form1; 
bool Stop; /* Placez la variable ici */ 
//--------------------------------------------------------------------------- 
__fastcall TForm1::TForm1(TComponent* Owner) 
    : TForm(Owner) 
{ 
//... 
}
Maintenant, nous allons écrire le gestionnaire d'évènements OnClick du bouton de dessin.

Code c++ : Sélectionner tout
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
void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
  static int x_inc = 1; // Incrémentation d'abscisse 
  static int y_inc = 1; // Incrémentation d'ordonnée 
  static int X = 10;    // Position initiale (abscisse) 
  static int Y = 10;    // Position initiale (ordonnée) 
  
  Stop = false;     // La boucle est activée. 
  /* Le seul moyen d'arrêter la boucle est  
     de positionner la variable Stop à true */ 
  while(!Stop) 
  { 
    Canvas->MoveTo(X, Y); // Placement du pinceau en (X, Y) 
    X += x_inc;       // Incrémentation des positions 
    Y += y_inc; 
    // Change la couleur de la ligne aléatoirement 
    Canvas->Pen->Color = RGB(rand()%255, rand()%255, rand()%255); 
    Canvas->LineTo(X, Y); // Ligne jusqu'à la nouvelle position 
  
    /* Si la position du pinceau sort de la zone cliente  
    de la fenêtre, on inverse les incrémentations, ce qui donne 
    l'effet de "rebond" */ 
    if (X > ClientWidth || X < 0) x_inc = -x_inc; 
    if (Y > ClientHeight || Y < 0) y_inc = -y_inc; 
  
    /* L'appel à cette méthode évite le blocage de l'application :  
       les messages et clics sur autres boutons sont traités */  
    Application->ProcessMessages(); 
  } 
}
Maintenant, il nous faut pouvoir arrêter cette boucle dessin. Pour cela, nous avons vu qu'il suffit de placer la variable Stop à true. Placez un autre bouton sur la fiche. Dans son gestionnaire d'évènements OnClick, placez le code suivant :

Code c++ : Sélectionner tout
1
2
3
4
void __fastcall TForm1::Button2Click(TObject *Sender) 
{ 
  Stop = true; 
}
Si un clic sur le bouton a lieu, il sera traité par l'appel à Application->ProcessMessages(). Enfin, il faut pouvoir quitter le programme. Pour cela, utilisez l'évènement OnCloseQuery de la fiche et placez-y également le code Stop = true.

Mis à jour le 1er septembre 2004 Geronimo

Utilisez la fonction Sleep en lui passant en argument le nombre de millisecondes.

Code c++ : Sélectionner tout
1
2
// Pause d'une seconde : 
Sleep(1000);
Notez qu'en raison du fonctionnement interne de Windows, Sleep ne garantit qu'un minimum d'attente. En effet, Windows n'est pas un système temps-réel.

Mis à jour le 1er septembre 2004 Geronimo

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2020 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.