Domanda

ho un editor di proprietà (discendente di TPropertyEditor) che viene utilizzato per modificare una proprietà.

Quando arriva il momento di modificare la mia proprietà, come faccio a sapere quali proprietà della cosa oggetto che sto modificando?Se io vado a modificare una proprietà, ho bisogno di sapere che cosa la struttura che sto modificando.

sto tirando i capelli fuori, setacciando la Delphi aiuto, l'aiuto in linea, e il TPropertyEditor e discendente del codice sorgente, e non riesco a trovare la risposta.

mi aspettavo qualcosa come:

TPropertyEditor = class(...)
public
    procedure Initialize(TheObject: TObject; ThePropertyName: string);
end;

Per quanto posso dire, la mia proprietà editor è stato creato, e mi verrà detto di "Modifica", e ho solo la divina ciò che la struttura mi voleva modificare.


Dalla guida:

Modifica la proprietà dell'intero

Facoltativamente, è possibile fornire una finestra di dialogo dialogo in cui l'utente può visivamente modifica di una proprietà.L'uso più comune di editor di proprietà è di proprietà che sono esse stesse classi.Un esempio è il Font proprietà, per che l'utente può aprire una finestra di dialogo carattere casella di scegliere tutti gli attributi di il tipo di carattere in una sola volta.

Per fornire un tutta la proprietà nella finestra di dialogo editor, l'override della proprietà-editor della classe Modifica metodo.

Modifica i metodi utilizzano lo stesso Metodi Get e Set usato per la scrittura GetValue e SetValue i metodi.In infatti, un Modifica chiamate di metodo sia un metodo e un metodo Set.Perché il l'editor è specifico per il tipo, c'è di solito non c'è bisogno di convertire il i valori delle proprietà per le stringhe.L'editor generalmente si tratta del valore “come recuperati.”

Quando l'utente fa clic sul pulsante"..." accanto alla proprietà o il doppio click il valore della colonna, l'Oggetto di Ispezione chiama la proprietà dell'editor Modifica metodo.

All'interno della tua implementazione di il Modifica metodo, attenersi alla seguente procedura:

  1. Costruire il vostro editore per la proprietà.
  2. Leggere la corrente valore e assegnarlo alla proprietà utilizzando un metodo Get.
  3. Quando l'utente consente di selezionare un nuovo valore, assegnare il valore per la struttura, utilizzando un metodo Set.
  4. Distruggere l'editor.

Risposta

E ' nascosto, e non è documentata, ma ho scoperto come.Le proprietà sono di editing che mi modifica:

TheCurrentValue := TMyPropertyThing(Pointer(GetOrdValue));

Ora che ho il valore, posso modificarlo.Se voglio sostituire la proprietà con un altro oggetto:

SetOrdValue(Longint(TheNewValue));

Il codice completo:

Creare un editor di proprietà che scende dal TClassProperty:

TMyPropertyEditor = class(TClassProperty)
public
   procedure Edit; override;
   function GetAttributes: TPropertyAttributes; override;
end;

First è il servizio di pulizia, dicendo di Delphi oggetto di ispezione che il mio editor di proprietà verrà visualizzata una finestra di dialogo, questo farà un "..." appare accanto alla proprietà:

function TMyPropertyEditor.GetAttributes: TPropertyAttributes;
begin
   //We show a dialog, make Object Inspector show "..."
   Result := [paDialog];
end;

La prossima è il lavoro effettivo.Quando l'utente fa clic sul pulsante"...", l'oggetto di ispezione chiama il mio Modifica metodo.Il trucco che mi mancava, che io chiamo il mio GetOrdValue metodo.Anche se la mia proprietà non è un ordinale, si usa ancora, e appena lanciato la risultante cosa a un oggetto:

procedure TMyPropertyEditor.Edit;
var
   OldThing: TMyPersistentThing;
   NewThing: TMyPersistentThing;
begin
   //Call the property's getter, and return the "object" i'm editing:
   OldThing:= TMyPersistentThing(Pointer(GetOrdValue));

   //now that i have the thing i'm editing, do stuff to "edit" it
   DoSomeEditing(OldThing);


   //i don't have to, but if i want to replace the property with a new object
   //i can call the setter:
   NewThing := SomeVariant(OldThing);
   SetOrdValue(Longint(NewThing));
end;
È stato utile?

Soluzione

Se ho capito la tua domanda, stai chiedendo come si suppone che, in realtà, il valore è necessario essere in modalità di modifica, soprattutto se l'oggetto in questione contiene più di uno di loro.La risposta è che l'IDE set up per te e il property editor viene "precaricato" al momento in cui Modifica è chiamato.TPropertyEditor arriva con un sacco di GetValue metodi che la vostra funzione di Modifica può utilizzare per recuperare il valore.O se non è uno di quei tipi, (se è un oggetto, sceso dal TPersistent, per esempio), allora è possibile chiamare GetOrdValue e cast il risultato di un TPersistent.

Inoltre, si potrebbe desiderare di check-out TJvPersistentPropertyEditor in JvDsgnEditors unità di JVCL di utilizzare come base di classe.Esso fornisce alcune funzionalità per voi.

BTW se si ha realmente bisogno, è possibile utilizzare il metodo GetName, che darà il nome della proprietà, ma di solito non è necessario.E stai attento se ereditando da qualcosa di diverso da TPropertyEditor stesso, come GetName è virtuale e può essere sostituito.

Altri suggerimenti

Un editor di proprietà mantiene le informazioni su cui gli oggetti e le proprietà di editing in privato FPropList variabile.L'IDE che riempie chiamando il vostro editor SetPropEntry metodo.Siete quindi in genere dovrebbe chiamare i vari metodi di TPropertyEditor per scoprire le proprietà di valore.

Non è davvero dovrebbero materia proprietà che ti è stato chiesto di modificare.La vostra proprietà editor modifica le proprietà di un particolare tipo.Per la modifica, l'editor fornisce un'implementazione di SetValue che converte la stringa dall'Oggetto di Ispezione in un valore di tipo appropriato per la proprietà, e quindi si chiama appropriato Set funzione, come SetOrdValue o SetIntfValue.L'intera proprietà di editing, l'IDE non chiamare SetValue.Invece, sarà chiamata Edit, e ci si aspetta di chiamata GetOrdValue o GetIntfValue (per esempio) te, dal tuo editor sa già che tipo di proprietà che è stato progettato per modificare.

Ricordate che editor di proprietà, in generale, può modificare più proprietà contemporaneamente.Il nome la proprietà sarà lo stesso per tutti, ma il tipo di componente a cui appartengono, possono variare, e quindi potrebbe aver getter e setter.Chiamate il vostro editor di proprietà del GetName metodo per scoprire il nome.Per ottenere gli oggetti, chiamata GetComponent per ogni indice da 0 a PropCount - 1.(Attenzione;non c'è il controllo della portata in quelli Get funzioni.) È inoltre possibile verificare se un determinato oggetto è in lista chiamando HasInstance.Il GetPropInfo metodo di dirvi il PPropInfo puntatore per il prima la struttura, ma non credo che sarà necessariamente uguale alla puntatori di tutte le altre proprietà.A parte questo, non ottenere l'accesso diretto alla PPropInfo dati, ma, ripeto, non dovrebbe importare.Se pensi che il tuo editor, è probabilmente facendo qualcosa di sbagliato;una nuova domanda con le informazioni più specifiche su sottostante compito.

Editor di proprietà si preoccupano solo (e sono registrato per) l' tipo della proprietà, non specifiche proprietà stessa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top