Пятница, 20.06.2025
Королевство Delphi
Главное меню
Статьи
Наш опрос
Как часто ви на этот сайт заходите?
Всего ответов: 159
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Разные » Примеры Delphi

RTTI в действии

Бывает, что надо всем контpолам на форме поменять OnMouseMove Event. Или же нужно сбросить свойство Hint у всех элементов, у которых это свойство есть. Контpолы могут быть самые pазные TEdit, TLabel, TListView и т.п. Такие возможности в Delphi есть, более того, на них построена вся среда визуальной разработки IDE Delphi.

для справки

Run-time type information (RTTI) - это специальный механизм определения типа объекта во время выполнения. Чаще всего это актуально для определения типа объекта по указателю. Многие каркасные библиотеки самостоятельно поддерживают этот механизм. В том числе и VCL.

Приведем пример использования данного механизма в Delphi. Для начала рассмотрим работу с методами, а затем - со свойствами.
Следующий пример устанавливает у всех компонентов на форме обработчик OnMouseMove на собственную процедуру.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TForm1 = class(TForm)

 procedure FormCreate(Sender: TObject);

//...эта ф-ия обязательно должна быть описана здесь, а не в одном из 
// следующих pазделов, иначе MethodAddress() ее не видит.

 procedure CommonMouseMove (Sender: TObject; Shift: TShiftState;
 X,Y:Integer);
 private
 public
 procedure SetEventMethodToAllComponentsInForm( FormX: TForm );
 end;

var
 Form1: TForm1;

implementation
uses TypInfo;
{$R *.DFM}

procedure TForm1.SetEventMethodToAllComponentsInForm( FormX: TForm );
var
 PropInfo: PPropInfo;
 i: integer;
 CommonMethod: TMethod;
begin
 for i:=0 to FormX.ComponentCount-1 do
 begin
 PropInfo := GetPropInfo( FormX.Components[i].ClassInfo, 'OnMouseMove');
 if PropInfo <> nil then
 begin
 CommonMethod.Data := FormX.Components[i];
 CommonMethod.Code := Form1.MethodAddress('CommonMouseMove');
 SetMethodProp( FormX.Components[i], PropInfo, CommonMethod );
 end;
 end;
end;

procedure TForm1.CommonMouseMove (Sender: TObject; Shift: TShiftState; X,Y:
Integer);
begin
 ShowMessage('olala');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 //...пеpедадим для пpобы ссылку на эту же фоpму
 SetEventMethodToAllComponentsInForm( self );
end;

Это что касается методов. Свойства тоже не обделены такими возможностями. Для из изменения нужно использовать пpоцедуpу procedure SetOrdProp(Instance: TObject; PropInfo: PPropInfo; Value: Longint);

// procedure SetOrdProp(Instance: TObject; PropInfo: PPropInfo; Value: Longint);

// Hапpимеp следующий код устанавливает свойство Color у всех компонентов фоpмы,
//котоpые этим свойством pасполагают:

 for i:=0 to FormX.ComponentCount-1 do
 begin
 PropInfo := GetPropInfo( FormX.Components[i].ClassInfo, 'Color');
 if PropInfo <> nil then
 SetOrdProp( FormX.Components[i], PropInfo, clGreen );
 end;

Обратите внимание, что используемые здесь процедуры для работы с RTTI определены в стандартном модуле TypInfo.

Получить ссылку на материал

Категория: Примеры Delphi | Добавил: Барон (20.12.2011)
Просмотров: 926 | Теги: RTTI | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
Delphi.NET [3]
Kylix Delphi for Linux [9]
Советы Дельферу [6]
Хитрости в Delphi [2]
Обзор Delphi [45]
Инсталлятор [11]
Пользовательский интерфейс [18]
Примеры Delphi [93]
Функции и процедуры [15]
Разные [31]
Королевство Delphi © 2010-2025
Яндекс цитирования