Створення редакторів властивостей

Редагувати властивості у вікні інспектора об'єктів можна двома способами. Один полягає в наданні користувачу можливості редагування властивості як рядки тексту. Інший вимагає створення спеціального діалогового вікна, в якому і виконується редагування властивості. У деяких випадках потрібно використовувати обидва способи для редагування одного властивості.

2. Редагування властивості як тексту.

3. Редагування властивості в діалоговому вікні (необов'язковий етап).

Всі ці етапи детально розглядаються в наступних розділах.

них наборів (наприклад 'A' .. 'Z')

тоди, тобто подіями

Int64 і його похідних

ся, якщо вибрано більше одного компонента

Редагування властивості як тексту

Як приклад розглянемо визначення класу TIntegerProperty в модулі

function GetValue: string; override;

procedure SetValue (const Value: string); override;

Як бачите, методи GetValue () і SetValue () перевизначені. Нижче показана реалізація методу GetValue ():

function TIntegerProperty.GetValue: string;

А от реалізація методу SetValue ():

procedure TIntegerProperty.SetValue (const Value: String);

with GetTypeData (GetPropType) ^ do

if (L MaxValue) then

Таблиця 12.2. Методи читання і запису властивостей класу TPropertyEditor

Це занадто просто, тому ускладнити завдання. Припустимо, необхідно надати користувачеві можливість вибрати один з двох способів завдання планети. Він може набрати рядок назви планети, наприклад Venus або VENUS. або VeNuS. або ввести позицію планети в Сонячній системі. Так, для Венери ця позиція буде рівною зна чению 2.

Нижче наводиться вихідний код компонента TPlanet:

TPlanetName = type Integer;

property PlanetName: TPlanetName read FPlanetName

Як бачите, цей компонент зовсім невеликий. У нього є тільки одна властивість PlanetName типу TPlanetName. Спеціальне визначення типу TPlanetName позво ляет йому мати власну інформацію про типах часу виконання і залишатися при цьому цілочисельним типом.

interface usesWindows, SysUtils, DesignEditors;

function GetValue: string; override;

procedure SetValue (const Value: string); override;

PlanetNames: array [1..9] of String [7] = ( 'Mercury', 'Venus',

'Earth', 'Mars', 'Jupiter', 'Saturn',

'Uranus', 'Neptune', 'Pluto');

function TPlanetNameProperty.GetValue: string;

procedure TPlanetNameProperty.SetValue (const Value: String);

i, ValErr: Integer;

PlanetNames. Якщо знайдено відповідність, то змінна i

приймає значення менше 10.>

while (PName <> UpperCase (PlanetNames [i])) and (i <10) do

Установка значення і вихід з процедури.>

if i <10 then begin // Название планеты введено правильно.

неіснуюче назва планети. Використовувати функцію Val для

перевірки введеного значення на число. Якщо ValErr НЕ дорівнює

нулю, то неправильно введено назву планети. В протилежному

випадку перевірити введений номер на приналежність

діапазону (0

Val (Value, i, ValErr);

if ValErr <> 0 then

Format ( 'Sorry, Never heard of the planet% s.', [Value]));

if (i <= 0) or (i>= 10) then

raise Exception.Create ( 'Sorry, that planet is not in OUR solar system.'); SetOrdValue (i);

Визначимо масив строкових констант для подання планет Сонячної сис теми, в залежності від їх положення щодо Сонця. Ці рядки будуть відпові чать за строкове представлення планет у вікні інспектора об'єктів.

Як уже зазначалося, необхідно перевизначити методи GetValue () і Set- Value (). Метод GetValue () повертає рядок з масиву PlanetNames. Даний масив індексований за значеннями властивостей. Звичайно, значення властивості має на ходиться в межах діапазону 1-9. Тому користувачеві заборонено вводити в ме тод SetValue () номер, що виходить за межі цього діапазону.

Метод SetValue () отримує рядок, введену в вікні інспектора об'єктів. ця

рядок може бути як назвою планети, так і номером, визначальним позицію

планети. Логіка коду визначає, чи правильно введено назву планети або її номер, і якщо так, то відповідне значення привласнюється властивості методом Se- tOrdValue (). Якщо користувач ввів неправильна назва планети або неприпустиме тімий номер, то передається відповідне виключення.

procedure RegisterPropertyEditor (PropertyType: PTypeInfo; ComponentClass: TClass; const PropertyName: string;

RegisterPropertyEditor (TypeInfo (TPlanetName), TPlanet, 'PlanetName', TPlanetNameProperty); Cовет

нента в модулі компонента, як показано в лістингу 12.5. Лістинг 12.5. Planet.pas - компонент TPlanet unit Planet;

TPlanetName = type Integer;

property PlanetName: TPlanetName read FPlanetName

Схожі статті

Copyright © 2024