Создание компонентов для KOL и MCK - Часть 4 - Создание визуальных MCK объектовDelphi , Технологии , KOL и MCKСоздание компонентов для KOL и MCK - Часть 4 - Создание визуальных MCK объектовВедущий раздела KOL и MCK: Анатолий aka XVeL Полную версию библиотеки KOL и MCK можно скачать здесь Создание визуальных MCK объектов: Не опять, а снова Вообще-то учить вас тут нечему, различий тут еще меньше чем в KOL части, но кое-что еще есть. Визуальные компоненты наследуются от TKOLControl - он специально для этого создан. Мы добавили свое событие, как добавить код, и какой? Ну, это не сложно, потупим так (часть кода вырезана): uses Windows, Controls, Classes, mirror, KOL, Graphics, MCKCtrls, KOLMHTrackBar; type TKOLMHTrackBar = class(TKOLControl) private … FOnScroll: TOnScroll; procedure SetOnScroll(const Value: TOnScroll); … public property OnScroll: TOnScroll read FOnScroll write SetOnScroll; … end; Вот и все, будет жить. Да обратите внимание на uses - я его не просто так привел, TOnScroll есть в разных модулях, нам нужен тот, который в KOLMHTrackBar, поэтому порядок следования важен! Чтобы не полагаться на порядок лучше писать KOLMHTrackBar. TOnScroll. Но это событие уже было определено, и мы его переопределили, если создано новое, то надо переопределить процедуру AssignEvents - она занимается регистрацией событий. Делается это так: protected procedure AssignEvents(SL: TStringList; const AName: string); override; … procedure TKOLMHTrackBar.AssignEvents(SL: TStringList; const AName: string); begin inherited; DoAssignEvents( SL, AName, [ 'OnMyEvent'], [ @OnMyEvent] ); end;
protected procedure SetupConstruct( SL: TStringList; const AName, AParent, Prefix: string ); override; … procedure TKOLMHTrackBar.SetupConstruct(SL: TStringList; const AName, AParent, Prefix: string); var S: String; begin S := GenerateTransparentInits; SL.Add( Prefix + AName + ' := PMHTrackbar( New' + TypeName + '( ' + SetupParams( AName, AParent ) + ' )' + S + ');' ); end; Благодаря этому коду, у нас теперь будет генерироваться, нет, не New,… а PMHTrackBar(New…. (SetupParams - узнаете)), элементарно. Мы изменили конструкцию генерации! GenerateTransparentInits - нужен для последующей совместимости с KOL и MCK, он пока ничего не делает, но когда будет реализована прозрачность он себя покажет. Для рассмотрения еще одного момента добавим в наш компонент Buddyes - такие окошки, которые располагаются рядом с TrackBar'ом, в качестве их можно назначить любой компонент. В KOL часть такой код: private function GetHandle(const Index: Integer): HWnd; procedure SetHandle(const Index: Integer; const Value: HWnd); … public … property BuddyRightBottom: HWnd index 0 read GetHandle write SetHandle; property BuddyLeftTop: HWnd index 1 read GetHandle write SetHandle; … function TMHTrackbar.GetHandle(const Index: Integer): HWnd; const Mes: array [0..1] of DWord = (TBM_GETBUDDY, TBM_GETBUDDY); begin Result := Perform(Mes[Index], Index, 0); end; procedure TMHTrackbar.SetHandle(const Index: Integer; const Value: HWnd); const Mes: array [0..1] of DWord = (TBM_SETBUDDY, TBM_SETBUDDY); begin Perform(Mes[Index], Index , Value); end; А в MCK часть: private … FBuddyLeftTop: TKOLControl; FBuddyRightBottom: TKOLControl; procedure SetBuddyLeftTop(const Value: TKOLControl); procedure SetBuddyRightBottom(const Value: TKOLControl); published … property BuddyLeftTop: TKOLControl read FBuddyLeftTop write SetBuddyLeftTop; property BuddyRightBottom: TKOLControl read FBuddyRightBottom write SetBuddyRightBottom; … procedure TKOLMHTrackBar.SetBuddyLeftTop(const Value: TKOLControl); begin FBuddyLeftTop := Value; Change; end; procedure TKOLMHTrackBar.SetBuddyRightBottom(const Value: TKOLControl); begin FBuddyRightBottom := Value; Change; end;
if FBuddyLeftTop <> nil then SL.Add(Prefix + AName + '.BuddyLeftTop:=Result.' + FBuddyLeftTop.Name + '.GetWindowHandle;'); if FBuddyRightBottom <> nil then SL.Add(Prefix + AName + '.BuddyRightBottom:=Result.' + FBuddyRightBottom.Name + '.GetWindowHandle;');
protected procedure SetupLast(SL: TStringList; const AName, AParent, Prefix: String); override; … procedure TKOLMHTrackBar.SetupLast(SL: TStringList; const AName, AParent, Prefix: String); begin inherited; if FBuddyLeftTop <> nil then SL.Add(Prefix + AName + '.BuddyLeftTop:=Result.' + FBuddyLeftTop.Name + '.GetWindowHandle;'); if FBuddyRightBottom <> nil then SL.Add(Prefix + AName + '.BuddyRightBottom:=Result.' + FBuddyRightBottom.Name + '.GetWindowHandle;'); if FToolTip <> nil then SL.Add(Prefix + AName + '.ToolTip:=Result.' + FToolTip.Name + '.GetWindowHandle;'); end; Теперь последние штрихи. Вас не раздражают в ObjectInspector'е лишние свойства? Они достались нам в наследство от TKOLControl. Уберем их, для этого сделаем фиктивную переменную, и переопределим свойства только, на чтение - такие свойства ObjectInspector прячет: private … // Фиктивное свойство FNotAvailable: Boolean; … public … property Caption: Boolean read FNotAvailable; property Color: Boolean read FNotAvailable; property Font: Boolean read FNotAvailable; end;
protected procedure Paint; override;
protected function WYSIWIGPaintImplemented: Boolean; override; function TKOLEditBox.WYSIWIGPaintImplemented: Boolean; begin Result := TRUE; end; Я помню еще те времена, когда у MCK не было отрисовки совсем, это (меня) страшно злило, и я начал поиски - идея повторять отрисовку MicroSoft меня не вдохновляло (повторять - всегда сложно, а ведь нужно именно повторить). Но никуда не денешься, пришлось рисовать, я, собрав волю в кулак, сделал отрисовку Label, Edit. Пример оказался заразительным сейчас большинства компонентов есть отрисовка. Бог в помощь! Заключение: Пожалуй, не все… Статья Создание компонентов для KOL и MCK - Часть 4 - Создание визуальных MCK объектов раздела Технологии KOL и MCK может быть полезна для разработчиков на Delphi и FreePascal. Комментарии и вопросыМатериалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |