Cum de a menține o listă de
Acum nu-mi amintesc cum să păstreze o listă a obiectelor componente. Toate obiectele mostenitori TPersistent, dar nu de același tip - TCollection nu funcționează. Dacă cineva a făcut deja, spune-mi ce e mai bine. Lista în sine este proprietatea acum TObjectList nu au fost publicate.
cm.
TPersistent.DefineProperties ()
TPersistent.DefineProperty ()
TPersistent.DefineBinaryProperty ()
TWriter.WriteListBegin / End
TReader.ReadListBegin / End
Da, am văzut, dar nu a vizitat o idee - ar fi proprietate - nici o problemă. Și acest părinte obiect TCollectionItem - și nu pentru a împinge în lista sa de obiecte. A se vedea ceva în TComponent făcut?
Vă mulțumim pentru ajutor cu WriteList.
> Proprietatea ar fi - nici o problemă
> Lista instalațiilor sale nu împinge
acesta este motivul. cm. TReader.ReadCollection, TWriter.WriteCollection
ReadCollection este o metodă de ajutor utilizate de alte metode de cititor pentru a citi o valoare de colectare a etichetat la poziția cititorului curent. iterează ReadCollection prin elemente dintr-o colecție, astfel încât fiecare element dintr-o colecție de proprietate are posibilitatea de a transmite în flux din proprietățile sale. Această metodă nu scrie numărul de elemente și indicii de colectare, pentru că un utilizator poate adăuga sau șterge elemente.
Am vrut să spun că CollectionItem nu se opune și nu are proprietăți obiecte. Acum, uita-te doar:
Procedura TWriter.WriteCollection (Valoare: TCollection);
var
I: Integer;
OldAncestor: TPersistent;
începe
OldAncestor: = strămoș;
Strămoș: = zero;
încerca
WriteValue (vaCollection);
dacă valoarea <> zero atunci
pentru I: = 0 până la Value.Count - 1 do
începe
WriteListBegin;
WriteProperties (Value.Items [I]);
WriteListEnd;
se încheie;
WriteListEnd;
în cele din urmă
Strămoș: = OldAncestor;
se încheie;
se încheie;
Există un mecanism ușor diferit - am obiecte de diferite clase. El face boot Adăugați și apoi ReadProperties. Apoi, acest truc nu va funcționa.
> CollectionItem nu un obiect
deoarece „nu se opune“. același moștenitor TPersistent.
prin urmare, menținând în același timp colectarea pentru fiecare element va fi numit DefineProperties avstomaticheski metodă, care poate fi suprascrisă pentru fiecare clasă derivată TCollectionItem.
Și - pe. în cazul în care instanța moștenitorului TCollectionItem vrea păstrând în același timp el însuși și de a salva propriile liste sau câmpuri (în Kutch-CB-ve proprii B), atunci el o face în același mod!
nu în sensul de Comp. Ei bine, nu contează.
Nu am nevoie pentru a salva TCollectionItem, aceasta nu este o problemă, ci o problemă cu faptul că acesta conține, și conține o listă de obiecte diferite TPersistent mostenitori (care, prin modul în care poate fi extins prin Pachetul extern plugin-uri). Metoda WritePersistentObject acolo, așa că, probabil, trebuie să moștenească totul, de la TComponent și scrie lista WriteComponent.
> Conține o listă de obiecte diferite TPersistent moștenitorii
>
pentru fiecare dintre ele, sunteți liberi să „manual“ cauza DefineProperties ().
Și Ei bine, fiecare se va scrie / citi individual Insula Sf
Dar, ca obiecte care se construiesc în lectură? Este necesar, de asemenea, să știe clasa sa. Din nou manual confuzie. Lista claselor nu este cunoscută dinainte. Clasa este definită TCollection (El nu a fost chiar și magazine par să aibă), iar TComponent ia din lista claselor înregistrate.
> Este necesar, de asemenea, să știe clasa lui
atunci când fluxul de înregistrare este înregistrat în primul CMV comunicare nume de clasă
> Din nou, aceasta confuzie manual
Nici un alt mijloc - toluo „manual“, o dată determinată de comportament persistent copii-ra atunci când apelați DefineProperties metoda lui ()
> Lista de clase nu este cunoscut în prealabil
face astfel încât el a fost cunoscut
fiecare dintre clasele din registrul listă
în caz contrar problema (sub formă de modul în care l-ați planificat) este de nerezolvat
> TComponent ia din lista claselor înregistrate
nimic nu împiedică registrul de clasă.
numai dacă nu a fost declarația lui.
Deci, în acest caz, mi se pare mai ușor să nu moștenească de la TPersistent, ci din TComponent. El scrie numele clasei. mi DefineProperties dar, de asemenea, nevoie - aceste clase la rândul lor, conțin date.
> Nimic nu împiedică registrul de clasă.
Acest lucru este obligatoriu.
în general - da
TComponent ca moștenitor al mai multor facilita munca de rutina
Dar de înregistrare este, desigur, necesar, dar nu mai este clasa, și componenta (TRegisterComponent [s])
uita-te atent la even TComponent.GetChildren ()
în Qual-ve destul de o alternativă rezonabilă este să renunțe la utilizarea colecțiilor în beneficiul Lista Sf Insula TComponent.Components [] - din nou, o reducere de muncă de rutină. TComponent ori pune în aplicare deja Lista (și management) a componentelor pentru care este proprietarul, acesta nu este un păcat de a utiliza)
TMyObject = class (TComponent)
.
protejat
GetChildren Procedura (Proc: TGetChildProc); suprascrie;
.
se încheie;
.
Procedura TMyObject.GetChildren (Proc: TGetChildProc);
var
I: Integer;
începe
pentru i: = 0 până la ComponentCount - 1 do
Proc (Componente [i]);
se încheie;
ca urmare, menținând în același timp / restaurarea unei componente a tuturor „copiii“ lui vor fi salvate / restaurate automat
Sunt conștient de. Deja am făcut-o, dar de data aceasta structura a fost astfel de componentă - Document (de asemenea, o componentă) - un document cu datele (moștenitorul) - Date Root (Colectia) - blocuri de date (CollectionItems) - Câmpurile datelor (TComponent aparent) - datele privind proprietățile . Și toate acestea mizerie nevoie pentru a salva.
Memorie: 0,75 MB
Timpul: 0,061 c