आप TEdit या TMemo क्लास 'NewInstance
विधि में एक स्थापित हुक पर सीधे पॉपअप काम कर सकते हैं। इस tecnique के साथ आपको हुक स्थापित करने के साथ केवल एक अतिरिक्त इकाई शामिल करना होगा। हुक का कोड आपके कस्टम TPopupMenu ऑब्जेक्ट को PopupMenu
क्लास TEdit
और TMemo
के प्रत्येक घटक की संपत्ति को आपके एप्लिकेशन में बनाएगा।
सबसे पहले, एक वैश्विक TDatamodule या अपने मुख्य फॉर्म में एक TPopupMenu ऑब्जेक्ट ड्रॉप करें। यहां मुख्य बिंदु यह है कि पॉपअपमेनू माता-पिता हमेशा उपलब्ध होना चाहिए और आपके आवेदन प्रारंभिकरण में बनाए गए पहले व्यक्ति बनें, या कम से कम हुक स्थापित होने से पहले।
फिर, एक खाली नई इकाई बनाएं। आप उसे जो चाहें कहें। मेरे मामले में popup_assignment.pas
।
unit popup_assignment;
interface
uses Windows, StdCtrls;
implementation
uses globaldatamodule; // Unit of global TPopupMenu parent
{------------------------------------------------------------------------------}
function TEditNewInstance(AClass: TClass): TObject;
begin
Result := TEdit.NewInstance;
TEdit(Result).PopupMenu := global_datamodule.customedit_popupmenu; // <- your global TPopupMenu component !!!
end;
function TMemoNewInstance(AClass: TClass): TObject;
begin
Result := TMemo.NewInstance;
TMemo(Result).PopupMenu := global_datamodule.customedit_popupmenu; // <- your global TPopupMenu component !!!
end;
function GetVirtualMethod(AClass: TClass; const VmtOffset: Integer): Pointer;
begin
Result := PPointer(Integer(AClass) + VmtOffset)^;
end;
procedure SetVirtualMethod(AClass: TClass; const VmtOffset: Integer; const Method: Pointer);
var
WrittenBytes: DWORD;
PatchAddress: PPointer;
begin
PatchAddress := Pointer(Integer(AClass) + VmtOffset);
WriteProcessMemory(GetCurrentProcess, PatchAddress, @Method, SizeOf(Method), WrittenBytes);
end;
{$IFOPT W+}{$DEFINE WARN}{$ENDIF}{$WARNINGS OFF} // no compiler warning
const
vmtNewInstance = System.vmtNewInstance;
{$IFDEF WARN}{$WARNINGS ON}{$ENDIF}
var
orgTEditNewInstance: Pointer;
orgTMemoNewInstance: Pointer;
initialization
orgTEditNewInstance := GetVirtualMethod(TEdit, vmtNewInstance);
orgTMemoNewInstance := GetVirtualMethod(TMemo, vmtNewInstance);
SetVirtualMethod(TEdit, vmtNewInstance, @TEditNewInstance);
SetVirtualMethod(TMemo, vmtNewInstance, @TMemoNewInstance);
finalization
SetVirtualMethod(TEdit, vmtNewInstance, OrgTEditNewInstance);
SetVirtualMethod(TMemo, vmtNewInstance, orgTMemoNewInstance);
end.
स्रोत
2012-03-13 17:09:14
क्यों न केवल TEdit और TMemo subclass और उन्हें एक संदर्भ मेनू साझा करें? –
यदि आपने दिखाया कि यह कैसे करना है, @Warren, मुझे उम्मीद है कि यह इस प्रश्न के स्वीकार्य उत्तरों के दायरे में आ जाएगा। –