2014-12-16 28 views
5

Sto lavorando su delphi XE2.
Cosa mi serve:
Ho bisogno della classe MyFrame con frame senza componenti visibili, ma con il nuovo evento visibile in Object Inspector. Questo evento informerà il mio modulo (sul quale verrà inserito l'oggetto MyFrame), che per esempio tutti i dati sul frame vengono riempiti.delphi - Creazione di frame personalizzati con nuovo evento

Quello che ho:
Sulla base this post e la risposta del TOndrej, e that hint, dove spettacoli Ba, che per XE2 abbiamo bisogno di sostituire

delphivclide := GetModuleHandle('delphivclide160.bpl'); 

con questo:

delphivclide := GetModuleHandle('vcldesigner160.bpl'); 

Ho quel codice per il nuovo frame:

unit MyFrame; 
interface 
uses 
    System.Classes, Vcl.Forms; 
type 
    TMyFrame = class(TFrame) 
    private 
    protected 
    FOnFilledData : TNotifyEvent; 
    public 
    published 
    property OnFilledData : TNotifyEvent read FOnFilledData write FOnFilledData; 
    end; 
implementation 
end. 

E che codificano per l'unità di registrazione:

unit MyFrameReg; 
interface 
procedure Register; 

implementation 
uses Windows, DesignIntf, Dialogs, wFrame; 

procedure Register; 
var 
    delphivclide: THandle; 
    TFrameModule: TCustomModuleClass; 
begin 
    delphivclide := GetModuleHandle('vcldesigner160.bpl'); 
    if delphivclide <> 0 then 
    begin 
    TFrameModule := GetProcAddress(delphivclide, '@[email protected]@'); 
    if Assigned(TFrameModule) then 
    begin 
     ShowMessage('I''m here'); 
     RegisterCustomModule(TMyFrame, TFrameModule); 
    end; 
    end; 
end; 
end. 

Quando Io edificherò il mio pacchetto, ho il messaggio Sono qui, così ho supossed, che il MyFrame è registrato.

Qual è il mio problema:
Il problema è che dosn't lavoro fino alla fine.
Quando scelgo Nuova applicazione VCL e desidero creare MyFrame scegliendo File -> Nuovo -> Altro -> Progetti Delphi -> MyFrame, viene visualizzata una finestra strana mostrata di seguito.
Selezionando una directory e facendo clic sul pulsante OK, il nuovo progetto Delphi viene chiuso e viene aperto il progetto del pacchetto.

the window

sarò molto contento, se qualcuno mi può consigliare, che cosa ho fatto di sbagliato.

+3

Si sta utilizzando un mod non documentato non supportato. Forse l'implementazione è cambiata. Dopotutto, l'IDE ora ha il nuovo designer FMX. Nessuna sorpresa che le cose possano essere diverse. –

+0

@DavidHeffernan La documentazione ufficiale fa schifo solo quando è necessario fare cose del genere ... –

risposta

1

registrazione A. classe Frame

Non v'è alcuna necessità di farlo in un "modo hacky"

uses 
... 
    DMForm, 
    VCLFormContainer, 
... 

procedure Register; 
begin 
... 
    RegisterCustomModule(TYourFrameClass, TFrameModule); // for frames 
    RegisterCustomModule(TYourModuleClass, TDataModuleCustomModule); // for data modules 
... 
end; 

C'è un altro modo per aggirare per aggiungere cornici troppo

type 
    TNestableWinControlCustomModule = class (TWinControlCustomModule) 
    public 
    function Nestable: Boolean; override; 
    end; 

function TNestableWinControlCustomModule.Nestable: Boolean; 
begin 
    Result := True; 
end; 

+

RegisterCustomModule(TYourFrameClass, TNestableWinControlCustomModule); 

nomi di unità (testati in XE7):

TCustomModule =>DesignEditors

TDataModuleCustomModule =>DMForm (designide.DCP)

TWinControlCustomModule =>WCtlForm (designide.dcp)

TFrameModule =>VCLFormContainer (vcldesigner.dcp)

Suppongo che per FireMonkey dovrebbe essere possibile in simili way (trova fmxdesigner.dcp & controlla cosa c'è dentro Notepad ++)

B. Per utilizzarlo nella procedura guidata "Nuovo ..." è necessario registrare la classe guidata. Se non si ha il tempo di scrivere la classe della procedura guidata, è sufficiente creare una nuova cornice e quindi sostituire il nome della classe genitore manualmente e aggiungere l'unità appropriata nell'elenco "usi". Questo è tutto

PS. Nelle vecchie versioni di Delphi c'era TDataModuleDesignerCustomModule metaclasse invece di TDataModuleCustomModule nell'unità DMDesigner

PPS. Altri nomi metaclasse esistenti:

TCustomFormCustomModule

TIDESourceModuleCustomModule

+1

Sto testando su Delphi XE7 ma dice "file non trovato VCLFormContainer.dcu". ('DesignIDE' è nella clausola' requires'). Cosa manca? – ExDev

+0

@ExDev Hai ragione - Ho corretto il mio post ** Aggiungi _vcldesigner_ nei moduli richiesti per i frame ** –

+0

Ho controllato e ** designide.dcp **/** fmxdesigner.dcp **/** vcldesigner.dcp ** esiste ancora in ** Delphi 10.2 Tokio **;) –