Редагувати властивості у вікні інспектора об'єктів можна двома способами. Один полягає в наданні користувачу можливості редагування властивості як рядки тексту. Інший вимагає створення спеціального діалогового вікна, в якому і виконується редагування властивості. У деяких випадках потрібно використовувати обидва способи для редагування одного властивості.
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
Таблиця 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