Fonctionnalités du shell avec Lazarus

Lazarus Logo

J’essaye en ce moment de converir un composant Delphi vers Lazarus. Le travail se passe bien mais j’ai quelques difficultés à trouver des équivalent multi-plateforme FPC/Lazarus. Ceci serait fatalement complexe puisques ces fonctions concerne l’integration du shell (comprendre fonction de bas niveau du bureau) et chacun a sa propre approche.

Voici le code classique qui me donne des maux de tête :

//Cette fonction spécifique à Windows devrais être difficile à convertir
//On aurais besoin ici de quelque chose utilisant les types mime, de toute façon
//beaucoup plus de code serais nécéssaire...
procedure GetFileExtensionShellDescription(Ext: string;
var FileTypeName: string; var ShellImageIndex: Integer);
var
  I, J: Integer;
  T: string;
  L: TImageList;
  sFI: TSHFileInfo; //Spécifique à Windows mais un autre type pourrais être équivalent
  Icon: TIcon;
  PCh: PChar;
  P: PFileDescriptionRecord;

begin
  FileTypeName := '';
  I := RegisteredExtensions.IndexOf(Ext); //un TStringList défini en variable globale
  if I = -1 then
  begin
    New(P);
    P^.FileType := '';
    Icon := TIcon.Create;
    for J := 0 to 1 do
    begin
      if J = 0 then
        L := ShellSmallImageList
      else
        L := ShellLargeImageList; //les deux sont des TImageList
      GetMem(PCh, MAX_PATH);
      GetTempPath(MAX_PATH, PCh); //ces lignes peuvent être remplacés
      T := PCh + 'TEMP' + Ext;     //par GetTempDir dans FileUtil
      FreeMem(PCh);
      TFileStream.Create(T, fmCreate or fmOpenWrite).Destroy;
      //ce qui suit est le plus gros problème... Impossible de trouver un
      //équivalent avec Lazarus. Des idées ? Les types Mime et l'implémentation
      //FreeDesktop devraient fournir ceci...
      if SHGetFileInfo(PChar(T), 0, sFI, SizeOf(sFI),
        SHGFI_TYPENAME or SHGFI_ICON or
        (SHGFI_SMALLICON * (1 - J) + J * SHGFI_LARGEICON)) <> 0 then
      begin
        Icon.ReleaseHandle;
        Icon.Handle := sFI.hIcon;
        P^.FileType := sFI.szTypeName;
      end;
      P^.OpenImageIndex := L.AddIcon(I);
      P^.CloseImageIndex := P^.OpenImageIndex;
      if J = 1 then
        I := RegisteredExtensions.AddObject(Ext, TObject(P));
    end;
    Icon.Destroy;
  end;
  with PFileDescriptionRecord(RegisteredExtensions.Objects[I])^ do
  begin
    ShellImageIndex := CloseImageIndex;
    FileTypeName := FileType;
  end;
end;

Le problème a l’air simple, nous avons juste besoin de retrouver les icones du système pour chaques extentions de fichiers mais rien n’est actuellement disponible dans Lazarus pour le faire simplement. Je sais que FreeDesktop fourni un interface commun pour tout les environnements de burreau modernes sous Linux, autorisant ce genre de fonctionnalités, de telle sorte que baucoup de logiciels n’utilisant pas la même API peuvent le faire (ex. des applications Gnome lancées sous KDE qui utilisent les thèmes de KDE). Y a-t-il un moyen d’envisager une telle implementation qui est la base de l’intégration du burreau ? Ceci devrais être une excellente valeur ajoutée à Lazarus…

Introduction à YaPeTaVi – Yet another Periodic Table Viewer

An english version of this post is available after french version.

Internet IconComme je le disais dans un précédent article, je projette de porter tout mes anciens logiciels de Delphi vers Lazarus. Le premier sera YaPeTaVi pour Yet another Periodic Table Viewer. (Encore un autre Visualisateur de Tableau Périodique). Il était auparavent un simple analyseur de masse moléculaire et est devenu, après quelques cogitations et une presque complète ré-écriture de l’application, un logiciel d’étude complet. Il est prévu les fonctions suivantes pour la première version bêta :

  • Visualiseur de tableau périodique avec support de la colorisation par bloc atomique ou famille, ou des dégradés pour les dates de découvertes, point de fusion, point d’ébulition, affinité électronique, rayon de covalence, rayon de Van Der Waals, électronégativité et énergie de première ionisation.
  • Liste supportant les options de trie pour un affichage d’informations détaillé sur les éléments et lien vers l’article de Wikipédia en relation.
  • Systéme de graphique représentant les valeurs numérique sur deux axes avec choix d’intervals multiples.
  • Système multi-filtres disponible pour le tableau periodique, la liste et le graphique.
  • Base de donnée des molécules (ou ion) avec informations et calculs.

Je réfléchi également à de nombreuses améliorations comme un visualisateur de configuration électronique, d’avantage de controles sur le composant de graphique et des informations sur les isotopes.

Vous pouvez maintenant télécharger le code source avec SVN (la seule version disponible est une pré-alpha) en utilisant la commande suivante :

svn co svn://svn.tuxfamily.org/svnroot/geofperspage/gppsvn/trunk/yapetavi

Si vous êtes sous Windows vous devriez utiliser TortoiseSVN pour ce faire. Alternativement, vous pouvez parcourir le code à cette adresse : http://svn.tuxfamily.org/viewvc.cgi/geofperspage_gppsvn/trunk/yapetavi/ du dépot SVN. Vous aurez besoin d’une version récente de Lazarus depuis SVN (trunk), de FPC version >= 2.3.1 et du composant annexe TChart installé (il est distribué avec Lazarus mais pas compilé par défaut). Si vous avez besoin d’aide, pour la compilation (ou autre), contactez moi.

Si vous voulez donner un coup de main, vous êtes plus que le bienvenue. En plus des amméliorations que j’ai listé, j’ai besoins de tests sous Windows ou MacOS et une idée pour organiser les informations sur les isotopes.

Une page sur ce site permettra d’accéder à l’ensemble des informations habituelles (changelog, documentations, instruction de compilation/installation détaillé…). Les news resteront sur le blogs.

English version:
Internet Icon As I was saying in a previous article I project to port all my old software from Delphi to Lazarus. The first on to come will be YaPeTaVi for Yet another Periodic Table Viewer. It was formerly a simple molecular mass analyzer and become, after some brain-storming and a nearly full rewrite of the application, a full featured analysis software. It’s project to include the following functions for the first beta version:

  • Periodic table viewer with colorization support depending on atomic block or family, or gradients for discovery dates, melting point, boiling point, electronic affinity, covalent radius, Van Der Waals radius, electronegativity and first ionization energy.
  • List supporting sorting options for detailed element information and a link to the appropriate Wikipedia article.
  • Graph system representing numerical values on two axis with multiple range selection.
  • Multi-filtering system available for periodic table, list and graph.
  • Molecule (or ion) database with information.

I’m also thinking of several improvements like electronic configuration viewer, more controls on graph widget and isotope information.

You can actually download source code via SVN (the only available version is an early prealpha) by using one of the following command:

svn co svn://svn.tuxfamily.org/svnroot/geofperspage/gppsvn/trunk/yapetavi

If you are a Windows user you may use TortoiseSVN to do so. Alternatively you can browse the code at the address: http://svn.tuxfamily.org/viewvc.cgi/geofperspage_gppsvn/trunk/yapetavi/ of the SVN repository. You will need a recent SVN version of Lazarus, FPC version >= 2.3.1 and the optional TChart component installed (it’s distributed with Lazarus anyway but not compiled by default). If you need help, about compiling or anything else just contact me.

If you want to help you’re more than welcomed. In more of the improvement I’ve listed, I need some test on Windows or MacOS and an idea to organize information on elements isotopes.

A page on this website will give you access on all the usual information (changelog, documentation, detailed compiling/installing instruction…). The news will stay on this blog.

Sur Lazarus

KDE LogoJe n’étais pas mauvais en programmation Delphi jusqu’en 2002. J’utilisais aussi beaucoup Borland Pascal 7 principalement a cause de mes études. C’était pour moi une expèrience intéressante et vraiment amusante. Après avoir totalement oublié Windows, j’ai été forcé de laisser tomber la programmation Delphi en même temps. Bien sûr il y avais Kylix, mais il n’était pas une très bonne alternative :

  • Logiciel propriétaire, et très onéreux
  • Il ne fonctionnais pas sur ma Suse Linux 9.1 que (je crois) j’avais à l’époque
  • Sur ma machine Red Hat il était très instable

C’est pour toutes ces raisons qu’un petit groupe à décidé de se lancer dans la programmation de leurs propres version de Delphi, à partir de rien. Le projet Lazarus était né. Aujourd’hui je l’utilise de manière très agréable et toute les fonctions essencielles de Delphi sont présentes et même plus. Quelques autres fonctions sont encore manquantes (le projet à besoin de plus de dévellopeur) mais on peut d’hors et déjà tout faire avec.

Si vous connaissez quelque chose à la programmation en langage Pascal, vous pouvez aider au développement de Lazarus ici.

Je redécouvre maintenant le plaisir de programmer dans mon langage favori et je porterais certain de mes anciens logiciel sous FPC/Lazarus. C’est un travail immence pour l’un d’eux mais les autres seront bientot disponible. Alors, à bientot !