Шавқовар

Эҷоди динамикӣ ҷузъҳо (дар замони иҷро)

Эҷоди динамикӣ ҷузъҳо (дар замони иҷро)


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

Аксар вақт ҳангоми барномасозӣ дар Delphi ба шумо лозим нест, ки ҷузъи динамикӣ эҷод кунед. Агар шумо компонентро ба форма партоед, Delphi эҷодкунии компонентро ҳангоми сохтани шакл ба таври худкор идора мекунад. Ин мақола роҳи дурусти эҷоди барномасозии ҷузъҳоро дар вақти корӣ фаро мегирад.

Таъсиси компоненти динамикӣ

Ду роҳи эҷоди динамикӣ ҷузъҳо вуҷуд доранд. Як роҳ ин сохтан (ё ягон дигар TComponent) сохиби ҷузъи нав мебошад. Ин як таҷрибаи маъмулест ҳангоми сохтани ҷузъҳои таркибӣ, ки дар он як контейнери визуалӣ эҷод ва соҳаҳои зеркомпонентҳо дорад. Ҳамин тавр, вақте ки компоненти нав нобуд карда мешавад, вайроншавии компоненти нав барқарор карда мешавад.

Барои сохтани нусхаи (объекти) синф, шумо онро усули "Эҷод" меномед. Эҷоди созанда усули синф аст, дар муқоиса бо ҳамаи дигар усулҳои дар барномарезии Delphi дучоршуда, ки методҳои объект мебошанд.

Барои намуна, TComponent Созандаи навро эълом мекунад:

созанда Созанда (AOwner: TComponent); виртуалӣ;

Таъсиси динамикӣ бо соҳибон
Ин аст мисоли эҷоди динамикӣ, ки дар он Худи насли TComponent ё TComponent аст (масалан, як мисоли TForm):

бо TTimer.Create (Худ) кунед
Оғоз
Фосила: = 1000;
Даргирифта: = Дурӯғ;
OnTimer: = MyTimerEventHandler;
Поён;

Офаридаи динамикӣ бо занги дақиқи ройгон
Роҳи дуюми ташкили ҷузъ истифода аст нил ҳамчун соҳиби. Дар хотир доред, ки агар шумо ин корро кунед, шумо инчунин объектеро, ки шумо онро баъд аз дигар ба он ниёз надоред, бояд ба таври возеҳ озод кунед (ё ин ки ихроҷи хотираро ба вуҷуд меоред). Ин як мисоли истифодаи nil ба сифати соҳиб:

бо TTable.Create (nil) мекунед
кушиш кунед
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
Кушодан;
Таҳрир кардан;
FieldByName ('Машғул'). AsBoolean: = Рост;
Интишор;
дар охир
Озод;
Поён;

Истинодҳои динамикӣ ва объектҳои истинод
Ин ду мисоли қаблиро тавассути таъини натиҷаи занги эҷод ба тағирёбандаи маҳаллӣ ба метод ё ба класс мансуб кардан мумкин аст. Ин одатан вақте матлуб аст, вақте ки истинодҳо ба ҷузъ баъдтар бояд истифода шаванд ё ҳангоми пайдоиши мушкилоти эҳтимолӣ аз блокҳои "Бо" пешгирӣ карда шавад. Дар ин ҷо рамзи эҷоди TTimer аз боло истифода мешавад, майдони тағирёбанда ҳамчун истинод ба объекти таъиншудаи TTimer истифода мешавад:

FTimer: = TTimer.Create (Худ);
бо FTimer кунед
Оғоз
Фосила: = 1000;
Даргирифта: = Дурӯғ;
OnTimer: = MyInternalTimerEventHandler;
Поён;

Дар ин мисол "FTimer" як майдони хусусии тағирёбандаи форма ё контейнери визуалӣ мебошад (ё ягон чизи "Худ" аст). Ҳангоми дастрасӣ ба тағирёбандаи FTimer аз методҳои ин синф, фикри хубест, то санҷед, ки оё истинод пеш аз истифодаи он дуруст аст ё не. Ин бо истифодаи функсияи Delphi Таъин карда мешавад:

агар Таъиншуда (FTimer) пас FTimer.Enabled: = Дуруст;

Эҷоди динамикӣ ва истинодҳои объекти бидуни молик
Тағирот дар ин он аст, ки ҷузъро бидуни соҳа эҷод кардан, аммо барои несткунии баъдӣ истинод нигоҳ доштан. Рамзи сохтмон барои TTimer чунин хоҳад буд:

FTimer: = TTimer.Create (нил);
бо FTimer кунед
Оғоз

Поён;

Ва рамзи нобудкунӣ (эҳтимолан дар нобудкунандаи он) ба назар чунин метобад:

