你是不是 做 运行期 调整 控件位置 属性啊
有很多此类控件
啊 例如 StretchHandle,dram(这个太强大了)
unit u_InfoPanel;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls, TypInfo,
StretchHandle;
type
TControlRec = record
Control: TControl;
FieldName: string;
end;
TInfoPanel_HFG = class(TCustomPanel)
private
FControlRecList: array of TControlRec;
FControl_OnChange: TNotifyEvent;
FControl_OnClick: TNotifyEvent;
FControl_OnDblClick: TNotifyEvent;
FControl_OnEnter: TNotifyEvent;
FControl_OnExit: TNotifyEvent;
FControl_OnKeyDown: TKeyEvent;
FControl_OnKeyPress: TKeyPressEvent;
FControl_OnKeyUp: TKeyEvent;
FControl_OnMouseUp: TMouseEvent;
FControl_OnMouseDown: TMouseEvent;
Fold_C_OnMouseDown: TMouseEvent;
FStretchHandle: TStretchHandle;
procedure setControl_OnMouseDown(v: TMouseEvent);
protected
{ Protected declarations }
procedure setEvent(con: TControl;
eventName: string);
procedure setEventALL(con: TControl);
procedure StretchHandleMouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
public
procedure addControl_withStr(V: string;
FieldName: string = '');
procedure begin
Design;
procedure EndDesign;
procedure LoadControl(ss: TStrings);
procedure SaveControl(ss: TStrings);
procedure ClearControl;
published
property C_OnChange: TNotifyEvent read FControl_OnChange write FControl_OnChange;
property C_OnClick: TNotifyEvent read FControl_OnClick write FControl_OnClick;
property C_OnDblClick: TNotifyEvent read FControl_OnDblClick write FControl_OnDblClick;
property C_OnEnter: TNotifyEvent read FControl_OnEnter write FControl_OnEnter;
property C_OnExit: TNotifyEvent read FControl_OnExit write FControl_OnExit;
property C_OnKeyDown: TKeyEvent read FControl_OnKeyDown write FControl_OnKeyDown;
property C_OnKeyPress: TKeyPressEvent read FControl_OnKeyPress write FControl_OnKeyPress;
property C_OnKeyUp: TKeyEvent read FControl_OnKeyUp write FControl_OnKeyUp;
property C_OnMouseUp: TMouseEvent read FControl_OnMouseUp write FControl_OnMouseUp;
property C_OnMouseDown: TMouseEvent read FControl_OnMouseDown write setControl_OnMouseDown;
end;
function ComponentToString(Component: TComponent): string;
function StringToComponent(Value: string): TComponent;
implementation
function ComponentToString(Component: TComponent): string;
var
BinStream: TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFrombegin
ning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFrombegin
ning);
Result := StrStream.DataString;
finally
StrStream.Free;
end;
finally
BinStream.Free
end;
end;
function StringToComponent(Value: string): TComponent;
var
StrStream: TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFrombegin
ning);
Result := BinStream.ReadComponent(nil);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;
{ TInfoPanel_HFG }
procedure TInfoPanel_HFG.addControl_withStr(V: string;
FieldName: string = '');
var
c: TComponent;
l: integer;
con: TControl;
begin
c := StringToComponent(v);
if c is TControl then
with TControl(c)do
begin
Parent := Self;
end;
l := length(FControlRecList);
SetLength(FControlRecList, l + 1);
con := TControl(c);
FControlRecList[l].Control := Con;
FControlRecList[l].FieldName := FieldName;
setEventALL(con);
end;
procedure TInfoPanel_HFG.begin
Design;
begin
if FStretchHandle <> nil then
exit;
FStretchHandle := TStretchHandle.Create(nil);
Fold_C_OnMouseDown := C_OnMouseDown;
C_OnMouseDown := StretchHandleMouseDown;
end;
procedure TInfoPanel_HFG.ClearControl;
var
i: integer;
begin
for i := high(FControlRecList)do
wnto 0do
begin
FControlRecList.Control.Free;
FControlRecList.FieldName := '';
end;
SetLength(FControlRecList, 0);
end;
procedure TInfoPanel_HFG.EndDesign;
begin
if FStretchHandle = nil then
exit;
FreeAndNil(FStretchHandle);
C_OnMouseDown := Fold_C_OnMouseDown;
end;
procedure TInfoPanel_HFG.LoadControl(ss: TStrings);
var
i: integer;
strLine: string;
slTmp: TStringList;
procedure CreatCon;
var
strFieldName: string;
begin
if slTmp.Count > 3 then
begin
strFieldName := slTmp[0];
setlength(strFieldName, length(strFieldName) - 1);
strFieldName := copy(strFieldName, 2, System.MaxInt);
slTmp.Delete(0);
addControl_withStr(slTmp.Text, strFieldName);
end;
end;
begin
ClearControl;
slTmp := TStringList.Create;
for i := 0 to ss.Count - 1do
begin
strLine := ss;
if strLine <> '' then
if (strLine[1] = '[') and (strLine[length(strLine)] = ']') then
begin
CreatCon;
slTmp.Clear;
slTmp.Add(strLine);
Continue;
end;
slTmp.Add(strLine);
end;
CreatCon
end;
procedure TInfoPanel_HFG.SaveControl(ss: TStrings);
var
i: integer;
begin
ss.Clear;
for i := 0 to high(FControlRecList)do
begin
ss.Add('[' + FControlRecList.FieldName + ']');
ss.Add(ComponentToString(FControlRecList.Control))
end;
end;
procedure TInfoPanel_HFG.setControl_OnMouseDown(v: TMouseEvent);
var
i: integer;
begin
FControl_OnMouseDown := v;
for i := 0 to high(FControlRecList)do
setEvent(FControlRecList.Control, 'OnMouseDown');
end;
procedure TInfoPanel_HFG.setEvent(con: TControl;
eventName: string);
begin
if IsPublishedProp(con, eventName) then
begin
if IsPublishedProp(self, 'C_' + eventName) then
begin
SetMethodProp(con, eventName, GetMethodProp(self, 'C_' + eventName));
end;
end;
end;
procedure TInfoPanel_HFG.setEventALL(con: TControl);
begin
setEvent(con, 'OnChange');
setEvent(con, 'OnClick');
setEvent(con, 'OnDblClick');
setEvent(con, 'OnEnter');
setEvent(con, 'OnKeyUp');
setEvent(con, 'OnKeyDown');
setEvent(con, 'OnKeyPress');
setEvent(con, 'OnMouseUp');
setEvent(con, 'OnMouseDown');
end;
procedure TInfoPanel_HFG.StretchHandleMouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
begin
FStretchHandle.Detach;
FStretchHandle.Attach(TControl(sender));
end;
initialization
RegisterClass(TLabel);
RegisterClass(TEdit);
RegisterClass(TComboBox);
RegisterClass(TButton);
RegisterClass(TSpeedButton);
RegisterClass(TDateTimePicker);
end.