2014-09-24 3 views
5

Devo usare il cursore personalizzato nel mio progetto desktop Firemonkey. Posso usare LoadCursorFromFile nel progetto VCL per caricare un cursore personalizzato nel mio progetto. Ho provato a fare lo stesso per Firemonkey ma non sta caricando il cursore. Esiste un modo per ottenere il caricamento di cursori personalizzati in Firemonkey?Come caricare il cursore personalizzato in Firemonkey?

uses Winapi.Windows; 

procedure Tform1.Button1Click(Sender: TObject); 
const mycursor= 1; 
begin 
    Screen.Cursors[mycursor] := LoadCursorFromFile('C:\...\Arrow.cur'); 
    Button1.Cursor := mycursor; 
end; 
+0

stai cercando una soluzione multipiattaforma? – RRUZ

+0

@RRUZ al momento mi serve per Windows solo per cambiare il cursore su viewport3d – Saeed

risposta

6

ho fatto solo questo per il Mac, ma l'idea generale è che si sceglie di implementare il proprio IFMXCursorService. Tieni presente che questo è praticamente un approccio tutto o niente. Dovrai implementare anche i cursori FMX predefiniti.

type 
    TWinCursorService = class(TInterfacedObject, IFMXCursorService) 
    private 
    class var FWinCursorService: TWinCursorService; 
    public 
    class constructor Create; 
    procedure SetCursor(const ACursor: TCursor); 
    function GetCursor: TCursor; 
    end; 

{ TWinCursorService } 

class constructor TWinCursorService.Create; 
begin 
    FWinCursorService := TWinCursorService.Create; 
    TPlatformServices.Current.RemovePlatformService(IFMXCursorService); 
    TPlatformServices.Current.AddPlatformService(IFMXCursorService, FWinCursorService); 
end; 

function TWinCursorService.GetCursor: TCursor; 
begin 
    // to be implemented 
end; 

procedure TWinCursorService.SetCursor(const ACursor: TCursor); 
begin 
    Windows.SetCursor(Cursors[ACursor]); // you need to manage the Cursors list that contains the handles for all cursors 
end; 

Potrebbe essere un necessario aggiungere una bandiera per la TWinCursorService in modo che impedirà il quadro FMX di ignorare il cursore.

Il tempo è importante quando si registra il proprio servizio cursore. Dovrà essere fatto dopo che FMX chiama TPlatformServices.Current.AddPlatformService (IFMXCursorService, PlatformCocoa);

+0

grazie per il tuo aiuto amico, testato e lavora per vincere abbastanza bene :) – Saeed

3

Sfortunatamente, FireMonkey non supporta cursori personalizzati. Questo è già stato archiviato come richiesta di funzionalità nel portale di qualità:

RSP-17651 Cannot load custom cursors in Firemonkey.

Con ciò detto, il codice che hai mostrato non funzionava in VCL. LoadCursorFromFile() restituisce un handle HCURSOR, ma la proprietà TControl.Cursor prevede invece un valore di indice dall'enumerazione TCursor. Non sono la stessa cosa. Quando si carica un cursore personalizzato, è necessario aggiungerlo all'elenco TScreen.Cursors[]. Questo è chiaramente indicato nella documentazione:

Vcl.Controls.TControl.Cursor

Il valore del cursore è l'indice del cursore nella lista dei cursori gestiti dal variabile globale, Schermo. Oltre ai cursori incorporati forniti da TScreen, le applicazioni possono aggiungere cursori personalizzati all'elenco.

Vcl.Forms.TScreen.Cursors

cursori personalizzati possono essere aggiunti alla proprietà cursori per l'utilizzo con l'applicazione o uno qualsiasi dei suoi controlli. Per aggiungere un cursore personalizzato a un'applicazione, è possibile ...:
...
2. Dichiarare una costante di cursore con un valore che non è in conflitto con una costante di cursore esistente.
...
4. Impostare la proprietà Cursors, indicizzata dalla costante di cursore appena dichiarata, sull'handle ottenuto da LoadCursor.

Ad esempio:

const 
    mycursor: TCursor = 1; // built-in values are <= 0, user-defined values are > 0 

procedure Tform1.Button1Click(Sender: TObject); 
begin 
    Screen.Cursors[mycursor] := LoadCursorFromFile('C:\...\Arrow.cur'); 
    Button1.Cursor := mycursor; 
end; 
+0

Errore mio, ho modificato il mio codice grazie. ma pensi che sarà possibile modificare e modificare il codice per TPlatform.SetCursor per farlo caricare i cursori personalizzati impedendogli di sovrascrivere i cursori ai cursori predefiniti? – Saeed