FTimer.Free;
FTimer: = nil;
(*
Ё тартиби FreeAndNil (FTimer) -ро истифода баред, ки истинодҳои объектро озод мекунад ва истинодро бо nil иваз мекунад.
*)

Муайян кардани истинод ба объект ба nil ҳангоми озод кардани объект муҳим аст. Занг ба Free First тафтиш мекунад, ки оё маълумотномаи объект нос дорад ё не, ва агар не, он объектро харобкунандаи Destroy номида мешавад.

Таъсиси динамикӣ ва истинодҳои объекти маҳаллӣ бидуни соҳибон

Дар ин ҷо рамзи эҷоди TTable аз боло истифода мешавад, тағирёбандаи маҳаллӣ ҳамчун истинод ба объекти таъиншудаи TTable:

localTable: = TTable.Create (nil);
кушиш кунед
бо yerliTable мекунед
Оғоз
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
Поён;

// Баъдтар, агар мо ба таври возеҳ масоҳатро пешниҳод кунем:
localTable.Open;
localTable.Edit;
localTable.FieldByName ('Машғул'). AsBoolean: = Дуруст;
localTable.Post;
дар охир
localTable.Free;
localTable: = nil;
Поён;

Дар мисоли дар боло овардашуда, "localTable" тағирёбандаи маҳаллӣ мебошад, ки бо ҳамон усуле, ки ин рамзро дар бар мегирад, эълон шудааст. Дар хотир доред, ки пас аз озод кардани ягон объект, дар маҷмӯъ фикри нилро гузоштан хеле хуб аст.

Каломи огоҳӣ

МУҲИМ: Зангро ба Ройгон бо интиқол додани соҳиби мӯътадил ба сохтмончӣ омехта накунед. Ҳамаи техникаҳои пешина кор хоҳанд кард ва эътибор доранд, аммо зеринро бояд иҷро кард ҳеҷ гоҳ дар коди шумо рух медиҳад:

бо TTable.Create (худ) кор кунед
кушиш кунед

дар охир
Озод;
Поён;

Мисоли рамзи боло хитҳои нодаркорро муаррифӣ мекунад, ба хотираҳо каме таъсир мерасонад ва барои ёфтани хатогиҳо мушкилот дорад. Бифаҳмед, ки чаро.

Эзоҳ: Агар ҷузъи динамикӣ сохташуда соҳиби (бо параметр AOwner аз ҷониби Созандаи Созанда таъиншуда) дошта бошад, он гоҳ соҳиби он барои вайрон кардани ҷузъият масъул аст. Дар акси ҳол, шумо бояд ба таври возеҳ занг занед, вақте ки шумо ба компонент ниёз надоред.

Мақола дар ибтидо навишта шудааст Марк Миллер

Дар айни замон дар Delphi як барномаи озмоишӣ эҷод карда шуд, ки динамикии 1000 ҷузъро бо ҳисоби гуногуни компонентҳои аввалия тағир медиҳад. Барномаи озмоишӣ дар поёни ин сафҳа пайдо мешавад. Дар диаграмма маҷмӯи натиҷаҳо аз барномаи санҷишӣ нишон дода шудааст, ки вақти сохтани ҷузъҳоро ҳам бо соҳибон ва ҳам бидуни он муқоиса мекунад. Дар хотир доред, ки ин танҳо як қисми хит аст. Ҳангоми нобуд кардани ҷузъҳои ба таъхири монанд монандро метавон интизор шуд. Вақти ба таври динамикӣ сохтани ҷузъҳо бо соҳибон аз 1200 то 107960% нисбат ба сохтани ҷузъҳои бидуни соҳибон вобаста аз шумораи ҷузъҳои форма ва ҷузъи эҷодшаванда сусттар аст.

Барномаи озмоишӣ

Огоҳӣ: Ин барномаи озмоишӣ ҷузъҳои бидуни соҳибон эҷодшударо пайгирӣ ва ройгон намекунад. Бо пайгирӣ ва озод кардани ин ҷузъҳо, маротибае, ки барои рамзи эҷоди динамикӣ чен карда мешаванд, вақти воқеиро барои эҷоди динамикӣ ҷузъро дақиқ инъикос мекунанд.

Рамзи манбаъро зеркашӣ кунед

Огоҳӣ!

Агар шумо хоҳед, ки як ҷузъи Delphi фавран фаъол кунед ва баъдтар онро ба таври дақиқ озод кунед, ҳамеша ҳамчун соҳиби сифр бошед. Нокомӣ дар ин ҳолат метавонад хатарҳои нолозимро ба вуҷуд орад, инчунин мушкилот дар иҷроиш ва нигоҳдории кодро. Мақолаи "Огоҳӣ дар бораи компонентҳои динамикӣ фаврии Delphi" -ро хонед, то маълумоти бештар гиред ...