![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Заменить элемент управления во время выполненияDelphi , Компоненты и Классы , RTTIЗаменить элемент управления во время выполнения
Оформил: DeeCo unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; private { Private-Deklarationen } public { Public-Deklarationen } end; (* Neue Komponente mit eigenen Eigenschaften ersetzt erst zur Programmlaufzeit das Verhalten von TPanel *) (* The new component replace at runtime TPanel *) TExtPanel = class(TCustomControl) protected procedure WMSize(var Message: TWMSize); message WM_Size; end; var Form1: TForm1; implementation {$R *.DFM} procedure TExtPanel.WMSize; begin Caption := 'Width: ' + IntToStr(Width) + ', Height: ' + IntToStr(Height); end; procedure ReplaceParentClass(DelphiClass, OldParent, NewParent: TClass); var aClassPointer: ^Byte; pVCL, pNew: ^Pointer; dwProtect: DWORD; begin if Assigned(NewParent) then if Assigned(DelphiClass) then begin // ClassParent-Zeiger suchen //Search ClassParent Pointer while (DelphiClass.ClassParent <> OldParent) do begin with DelphiClass do begin if (ClassParent = nil) or (ClassParent = NewParent) then Exit; // DelphiClass.ClassParent zuweisen // Set DelphiClass.ClassParent DelphiClass := ClassParent; end end; // Parent-Zeiger der originalen VCL-Klasse suchen // Search Parent-Pointer of original VCL-Class aClassPointer := Pointer(DelphiClass); Inc(aClassPointer, vmtParent); pVCL := Pointer(aClassPointer); aClassPointer := Pointer(NewParent); Inc(aClassPointer, vmtSelfPtr); pNew := Pointer(aClassPointer); // Schreibberechtigung holen, Zeigerwerte tauschen // Set write permission, swap pointers VirtualProtect(pVCL, SizeOf(Pointer), PAGE_READWRITE, @dwProtect); pVCL^ := pNEW; // alte Zugriffsrechte aktivieren // avtivate old access right VirtualProtect(pVCL, SizeOf(Pointer), dwProtect, @dwProtect); end end; initialization ReplaceParentClass(TPanel, TCustomControl, TExtPanel); finalization ReplaceParentClass(TPanel, TExtPanel, TCustomControl); end. Это пример замены встроенного контрола VCL на другой пользовательский контроль в реальном времени в Delphi. Код определяет новый пользовательский контроль под названием Основная часть кода - процедура В этом конкретном примере код заменяет родительский класс всех контролов Процедура Код также включает два вызова процедуры Шаг за шагом, код работает следующим образом:
Код демонстрирует, как заменить встроенный контроль VCL на другой пользовательский контроль в реальном времени в Delphi, позволяя изменять поведение контролов динамически. В статье рассматривается пример замены элемента управления в Delphi во время выполнения программы. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |