Вместо вступления
Поводом для написания данной статьи является большое количество вопросов на Круглом столе по поводу реализации Инспектора, его русификации и т. п. В свою очередь я разрабатывал расчётную программу (что-то вроде мини-САПРа), в которой наиболее красиво выглядела бы реализация Инспектора (примерно как в SolidWorks. Именно из этой САПР я подчерпнул эту идею).
Сразу оговорюсь, что рассматриваемый далее Инспектор объектов правильнее было бы назвать "Псевдоинспектором", поскольку никакого отношения к реальным published-свойствам объектов он ни имеет. Он реализован без использования RTTI, в дебрях которого я, если честно, не очень разбираюсь.
Инспекторами объектов в том или ином виде обладают многие системы (Delphi, C++Builder, SolidWorks, Visual Basic и т. д.). В своём Инспекторе я хотел бы иметь некоторые усовершенствования, отличающие его от вышеперечисленных.
Принцип работы моего Инспектора - обмен данными с объектом в виде кодированных строк. Строки как вид представления данных выбраны по двум причинам: во-первых, строки удобно отображать в Инспекторе (поначалу я хотел организовать обмен указателями, но возник ряд проблем с их преобразованием), во-вторых, в модулях Delphi есть много процедур кодирования данных в строки и наоборот (IntToStr-StrToInt, BoolToStr-StrToBool, ColorToString-StringToColor и др.). Плюс к этому реализованы ещё некоторые возможности, которых нет в других инспекторах. Так, например, в Инспекторе в добавление к свойствам и событиям реализованы ещё и методы (это было необходимо в моей задаче); появилось разрешение/запрещение свойств, событий и методов; появилась возможность добавлять свои редакторы не только в виде окон.
Также ясно, что Инспектор будет обрабатывать только элементы управления особого вида. Более того, это должны быть потомки TWinControl, поскольку в процессе их редактирования необходимо будет как-то выделять редактируемый элемент, и лучше будет, чтобы при этом он получал фокус. Подозреваю, что в Delphi так оно и сделано, ведь даже невидимый компонент в DesignTime фактически отображается на редактируемой форме в виде элемента управления (квадратик такой небольшой). Эти элементы управления для моего Инспектора будут передавать в него кодированные свойства, события или параметры методов и обрабатывать их при изменении.
Каждое свойство, метод или событие должно помимо кодированных данных обладать другими дополнительными данными, как то имя, отображаемое в Инспекторе, булева переменная, показывающая, разрешено оно или запрещено и т. д. (далее я подробно на этом остановлюсь).