Comme vous le savez probablement, My Visual Database vous permet de styliser vos applications. Un style est une combinaison de l’apparence du titre de la fenêtre, des boutons et des couleurs des autres éléments de l’interface utilisateur. Le style de l’application est déterminé lors de la création de l’application en sélectionnant l’élément souhaité dans le menu principal de l’environnement de développement. La liste des styles est impressionnante, mais pas encore achevée. De plus, le style choisi par le développeur ne correspond pas toujours au thème du système d’exploitation, ce qui peut compliquer le travail de l’utilisateur final.

Envisagez la possibilité de modifier par programme le style de conception de l’application finale, ainsi que celle d’élargir la palette de styles.

La théorie

Lorsque vous sélectionnez un style dans l’environnement de développement, un fichier “style.vsf” est généré, qui se trouve à côté du fichier exécutable et contient toutes les informations nécessaires sur le style sélectionné. Ainsi, pour changer de style, il suffit de remplacer ce fichier par celui souhaité et de redémarrer l’application. Pour ce faire, nous allons créer un dossier Styles, dans lequel nous placerons à l’avance des fichiers avec des styles et les copierons si nécessaire. J’ai pu obtenir les 34 fichiers de style intégrés à My Visual Database, mais n’hésitez pas à ajouter les vôtres. Ils peuvent être trouvés sur Internet ou créés à l’aide de Delphi.

Commencer

Vous aurez besoin d’un tableau de chaînes pour stocker les noms de style et d’une variable de chaîne pour stocker le nom de style actuel.

var
  arStyles: array[0..34] of string; // Noms de style d'interface utilisateur
  currentStyleName: string; // style actuel
  // La sélection de style sera située dans le menu principal, il faut donc veiller à l'affiner avec un script qui doit être exécuté dans la section "begin end."Langage du code : Delphi (delphi)
procedure Init;
// initialisation
var
  tmpItem: TMenuItem;
  tmpTopItem: TMenuItem;
  tmpForm: TAForm;
  i: integer;
begin
  tmpForm := frmMain;
  // Initialisation de la liste des styles
  arStyles[0] := 'Défaut';
  arStyles[1] := 'Amakrits';
  arStyles[2] := 'AmethystKamri';
  arStyles[3] := 'AquaGraphite';
  arStyles[4] := 'AquaLightSlate';
  arStyles[5] := 'Auric';
  arStyles[6] := 'Carbon';
  arStyles[7] := 'CharcoalDarkSlate';
  arStyles[8] := 'CobaltXEMedia';
  arStyles[9] := 'CyanDusk';
  arStyles[10] := 'CyanNight';
  arStyles[11] := 'Glossy';
  arStyles[12] := 'Glow';
  arStyles[13] := 'GoldenGraphite';
  arStyles[14] := 'IcebergClassico';
  arStyles[15] := 'LavenderClassico';
  arStyles[16] := 'Light';
  arStyles[17] := 'LightGreen';
  arStyles[18] := 'Lilac';
  arStyles[19] := 'Luna';
  arStyles[20] := 'Material';
  arStyles[21] := 'MetropolisUIBlack';
  arStyles[22] := 'MetropolisUIBlue';
  arStyles[23] := 'MetropolisUIDark';
  arStyles[24] := 'MetropolisUIGreen';
  arStyles[25] := 'Obsidian';
  arStyles[26] := 'RubyGraphite';
  arStyles[27] := 'SapphireKamri';
  arStyles[28] := 'Silver';
  arStyles[29] := 'Sky';
  arStyles[30] := 'SlateClassico';
  arStyles[31] := 'SmokeyQuartzKamri';
  arStyles[32] := 'TabletDark';
  arStyles[33] := 'TabletLight';
  arStyles[34] := 'TurquoiseGray';
  // Style actuel - lire à partir du paramètre
  currentStyleName := GetStrIni( 'APP', 'Style', arStyles[0] );
  // Créer un élément de menu de niveau supérieur
  tmpTopItem := TMenuItem.Create( tmpForm );
  tmpTopItem.Name := 'mniStyles';
  tmpTopItem.Caption := 'Стили';
  tmpForm.Menu.Items.Insert(1,tmpTopItem);
  // Ajout des éléments de menu pour changer de style
  for i := 0 to Length(arStyles) - 1 do
  begin
    tmpItem := TMenuItem.Create( tmpForm );
    tmpItem.Name := 'mniSetStyle_'+IntToStr(i);
    tmpItem.Caption := arStyles[i];
    tmpItem.OnClick := @SetStyle_OnClick;
    tmpItem.RadioItem := True; // Sélection de points, boutons radio
    tmpItem.GroupIndex := 1; // Commutateurs dépendants
    tmpItem.Autocheck := True; // Interrupteur automatique au clic
    // Sélection du style courant
    if arStyles[i] = currentStyleName then
      tmpItem.Checked := True;
    tmpTopItem.Insert(i,tmpItem);
  end;
