Нестандартно използване на компонентите - Член Блог Майкъл flonova
Много често, ние трябва да разширим малко възможност за определен компонент. Често съм срещал с такъв проблем. Най-правилният начин е да се създаде нов потомък компонент, в който да изпълни необходимите действия. Правилно, но не винаги ефективно. Днес ще се научите да използвате компонентите не са съвсем така както е замислена чичо Борман.
Но понякога това е възможно и дори е необходимо да се изключат от това правило. Например, във вашия проект използва 100 TButton бутони, и изведнъж искахме да дадем възможност на същия бутон на нов имот. Ако следвате класически метод за решаване на проблема, ще трябва първо да се създаде нов компонент и след това направете едно от следните два начина:
1. Ръчна промяна в DFM и па предшественик файл, за всеки компонент. Когато те са били 100 броя, процесът на промяна може да се забави и тя ще бъде много уморително;
2. Създайте отново всички бутони. Най-старите, за да изтриете и да създадете нов ключ от новия компонент. Този процес ще отнеме по-дълго, особено ако не използвате действието (TAction) и трябва да се възстанови всеки имот и манипулатор на събитие за бутона.
всички промени в проекта не е нужно да се направи много по-лесно да се промени стандартен компонент TButton и др. За това има два варианта - локални и глобални промени. Във всеки случай, се правят промени и същ, като единствената разлика е, как да направим нашата Delphi компилирана версия на новия компонент.
Променете стандартен компонент
Така че, може да получи описание TButton компонент и добавяне на нова процедура за публично:
Ние нямаме нужда от сложни манипулации, основната промяна е доказателство за стандартен компонент на работата. Натиснете. Delphi за създаване на шаблони за процедурата. При тази процедура, ние няма да се покаже, но е достатъчно да извикате прозореца на съобщението, което се предава като параметър:
компилира правилно
Сега трябва да се компилира Delphi използва модифицирана версия на файла. Първо, помислете за глобалната метод. Изберете Инструменти / меню среда Options. Преди да отворите прозореца за настройки на Delphi. Отиди в библиотеката към раздела. Тук, в библиотека път линия показва пътя, където компилаторът трябва да търси модули. Щракнете върху бутона с три точки, толкова по-добре, за да видите и редактирате списъка с пътища в специален прозорец.
Свойства на проекта, Библиотека раздела
Docker анализира уеб търсене на модули
Обърнете внимание на първия ред в полето, където е пътя $ (DELPHI) \ Lib. Първото нещо, компилаторът ще търси модули в директория \ ИЪ, в директорията, където сте инсталирали Delphi. Ако не може да се намери желаните или DCU па файл в тази директория, те ще бъдат видени от останалата част от списъка на директорията. Ясно е, какво имам предвид? Ако не, прочетете и ще продължи да бъде интересна.
Нашата задача е да се добави по пътя към директорията с VCL модули изходния код и да се сложи този път първият съставител да използвате тази директория. За да направите това, изпълнете следните стъпки:
1. В полето мощност под списъка с директории, въведете пътя $ (DELPHI) \ Източник \ VCL;
2. Щракнете върху бутона Add, за да добавите по пътя;
3. Изберете добавен нов път, и стрелка нагоре, за да го преместите на първа линия;
4. Запазване на промените чрез натискане на бутона OK.
Сега можете да компилирате проекта.
Така че ние се променили настройките в световен мащаб, а сега всички от VCL модули директория ще бъде събрана. Не, не е "абсолютно" всичко, и тези, използвани в нашия проект. Но това, аз ви казвам, не са малко. Дори един посредствен проект използва най-малко 20 единици. Това не е много добра, защото се променя само един StdCtrls.pas файл.
местно компилация
За локалната файлова StdCtrls.pas връзка, трябва да се копира в същата директория, където да съхранявате на изходния код на проекта. В този случай, настройките Delphi нищо не е необходимо да се промени, защото директорията на проекта винаги има отметка на първо място. Намирането StdCtrls.pas файл директория \ ИЪ няма да бъдат проверени, така че компилаторът използва модифицирана версия на компонента TButton.
Опитайте местната компилацията. Това е, когато възникнат проблеми. На първо място, компилаторът ще покаже на модула за теми и да се каже, че Циферблат модул събрани с друга версия на TButton. В този случай, проблемът е решен лесно. Виж, Теми модул включен в раздел изпълнение употреби. Ако преместите връзка с интерфейса за употреба раздел (в началото на модула), грешката ще изчезне. Този трик не винаги работи и е по-скоро изключение от правилото. По-долу ще видим по-стабилна решение на този проблем.
Отново се опита да състави програма, и се появи грешка отново. Трябва да видите съобщение, че ExtCtrls е компилиран модулът с различна версия TButton компонент. Защо се случи това? Когато се свързали модифициран файл в световен мащаб, всичко се използва в програмните модули от директорията \ Източник \ VCL прекомпилирате. В този случай, само прекомпилирани StdCtrls, където TButton модифицирани. Но ние използваме в проекта е и модул ExtCtrls, които:
- Тя е взета от директория \ ИЪ;
- Модул използва stdctrls;
- - Съставител с различна версия на TButton.
Две различни компоненти с едно и също име не могат да съществуват в един и същ проект. Номерът, който имахме с Themes модул няма да мине. Тук трябва друго решение. И тя се намира на повърхността - и прекомпилирате ExtCtrls модул. За да направите това, това е също така да копирате директорията с проекта източник. Сега този модул е прекомпилирани, а също така ще използва модифицирана TButton.
Това не е имало повече проблеми с компилирането, копие на директорията с проекта източник и Dialogs.pas Buttons.pas файлове.
Това не е толкова умен начин, преди няколко години реших да един много голям проблем. В една от версиите на Delphi (не си спомням точно, но изглежда, че е Delphi 4) в мрежа StringGrid един метод, не работи точно така, както съм имал. Аз го модифицирана и е свързан с програмата на местно ниво.
Използвайте най-добрите местни връзката, тъй като няма гаранция, че модифицирана версия на компонент изисква във всички други проекти. Да и събират всички стандартни модули от изходния код няма смисъл, когато е налице компилиран вариант в директория \ ИЪ.
Използването на частни методи
Често съм забелязал, че Delphi разработчиците понякога се крият в частни или защитени много полезни функции, компоненти. Аз разбирам, че те откаже достъп до свойствата и методите, неправилно боравене, които биха могли да доведат до катастрофа. И все пак, понякога достъп до забранения плод е задължително.
Как да получите достъп до променлива или метод, който е затворен? Да разгледаме проблема с примера на бутони. В TButton компонент има закрит метод SetButtonStyle. Този метод е обявен в защитената част. Delphi как да мамят и да получите достъп до този метод директно? Ако пишете на следния код в програмата, се появи грешка по време на компилация:
В компилатор Делфи има един недостатък (и може би е предимство, че е трудно да се каже). Ако два обекта са обявени в същия модул, всички от техните свойства и методи са достъпни за всеки друг. Няма значение, където тези, декларирани методи и свойства, те са отворени или затворени. Такива обекти се наричат приятелски и братски чисто споделяне всички нейни характеристики.
Но това не е достатъчно, тъй като един бутон и нашия проект, обявен в различни модули, така че възможността за привидно безполезни. Не бързайте. В обектно-ориентираното програмиране е много полезна функция - наследството. В този случай, потомък може да бъде отнесена към някоя от предшественик, и кода ще работи правилно.
Стани приятел
Сега, ако навсякъде в този модул, можете да използвате бутоните затворени методи. Да приемем, че имаме по форма е тип бутон TButton Button1. Този обект е предшественик TMyButton, така TMyButton запис (Button1) е съвсем вярна. И тъй като TMyButton клас е деклариран в същия модул, ние можем лесно да получите достъп до неговите лични методи и свойства. Това е достатъчно, за да се напише код:
Оказва се, че когато се обяви наследника на бутона, всички методи са се преместили в нашия блок. И тъй като един модул класове са приятелски настроени и да видят всички частни свойства и методи, ние бяхме в състояние лесно да ги прочете.
Този метод е добър, само ако имате имот или метода на защитената секция. Всичко, което е обявено в неофициалния раздел не е достъпна за наследници и, следователно, не се прехвърля в нашия блок.
Решетка DBGrid
Много често хората ме питат, как можете да промените височината на определена графа, във TDBGrid компонент. Да, този компонент не е имот, който ще отговаря за височината, но има и сред предците на TDBGrid TCustomGrid обект, който има RowHeights собственост. За да го използвате, трябва само да напишете следния ред:
Но тук искам да ви предупредя, че Borland не е напразно, за да затворите този имот. Факт е, че ако DBGrid превъртете мрежата, а след това ще има сериозни проблеми с рисуване. В някои случаи, затворените свойства и методи прародител може наистина спестяват, но също могат да пречат на действието на програмата. В този случай, ние просто промяна на височината на ред, но сега ще трябва да работим усилено, за представяне на данните.
Решетка DBGrid, в която редовете са с различни височини
събиране на пълни
Както можете да видите, че не винаги трябва да се създаде нов дете, за да даде нови възможности компонент. Можете да използвате стандартното внедряване, просто разширяване на възможностите.
Използвайки методите и свойствата на затворените компоненти трябва да бъдат точни. Borland разработчици съзнателно затворен методи, като директно предизвикателство към някои от тях може да доведе до сериозни проблеми в работата на цялата програма. Частните методи и свойства не са документирани в помощния файл, така че е трудно да се разбере как те се използват. Но, ако се анализира изходния код на модула, че е лесно да се разбере, какво, кога и как да се използва.
Не забравяйте, че хакерството - начин на мислене, начин на живот и постоянни изследвания. Успех в бъдещите си изследвания.
Предупреждение. Ако копирате тази статия на вашия сайт, а след това да оставите връзка директно към тази страница. Благодарим Ви за разбирането