Developpez.com - C
X

Choisissez d'abord la catégorieensuite la rubrique :



Trucs et astuces pour C++ Builder

Par CGi

Page 1 Page 2 Page 3 Page 4 Page 5



De la couleur dans une ListBox :

Exemple: Sur une Form (Form1) vous posez une ListBox (ListBox1) avec sa propriété Style à : lbOwnerDrawFixed. Vous y rajoutez quelques Items.
Puis le code suivant sur l'événement OnDrawItem de la ListBox :

void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control,
     int Index, TRect &Rect, TOwnerDrawState State)
{
      TCanvas *pCanvas = ((TListBox *)Control)->Canvas;

      if ((Index%2)==0) pCanvas->Brush->Color = clYellow;
      // met 1 ligne sur 2 en jaune

      if(State.Contains(odSelected))  //ligne selectionnée
                       {
                        pCanvas->Brush->Color = clRed;
                        pCanvas->FillRect(Rect);
                        pCanvas->Font->Color = clYellow;
                       }
      else pCanvas->FillRect(Rect);  //Les autres lignes

      //écriture les Items.
      pCanvas->TextOut(Rect.Left+5,Rect.Top+2,
                ((TListBox *)Control)->Items->Strings[Index]);
}

Avec l'utilisation de ((TListBox *)Control) au lieu de ListBox1 cette méthode est valable pour n'importe quel ListBox.





Obtention des informations de version de Windows :

On peut obtenir ces informations à l'aide des variables :
Win32MajorVersion, Win32MinorVersion, Win32BuildNumber, Win32Platform, Win32CSDVersion.
Exemple sur une Form (Form1) vous posez un Memo (Memo1) et un bouton (Button1) et sur l'événement OnClick de Button1 :

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Memo1->Lines->Add("Version : " + String(Win32MajorVersion) +
                               "." + String(Win32MinorVersion));
  Memo1->Lines->Add("Construction : " + String(LOWORD(Win32BuildNumber)));
  Memo1->Lines->Add("Plateforme : " + String(Win32Platform));
  Memo1->Lines->Add("Info suppl. : " + String(Win32CSDVersion));
}

Plateforme :
0 -> Win32s on Windows 3.1.
1 -> Win32 on Windows 95.
2 -> Win32 on Windows NT.

Même chose mais avec l'API Windows :

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  OSVERSIONINFO OsVer;
  OsVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  GetVersionEx(&OsVer);

  Memo1->Lines->Add("Version : " + String(OsVer.dwMajorVersion) +
                               "." + String(OsVer.dwMinorVersion));
  Memo1->Lines->Add("Construction : " + String(LOWORD(OsVer.dwBuildNumber)));
  Memo1->Lines->Add("Plateforme : " + String(OsVer.dwPlatformId));
  Memo1->Lines->Add("Info suppl. : " + String(OsVer.szCSDVersion));
}




Chargement d'un curseur animé depuis une ressource :

A ce jour, je n'ai trouvé qu'une solution pour charger un curseur animé à partir d'une ressource. C'est de sauvegarder la ressource dans un fichier temporaire puis de charger le curseur animé depuis le fichier temporaire.
Exemple :
Créer un fichier ressource "fichier.rc" à ajouter au projet:

 MCursor RCDATA cursor.ani

Dans "Unit.cpp" :

const TCursor crMyCursor = 401;

//.............

//Sur l'événement OnCreate de la Form :
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  TResourceStream *MRes = new TResourceStream((int)HInstance,"MCursor",RT_RCDATA);

  char TempFileName[MAX_PATH];
  char TempDir[MAX_PATH];
  GetTempPath(MAX_PATH, TempDir);
  GetTempFileName(TempDir, "~", 0, TempFileName);
  //Création du nom de fichier temporaire

  MRes->SaveToFile(TempFileName);
  Screen->Cursors[crMyCursor] = LoadCursorFromFile(TempFileName);
  Cursor = crMyCursor;
  DeleteFile(TempFileName);

  delete MRes;
}



Une solution plus simple, mais qui ne fonctionne que sous Windows XP, 2000 et NT.
(Je n'ai pas testé sous 2000 et NT)

Créer un fichier ressource à ajouter au projet : "Ress.rc"

#include "ress.h"

MCursor ANICURSOR cursor.ani

Un fichier entête ressource : "Ress.h"

#define ANICURSOR 21
#define MCursor 210

Fichier principal : "Unit1.cpp"

#include "ress.h"

//..........

const TCursor crAniCur = 401;

//..........

//Sur l'événement OnCreate de la Form :
void __fastcall TForm1::FormCreate(TObject *Sender)
{
     Screen->Cursors[crAniCur]=LoadCursor(HInstance,MAKEINTRESOURCE(MCursor));
     Cursor=crAniCur;
}




Texte d'un bouton sur plusieurs lignes:

Sur l'événement OnCreate de la Form (Form1) pour le Bouton (Button1) :

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  SetWindowLong(Button1->Handle,GWL_STYLE,
        GetWindowLong(Button1->Handle,GWL_STYLE) | BS_MULTILINE);
}

