控件设计中的Onsize问题(100分)

  • 主题发起人 主题发起人 bluerain
  • 开始时间 开始时间
B

bluerain

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个关于Panel VCL,在Panel上放了2个Label,2个ComboBox,
具体位置如下:
Label1 ComboBox1 Label2 Combobox2

在Onsize事件中写了调整位置的代码,在设计期时一切正常,
Panel拉大拉小,Label,ComboBox的位置调整都正确,可是在
运行时,ComboBox的大小好象没有变化,不知是什么原因?
至于Label,我是将AutoSize设置为False.
另外我动态生成该VCL时(即在代码中Create该对象)也位置
调整也正常。
那位大虾指点一二,不胜感激!
 
很简单, 你控件中的Label和combobox没有保存到dfm中. 因为它们不是published并且
你也没有(八成没有)override Defineproperties定义新的property, 所以你在IDE中对label
和combobox所做的任何修改都没有保存到DFM中, 不信可以在form上放上你的控件
然后view form as text看一下, 保证没有关于label和combobox的信息.
 
对,我的Label和combobox是在代码中Create的。
我不知道如何才能将有关信息放到dfm中。
一定要将定义新的published property吗?将Label和Combobox的
left,height,wight,top属性放到published中好象怪怪的。

 
最简单的方法是重载DefineProperties方法, 在那里面自定义一个property, 然后自己
写Load/Write这个property的代码(注意, 是保存到Stream和从Stream中取). 这样你可
以让IDE保存任何你希望的信息到DFM中, 比如你可以定义一个叫Addition的属性, 通
过它同时保存/读取Label和combobox的属性, 而且这个Property只供IDE保存/读取时
才用到, 平时使用时并不可见
 
自己写Load/Write这个property的代码(注意, 是保存到Stream和从Stream中取).
请麻烦讲的详细一点,好吗?我还是不太明白。或者大虾指点一下这方面的资料
也可。
这个问题是我的最后一个问题。麻烦了。

 
看看 TCustomGrid 的例子,定义 ColWidth 和 RowHeight 属性以及读写属性的过程:

procedure TCustomGrid.DefineProperties(Filer: TFiler);

function DoColWidths: Boolean;
begin
if Filer.Ancestor <> nil then
Result := not CompareExtents(TCustomGrid(Filer.Ancestor).FColWidths, FColWidths)
else
Result := FColWidths <> nil;
end;

function DoRowHeights: Boolean;
begin
if Filer.Ancestor <> nil then
Result := not CompareExtents(TCustomGrid(Filer.Ancestor).FRowHeights, FRowHeights)
else
Result := FRowHeights <> nil;
end;


begin
inherited DefineProperties(Filer);
if FSaveCellExtents then
with Filer do
begin
DefineProperty('ColWidths', ReadColWidths, WriteColWidths, DoColWidths);
DefineProperty('RowHeights', ReadRowHeights, WriteRowHeights, DoRowHeights);
end;
end;

procedure TCustomGrid.ReadColWidths(Reader: TReader);
var
I: Integer;
begin
with Reader do
begin
ReadListBegin;
for I := 0 to ColCount - 1 do ColWidths := ReadInteger;
ReadListEnd;
end;
end;

procedure TCustomGrid.ReadRowHeights(Reader: TReader);
var
I: Integer;
begin
with Reader do
begin
ReadListBegin;
for I := 0 to RowCount - 1 do RowHeights := ReadInteger;
ReadListEnd;
end;
end;

procedure TCustomGrid.WriteColWidths(Writer: TWriter);
var
I: Integer;
begin
with Writer do
begin
WriteListBegin;
for I := 0 to ColCount - 1 do WriteInteger(ColWidths);
WriteListEnd;
end;
end;

procedure TCustomGrid.WriteRowHeights(Writer: TWriter);
var
I: Integer;
begin
with Writer do
begin
WriteListBegin;
for I := 0 to RowCount - 1 do WriteInteger(RowHeights);
WriteListEnd;
end;
end;
 
多人接受答案了。
 
后退
顶部