2012-02-08 10 views
5

Attualmente sto cercando di sviluppare un progetto basato su Firemonkey. Sto usando Firemonkey per le sue caratteristiche dell'interfaccia utente, dato che il progetto consiste di molte applicazioni più piccole, ognuna con un aspetto 3D. Attualmente sto solo sviluppando/implementando su Windows con il framework FMX, ma potrei passare da una piattaforma all'altra in un secondo momento.Firemonkey - Gestione messaggi

Mi sono imbattuto nella maggior parte dei problemi che ho incontrato costruendo un'applicazione VCL Windows in background per eseguire un'azione molto specifica e quindi creando un frontend FMX. Tuttavia, questo è adatto solo quando si desidera eseguire l'applicazione solo per eseguire l'azione che è stata progettata, e quindi eseguire l'applicazione con parametri. In una delle applicazioni, ho sentito la necessità di usare messaggi (o qualcosa di simile). Ad esempio, nella mia applicazione FMX, se clicco su "button1", voglio che invii un messaggio all'applicazione VCL in background per eseguire "action1", piuttosto che eseguirlo con i parametri.

Un buon esempio potrebbe essere usando l'VCL TMediaPlayer nella domanda di fondo, con l'applicazione front-end FMX utilizzato per visualizzare le informazioni e fornire il controllo di riproduzione, pausa, ecc Tale che diventa essenzialmente un FMX UI con abilità VCL.

Sono stati finora in grado di trovare qualsiasi cosa su come i messaggi (ad esempio in VCL, sarebbero fatte con "SendMessage" o "PostMessage" o qualcosa di simile) sono gestite con FireMonkey, sia attraverso il locale file di aiuto, o tramite googling esteso. Tutto quello che ho trovato è stato collegato alla posta elettronica (presumibilmente a causa della parola "Messaggio" nella maggior parte dei miei termini di ricerca).

Can anyone point me in the right direction on how messages would be handled with Firemonkey/FMX?

saluti, Scott Pritchard

+2

Sai che puoi usare VCL e FMX nella stessa procedura di app, vero? Bene, ci vuole un po 'di lavoro in più, ma è tecnicamente possibile, e ci sono librerie e articoli di terze parti che mostrano come farlo. Quindi non avresti bisogno di gestire direttamente i messaggi della finestra se potessi semplicemente chiamare il metodo 'Click()' del pulsante VCL da un gestore di eventi UI FMX (o meglio isolare il codice condiviso nella sua funzione che sia VCL che FMX possono chiamare quando necessario). –

risposta

4

mia comprensione è che FireMonkey non si basa su finestre tradizionali, quindi l'invio di messaggi di finestra per FireMonkey controlli di solito non è un'opzione. Sebbene alcuni controlli utilizzino Windows (in particolare, TCommonCustomForm), è possibile utilizzare la funzione FmxHandleToHWND() nell'unità FMX.Platform.Win per estrarre uno HWND da un TFmxHandle quando necessario. Non ho idea di come ricevere e personalizzare i messaggi della finestra di elaborazione nei controlli FMX, se ciò è possibile.

Firemonkey in Windows ha accesso all'API Win32, quindi non ci dovrebbe essere nulla che ti impedisce di inviare messaggi di finestra ad altri controlli con finestre, come l'interfaccia utente VCL. Includere l'unità Winapi.Windows nella clausola uses per accedere alle funzioni dell'API Win32, proprio come fareste in un'applicazione VCL.

UPDATE: perché FireMonkey non espone l'accesso ai messaggi che vengono inviati alla finestra di un modulo, è necessario sottoclasse manualmente la finestra al fine di ricevere messaggi prima FireMonkey li vede. È possibile ignorare il metodo CreateHandle() del modulo, chiamare prima il metodo inherited per creare la finestra, quindi utilizzare FmxHandleToHWND() per ottenere lo HWND che è possibile creare una sottoclasse. Assicurati di ignorare anche il metodo DestroyHandle() per rimuovere la sottoclasse prima di chiamare inherited per rilasciare HWND.

3

Attualmente, FireMonkey non ha un gestore di messaggi che è possibile utilizzare per inviare e inviare messaggi.

C'è la possibilità di collegare cose usando ascoltatori come FireMonkey funziona internamente, ma nessuno di essi è documentato.

Così, invece, ecco cosa ho fatto:

ho creato il mio "messaggio" classe personalizzata. Creo le istanze della classe e le aggiungo a una lista thread-safe da qualsiasi thread necessario. Sul thread principale, ho un timer che controlla l'elenco ed elabora i "messaggi".