end;Langage du code : Delphi (delphi)

La commutation de style est implémentée dans le gestionnaire d’événements de sélection d’élément de menu. Tout d’abord, le fichier de style actuel est supprimé, puis le fichier sélectionné est copié, après quoi l’utilisateur est invité à redémarrer le programme pour que les modifications prennent effet.

procedure SetStyle_OnClick (Sender: TObject; );
// Changement de style
var
  tmpItem : TMenuItem;
  tmpCurFile : string;
  tmpNewFile : string;
begin
  tmpItem := TMenuItem(Sender);
  currentStyleName := tmpItem.Caption;
  // Supprimer les caractères spéciaux qui ont été ajoutés automatiquement
  currentStyleName := ReplaceStr(currentStyleName,'&','');
  SetStrIni( 'APP', 'Style', currentStyleName );
  tmpCurFile := ExtractFilePath(Application.ExeName)+'style.vsf';
  tmpNewFile := ExtractFilePath(Application.ExeName)+'Styles\'+currentStyleName+'.vsf';
  // Supprimer le style courant
  DeleteFile( tmpCurFile );
  // Copier le fichier avec style
  if FileExists(tmpNewFile) then
    CopyFile(tmpNewFile, tmpCurFile);
  // Message d'avertissement
  if MessageBox(''Un redémarrage du programme est nécessaire pour appliquer les modifications. Le faire maintenant?','Changement de style',MB_OKCANCEL ) = mrOK then
  begin
    frmMain.Close; // Ferme l'application en cours. En fait, cette commande ne crée qu'un message, en fait, la fermeture interviendra après la fin de la procédure en cours.
    OpenFile( Application.ExeName ); // Lancement de l'application
  end;
end;Langage du code : Delphi (delphi)

Afin de déterminer quel style est défini dans le programme, les informations correspondantes sont stockées dans le fichier settins.ini, qui utilise une procédure et une fonction pratiques pour écrire et lire des don-nées :

procedure SetStrIni(ASection: string; AKey: string; AVal: string);
// Ecriture d'une seule valeur de chaîne dans les paramètres
var
  tmpIniFile: TIniFile;
begin
  tmpIniFile := TIniFile.Create(Application.SettingsFile);
  tmpIniFile.WriteString(ASection, AKey, AVal);
  tmpIniFile.Free;
end;
 
function GetStrIni(ASection: string; AKey: string; ADefVal: string = ''): string;
// Lit une valeur de chaîne unique à partir du paramètre
var
  tmpIniFile: TIniFile;
begin
  tmpIniFile := TIniFile.Create(Application.SettingsFile);
  Result := tmpIniFile.ReadString(ASection, AKey, ADefVal);
  tmpIniFile.Free;
end;Langage du code : Delphi (delphi)

Résultat

Changer le style est devenu une question de deux clics dans une application en cours d’exécution et ne nécessite pas de compiler le projet.

Optez pour le style de votre choix

Créer ses propres styles

Épilogue

La méthode décrite ci-dessus est assez simple, mais malheureusement, elle ne fonctionnera pas correctement si l’application est installée dans le dossier “Program Files”, que le système d’exploitation Windows surveille avec une attention particulière pour les modifications. Par conséquent, cette méthode ne convient que pour la version portable de l’application.

La deuxième limitation est liée au fait que tous les composants inclus dans les éléments de l’interface utilisateur ne prennent pas entièrement en charge la technologie de changement de style. Mais c’est à vous de décider à quel point ce sera critique.

Je recommande également de prévisualiser les styles, car certains d’entre eux me semblent ennuyeux ou gênants en raison de la mauvaise lisibilité du texte. Mais personne ne vous oblige à créer votre propre style unique ! Un autre problème peut être celui des combinaisons de la couleur du thème et de la couleur des images sur les boutons, mais cela peut être facilement résolu, par exemple, en utilisant la technologie décrite dans mon article “Button Pictures” 

Liens

Traduction : Yann Yvnec

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *