Recherche
1 connecté

  Actuellement : 1 commentaire Delphi 8 premier pas (1)

Delphi.NET : récupération d'un projet D7 ou moins (partie 1)

dernière mise à jour le : dimanche 16 mai 2004

Retour au sommaire

 

Premiers essais

Dans une certaine mesure, Delphi.NET est capable de récupérer les anciennes applications sous réserve qu'elles aient été développées proprement, sans appel direct aux API, sans utilisation des PChar, des adresses (@) etc...

Le mieux est donc d'essayer.

Premier essai : le programme "la calculette" que l'on trouve dans le tutoriel pour débutant. On fait fichier, ouvrir un projet, on charge ce projet, on compile et.... ça marche !

Bon ok, mais en est il de même pour des programmes un peu plus compliqués, par exemple ceux qui attaquent la base de registre.
Testons avec l'exemple registre.zip On charge le projet. F9 et ....ça marche !

Et les transtypage du style if TButton(Sender).Name='Button2' ?
Testons avec l'exemple
Création d'un controle à l'exécution. F9 et ....ça marche !

 

Cas de l'API ShellExecute (permet d'ouvrir un fichier. Par exemple pour lancer une application)

Prenons l'exemple Ouvrir la boite de dialogue de propriété d'un fichier. (y retirer ce qui correspondait à l'ancienne méthodes pour D1)

L'API ShellExecute s'appelait ainsi :

procedure TForm1.Button2Click(Sender: TObject); 
begin 
  ShellExecute (handle,'Open', PChar(EditNomFichier.Text) ,
  PChar(Edit2.Text), PChar(Edit3.Text),SW_SHOWNORMAL);
end; 

Tiens, des PChar, normalement ça ne passe pas. Testons.

F9 et effectivement, le compilateur me met "transtypage incorrect" pour les PChar(..).

Laissons la souris sur le mot ShellExecute, on voit la nature des paramètres nécessaires :


Tiens, plus de PChar mais des Strings !

Ok, je modifie le code comme suit :

procedure TForm1.Button2Click(Sender: TObject); 
begin 
  ShellExecute (handle,'Open', EditNomFichier.Text ,
  Edit2.Text, Edit3.Text,SW_SHOWNORMAL);
end; 

F9 et ... Ca marche ! En .NET, Les "API" s'attaquent maintenant avec des paramètres de type différents. En particulier, les PChar non transmis par adresse ont été remplacés tout simplement par des strings.

Cas de l'API GetWindowsDirectory (Permet de récupérer où se trouve le dossier Temporaire)

Prenons le source D7 suivant :

procedure TForm1.Button1Click(Sender: TObject);
var szChemin:array[0..MAX_PATH-1]of char;
begin
  if GetTempPath(SizeOf(szChemin),szChemin)>0 then  
  Label1.Caption:=string(szChemin) else ShowMessage('erreur');
end;

Il fonctionne parfaitement en D5, D6, D7 mais qu'en est-il avec Delphi.Net ?

Le chemin recherché est récupéré au travers de la variable de type PChar (szChemin:array[0..MAX_PATH-1]of char; est une déclaration compatible avec les PChar).

Si on compile, on a bien sur une erreur : "Types incompatibles : 'StringBuilder et 'Array' et effectivement, si on regarde la déclaration de GetTempPath (Pour la voire, il suffit de laisser la souris sur le mot GetTempPath) on obtient :

L'ancien paramètre PChar a été remplacé par un StringBuilder.

Utilisation de la classe StringBuilder :

Cette classe a été créé spécialement pour ce genre de situation.

Pour l'utiliser, il faut ajouter System.Text dans les uses :

 

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, System.ComponentModel, Borland.Vcl.StdCtrls, System.Text;
  • Il faut commencer par créer notre StringBuilder. Ici, on en profite pour lui indiquer la taille maxi du texte : CheminStringBuilder:=StringBuilder.Create(MAX_PATH);
    Il existe plusieurs possibilités pour la création ici, on a choisi la syntaxe StringBuilder(capacity :integer); la capacity représente la taille autorisé pour le texte.

  • CheminStringBuilder.Capacity contient la taille maxi du texte. Elle remplace SizeOf(szChemin) dans l'ancien appel à l'API

  • Enfin, ToString permet d'accéder à la valeur sous la forme d'un string.

  • A noter qu'il est inutile de faire un CheminStringBuilder.free car on est dans .NET. Il dispose d'un garbage collector (ramasse miette) qui s'occupe de libérer la mémoire qui n'est plus référencée par rien.

procedure TForm1.Button1Click(Sender: TObject); 
var CheminStringBuilder: StringBuilder; 
begin 
  CheminStringBuilder:=StringBuilder.Create(MAX_PATH); 
  if GetTempPath(CheminStringBuilder.Capacity, CheminStringBuilder)>0 then 
  begin 
    ShowMessage(CheminStringBuilder.ToString) ; 
  end; 
end; 

 

Retour au sommaire