Le texte s'affiche sur plusieurs lignes automatiquement à l'exécution.

On peut forcer le passage à la ligne avec le caractère '\n', mais il faut affecter le texte du bouton à l'exécution.

Button1->Caption = "Ligne1\nLigne2";




Mettre une ProgressBar sur la StatusBar :

Sur une Form (Form1) vous posez une StatusBar (StatusBar1) et une ProgressBar (ProgressBar1)
Sur l' événement OnCreate de Form1 :

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  StatusBar1->ControlStyle = StatusBar1->ControlStyle << csAcceptsControls ;
  ProgressBar1->Left = 0;
  ProgressBar1->Top = 2;
  ProgressBar1->Parent = StatusBar1;
}




Appeler une page web avec le navigateur par défaut :

  #include <ShellApi.h>

  //................

  ShellExecute ( Handle,"open","http://www.developpez.com",NULL,NULL,SW_NORMAL);

Le même principe peut être utilisé pour envoyer un mail:

  #include <ShellApi.h>

  //................

  ShellExecute(Handle,"open","mailto:toto@developpez.com",NULL,NULL,SW_NORMAL);

Ou tout simplement pour ouvrir un fichier associé à une application (ici fichier texte):

  #include <ShellApi.h>

  //................

  ShellExecute(Handle,"open","C:\\Dossier\\Fichier.txt",NULL,NULL,SW_NORMAL);

(N'importe quel document peut être ouvert de cette façon s'il est associé à une application.)





Afficher un texte avec un certain angle :

Le code ci-dessous vous permet d'afficher un AnsiString avec un certain angle. cela ne fonctionne qu'avec des polices True Type.

   Canvas->Font->Size = 20;
   Canvas->Font->Name = "Arial";
   LOGFONT lgfont;
   GetObject(Canvas->Font->Handle, sizeof(LOGFONT), &lgfont);
   lgfont.lfEscapement = 450;   //Angle *10
   lgfont.lfOrientation = 450;  //Angle *10
   lgfont.lfOutPrecision = OUT_TT_ONLY_PRECIS;
   Canvas->Font->Handle = CreateFontIndirect(&lgfont);
   SetGraphicsMode(Canvas->Handle, GM_ADVANCED);
   Canvas->Brush->Style = bsClear;   //transparent
   AnsiString text = "C++ Builder";
   Canvas->TextOut(50,210, text);




Obtenir le code des touches clavier :

Créer un nouveau projet avec une Form (Form1) avec sa propriété KeyPreview à true et un Label (Label1)
Sur l'événement OnKeyDown de Form1 :

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
      char ch[3];
      wsprintf(ch,"%X",Key);
      Label1->Caption = "0x" + String(ch);
}

A l'appuie d'une touche son code s'affiche sur Label1.





Compiler un composant Delphi avec C++ Builder :

  • Dans le dossier de sauvegarde mettre les fichiers sources du composant. "fichier.pas" (source), "fichier.dcr" (icone qui le représentera sur la palette). parfois "fichier.res" ...
  • Sur le menu faire : "Composant" puis "Installer un composant".
  • Sur la boîte de dialogue choisir l'onglet "Dans paquet existant" ou "Dans nouveau paquet".
  • Puis faire "parcourir" sur "Nom de fichier unité" choisir "Type" : Unité Pascal (*.PAS) et sélectionner votre fichier (fichier.pas) et faire "Ouvrir".
  • Le fichier d'icône "fichier.dcr" est automatiquement chargé.
  • Sur le champ "Nom du paquet" saisir le nom du nouveau paquet ou sélectionner un paquet existant. Puis faire Ok.
  • Faire "Ok" sur les boîtes de messages construction et compilation du paquet.
  • Faire "Installer" sur la fenêtre du paquet si ça ne s'est pas fait automatiquement.
  • Sauvegarder le paquet: Menu "Enregistrer".
    (Dans le même paquet on peut mettre plusieurs composant.)




Icône représentant le composant sur la palette de composants :

Cette icône est mise dans un fichier ressource spécial qui a comme extension ".DCR" ce fichier doit être dans le même dossier que les fichiers sources du composant avant compilation.

Particularités de ce fichier:

  • Le nom du fichier doit être le même que le nom du fichier source du composant. (si "Compo.cpp" alors "Compo.dcr")
  • L'icône doit être dans un Bitmap de taille 24 x 24
  • Le nom de ce Bitmap doit être le même que celui de la classe du composant en majuscules (si "TCompo" alors "TCOMPO")





Obtention de l'adresse IP local :

Exemple: Sur une form (Form1) mettre un Bouton (Button1) et 2 label (Label1 et Label2) Dans l'évènement OnClick de Button1 :

#include <winsock2.h>

//.................

void __fastcall TForm1::Button1Click(TObject *Sender)
{
      WORD wVersionRequested;
      WSADATA wsaData;
      char name[255];
      AnsiString ip;
      PHOSTENT hostinfo;
      wVersionRequested = MAKEWORD( 2, 0 );

      if ( WSAStartup( wVersionRequested, &wsaData ) == 0 )
      {
        if( gethostname ( name, sizeof(name)) == 0)
            {
              Label1->Caption = name;  //nom de l'ordinateur
                if((hostinfo = gethostbyname(name)) != NULL)
                 {
                   ip = inet_ntoa (*(in_addr *)*hostinfo->h_addr_list);
                   Label2->Caption = ip;  //adresse IP
                 }
            }
        WSACleanup( );
      }
}




