par , 17/07/2022 à 10h53 (3729 Affichages)
Sur un projet j'avais besoin de curseurs personnalisés et autant on trouve pléthore de documentation pour le faire en VCL autant on en trouve très peu en FMX.
Heureusement la communauté est là et grâce à leurs conseils j'ai eu la solution et bien entendu je la partage avec vous ici.
Je me suis principalement inspiré de cette vidéo
Étape 1 création de ressources:
Tout d'abord vous allez créer des ressources en utilisant le gestionaire de ressource de votre projet
Vous ajoutez vos curseurs (fichier .cur) aux ressources de votre projet. Dans mon cas il y en a 3. Ensuite vous attribuez comme identificateur de ressource une valeur numérique différente à chaque curseur.
Dans mon cas j'ai attribué les valeurs respective de 32801,32802,32803
Étape 2 ajout d'une classe CursorService:
C'est cette classe qui va gérer le changement de curseur.
Il faut ajouter dans les uses
La déclaration
1 2 3 4 5 6 7 8 9 10 11
|
TMyCursorService = class(TInterfacedObject, ifmxCursorService)
private
class var FMyService: TMyCursorService;
class var FCursor: TCursor;
class var FOldWinPlatformService: ifmxCursorService;
public
class constructor Create;
procedure SetCursor(const ACursor: TCursor);
function GetCursor: TCursor;
end; |
L'implémentation
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
|
{ TMyCursorServicze }
class constructor TMyCursorService.Create;
begin
FMyService := TMyCursorService.Create;
FOldWinPlatformService := ifmxCursorService(TPlatformServices.Current.GetPlatformService(ifmxCursorService));
TPlatformServices.Current.RemovePlatformService(ifmxCursorService);
TPlatformServices.Current.AddPlatformService(ifmxCursorService, FMyService);
end;
function TMyCursorService.GetCursor: TCursor;
begin
Result := FCursor;
end;
procedure TMyCursorService.SetCursor(const ACursor: TCursor);
const
MyCursorMap: array [1 .. 3] of PChar = (my_curs_1, my_curs_2, my_curs_3);
var
NewCursor: HCURSOR;
begin
FCursor := ACursor;
if FCursor in [1 .. 3] then
begin
NewCursor := LoadCursorW(HInstance, MyCursorMap[FCursor]);
WinApi.Windows.SetCursor(NewCursor);
end
else if assigned(FOldWinPlatformService) then FOldWinPlatformService.SetCursor(ACursor);
end; |
Étape 3 intégration à votre application:
Tout d'abord il faut créer l'obet CursorService pour cela le mieux est de placer sa création dans l'évènement Oncréate de votre Form
1 2 3 4 5
|
procedure TForm2.FormCreate(Sender: TObject);
begin
TMyCursorService.Create;
end; |
Ensuite vous devez créer des constantes avec la correspondance des valeurs numériques que vous avez saisies dans le gestionnaire de ressouces de votre projet
1 2 3 4 5
|
const
my_curs_1 = PChar(32802);
my_curs_2 = PChar(32801);
my_curs_3 = PChar(32803); |
Étape 4 Utilisation:
Pour utiliser vos curseurs personnalisé il suffit d'indiquer l'index du curseur dans la propriété Cursor des éléments de votre Form.
Si vous voulez le faire par programmation, il suffit de modifier la valeur cursor de votre élément.
Exemple:
Voilà c'est tout.
Je tiens à remercier tous les gens qui m'ont aidé sur le sujet et plus particulièrement sergiomaster et pprem