Domanda

Per evitare singleton e variabili globali, vorrei poter passare i parametri a un componente TFrame. Tuttavia, poiché un TFrame è normalmente incluso nel modulo in fase di progettazione, è possibile utilizzare solo il costruttore predefinito.

Il modulo padre può ovviamente impostare alcune proprietà nel callback di OnCreate dopo la creazione di TFrame. Tuttavia, ciò non garantisce che una proprietà non venga dimenticata e che le dipendenze non siano così chiare come l'utilizzo di un costruttore.

Un modo carino sarebbe se fosse possibile registrare una factory per la creazione di componenti durante la lettura del file dfm. Quindi i parametri richiesti potrebbero essere passati al costruttore TFrame quando creati dalla fabbrica. C'è un modo per raggiungere questo obiettivo?

O qualcuno ha una soluzione migliore su come passare i parametri a un TFrame?

È stato utile?

Soluzione

Tutti i componenti, compresi i discendenti di TFrame , devono poter essere costruiti usando il costruttore ereditato da TComponent . Altrimenti, non possono essere utilizzati correttamente in fase di progettazione. Se la limitazione dell'uso del design-time è accettabile per te, allora potresti scavalcare quel costruttore e sollevare un'eccezione. Ciò impedirebbe che il componente venga inserito in un modulo in fase di progettazione. Basta fornire qualche altro costruttore che richiede altri parametri.

A causa del requisito in fase di progettazione, tutti i componenti devono poter esistere con alcune o tutte le loro proprietà ancora ai loro valori predefiniti. Ciò non significa che i componenti debbano fare cose utili mentre si trovano in quello stato, ma devono essere in grado di rimanere in quello stato indefinitamente. Dovrebbe essere OK, ad esempio, posizionare un componente su un modulo, salvare il modulo e chiudere Delphi, con l'intenzione di riprendere la progettazione del modulo in un secondo momento. Il componente dovrebbe consentire a se stesso di essere salvato e ripristinato, anche se tutte le sue proprietà non sono ancora state impostate per l'uso finale.

La mia opzione preferita è applicare le regole del componente solo in fase di esecuzione. Verificare che tutte le proprietà siano impostate su valori sensibili prima di consentirne l'utilizzo. È possibile utilizzare le asserzioni per imporre l'uso corretto dei componenti. I consumatori delle tue lezioni impareranno molto rapidamente se non hanno finito di impostare i componenti sui loro moduli.

Altri suggerimenti

Normalmente aggiungerei un "Inizializzazione" pubblica, non virtuale " o procedura (Inizializza per gli americani) che richiede la fornitura di tutti i parametri. Ciò imposterà quindi le proprietà.

Rendi le proprietà protette o private se possibile, quindi l'unico modo in cui possono essere impostate è chiamando Initialise (AFoo, ABar: integer).

Quindi in TFormXXX.FormCreate o TformXXX.Create, hanno:

inherited;
Initialise(foo, bar);

potresti creare / registrare componenti il ??tuo componente tFrame e inseriscilo nel modulo: la sua creazione potrebbe far passare qualsiasi cosa.

Se una factory può fornire i parametri di cui hai bisogno, perché non sovrascrivere il costruttore predefinito per il tuo frame e chiedere i parametri alla factory factory?

Di solito faccio il mio costruttore. Non mi piace comunque creare cornici in fase di progettazione.

a) un frame può essere creato dinamicamente quando richiesto e distrutto quando non necessario

b) assegnare al frame una proprietà pubblica con il tipo di dati del parametro o una struttura di dati e passare i valori al modulo tramite la proprietà.

Esempio:
TAddress - una classe per contenere i soliti elementi di un indirizzo.
TAddressFra - una cornice con i controlli visivi per visualizzare l'indirizzo

  • popola un'istanza di TAddress con valori
  • crea un'istanza di TAddressFra
  • assegna la proprietà TAddressFra.address con l'istanza TAddress
  • usa la procedura setAddress (o_address: TAddress) per assegnare i valori degli attributi TAddress ai corrispondenti componenti visivi sul TAddressFra
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top