Saisir que des chiffres dans un TEdit :

Sur l'événement OnCreate de la Form (Form1) pour Edit1 :

void __fastcall TForm1::FormCreate(TObject *Sender)
{
     SetWindowLong(Edit1->Handle,GWL_STYLE,
                GetWindowLong(Edit1->Handle,GWL_STYLE)
                                            | ES_NUMBER );
}

2eme Solution: Saisir que des chiffres et au plus une virgule dans un TEdit

Sur l'événement OnKeyPress du TEdit (Edit1):

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
  if ((Key < '0' || Key >'9') && Key != 8 && (Key != DecimalSeparator ||
                        ((TEdit *)Sender)->Text.Pos(DecimalSeparator)!=0))
                                                            Key = NULL;
}

En utilisant "((TEdit *)Sender)" au lieu de "Edit1" dans la méthode. Elle devient valable pour n'importe quel TEdit.





Accès aux bits d'un char :

Voici une solution pour accéder simplement aux différents bits d'un char. Pour cela nous utiliserons une union entre une structure de bits et un char.

Exemple:

union TSChar
{
char chr;
struct
     {
        unsigned char Bit0 : 1;
        unsigned char Bit1 : 1;
        unsigned char Bit2 : 1;
        unsigned char Bit3 : 1;
        unsigned char Bit4 : 1;
        unsigned char Bit5 : 1;
        unsigned char Bit6 : 1;
        unsigned char Bit7 : 1;
      };
};

//................

TSChar SChar;

SChar.chr='a';
//affectation du caractère 'a' dans l'union

Label1->Caption = SChar.Bit3;
// affichage du 4eme bit dans un label

SChar.Bit5 = 0;
//mise à 0 du 6ème bit (Cela met SChar.chr en majuscule 'A' )





Séparateur décimal :

Le séparateur décimal est défini dans les paramètres régionaux de Windows. ("Panneau de configuration", "Paramètre régionaux")
On peut connaître le séparateur décimal avec la variable DecimalSeparator exemple pour l'afficher dans un label : Label1->Caption = DecimalSeparator;
On peut aussi le changer en lui affectant une autre valeur ex: DecimalSeparator = ',';

Voir aide de C++ Builder : "variables de format"





Modifier plusieurs composants dans une boucle :

Exemple sur une Form (Form1) poser un bouton (Button1) et plusieurs TEdit. Nous allons affecter la valeur "Ok" à la propriété Text de tous les TEdits se trouvant sur la Form.

Sur l'événement OnClick de Button1 :

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    for ( int x=0 ; x<ControlCount ; x++)
         if ((AnsiString)Controls[x]->ClassName() == "TEdit" )
                  ((TEdit*)Controls[x])->Text = "Ok";
}




Index Suivant





C/C++
  Les pointeurs du C/C++.   Les listes chaînées.             Liste simple.             Liste triée.             Liste double.   Les arbres.   Les tas.   Le C orienté objets ?

  1 - La fenêtre principale.   2 - Contrôles et messages.   3 - Les commandes.   4 - Dialogue std.   5 - Contexte de périph.   6 - Dessiner.   7 - Les ressources.   8 - Dialogue perso.   9 - Dialogue comm.   10 - Les accélérateurs.

Assembleur
  Assembleur sous Visual C++.

C++ BUILDER
  Trucs et astuces.   Composant.   TRichEdit.   TDrawGrid.   Application MDI.   TThread.   wxWidgets.   Style Win XP.

  Première application.   Construire un menu.   Dessiner.   Sisers, Timers...   Dialogues standards.   Dialogues perso.

DotNet
  Composant C# Builder.   Contrôle WinForm.   Application MDI.

Java
  Applet java.





Copyright 2002-2016 CGi - Tous droits réservés CGi. Toutes reproduction, utilisation ou diffusion de ce document par quelque moyen que ce soit autre que pour un usage personnel doit faire l'objet d'une autorisation écrite de la part de l'auteur, propriétaire des droits intellectuels.
Les codes sources de ce document sont fournis en l'état. L'utilisateur les utilise à ses risques et périls, sans garantie d'aucune sorte de la part de l'auteur. L'auteur n'est responsable d'aucun dommage subi par l'utilisateur pouvant résulter de l'utilisation ou de la distribution des codes sources de ce document.
De la même façon, l'auteur n'est en aucun cas responsable d'une quelconque perte de revenus ou de profits, ou de données, ou de tous dommages directs ou indirects, susceptibles de survenir du fait de l'utilisation des codes sources de ce document, quand bien même l'auteur aurait été averti de la possibilité de tels dommages. L'utilisation des codes sources de ce document vaut acceptation par l'utilisateur des termes de la licence ci-dessus.

Contacter le responsable de la rubrique C