TCustomControl做容器,TGraphicControl做子窗口的控件,需要有什么注意的事项?TGraphicControl显示不正常 ( 积分: 1

  • 主题发起人 主题发起人 wjh00a
  • 开始时间 开始时间
W

wjh00a

Unregistered / Unconfirmed
GUEST, unregistred user!
TCustomControl做容器,TGraphicControl做子窗口的控件,需要有什么注意的事项?TGraphicControl显示不正常 ( 积分: 100 )<br />写一个体彩走势图的控件
(走势图,各期开奖结果列表)THistory从TCustomControl继承
(开奖结果,也就是红点)THistoryItem是从TGraphicControl继承下来的
(两边显示的“期数”“总和”“距离”等)THistoryText也是从TGraphicControl继承。

走势图根据选择的彩票类型进行动态变化,刚开始的时候都没问题(下面的第一副图),可变化一段时间后就成第二副图的样了,THistoryItem全部看不见了,还有THistoryText除了在最左边的“期数”可以看到,右边的那部分也全看不见了。

调试的时候发现THistoryItem里面PAINT函数都不执行。。。已经两天了都找不出原因。郁闷死了。 只有在程序主窗口RESIZE的时候,THistoryItem的PAINT才会执行,但是只能显示部分而不能全部都出来。

两次对比的图片如下:
http://photo.store.qq.com/http_imgload.cgi?/rurl2=6ab98598e73818d431ddfef82cad2090efeda6fe367cda50c94956d571e601c836ace2eeeffe46123b55627d7b0dd78625d018b8c282200b000cf78990bec07443882687b055fffad9b4fe9f7f216b6b4d33316c

有个要补充的是,中间部分,也就是第二张图中的那些方格是属于THistory(父类:TCustomControl),是THistory画出来的。

也就是说TCustomControl的都正常,而TGraphicControl经过几次动态变化后就出问题了。 我有数过,一般差不多变个40次左右就出问题了。

//这个函数用来做走势图类型变换。
procedure THistory.SetItemInf(const Value: TItemInf);
var
I: Integer;
begin
if Value.RecordCount > FItemInf.RecordCount then
begin
SetLength(FItems, Value.RecordCount);
for I := FItemInf.RecordCount to Value.RecordCount-1 do
begin
FItems := THistoryItem.Create(self);
end;
end;
if FItemInf.RecordCount > Value.RecordCount then
begin
for I := Value.RecordCount to FItemInf.RecordCount-1 do
begin
FItems.Free;
end;
SetLength(FItems, Value.RecordCount);
end;

FItemInf.RecordCount := Value.RecordCount;
for I := 0 to FItemInf.RecordCount-1 do
begin
FItemInf.Records := Value.Records;
FItems.Number := Value.Records;
end;
SetPosition;
end;

//这个是用来设置他们的位置的。调试的时候位置都没问题。

procedure THistory.SetPosition;
var
I: Integer;
ItemPoint: TPoint;
begin
FIndex.Width := GetHistoryIndexWidth(FItemWidth);
FTotal.Width := GetHistoryItemWidth(FItemWidth);
FParity.Width := FTotal.Width;
FRepeat.Width := FTotal.Width;
FDistance.Width := FTotal.Width;
FIndex.Height := FItemHeight;
FTotal.Height := FItemHeight;
FParity.Height := FItemHeight;
FRepeat.Height := FItemHeight;
FDistance.Height := FItemHeight;

FIndex.Left := 0;
FTotal.Left := FIndex.Width + ItemWidth*FItemCount;
FParity.Left := FTotal.Left + FTotal.Width -1;
FRepeat.Left := FParity.Left + FParity.Width -1;
FDistance.Left := FRepeat.Left + FRepeat.Width -1;

for I := 0 to ItemInf.RecordCount-1 do
begin
FItems.Width := FItemWidth-2;
FItems.Height := FItemHeight-2;
ItemPoint := GetItemPoint(FItems.Number);
FItems.Left := ItemPoint.X;
FItems.Top := ItemPoint.Y;
end;

Width := FDistance.Left + FDistance.Width;
Height := ItemHeight;
end;

///这个函数用来画出一个红点还有输出一个数字而已,没做什么其他的。

procedure THistoryItem.Paint;
begin
inherited;
if bResetTextPoint then SetTextPoint;
with Canvas do
begin
if Number > 0 then begin
ColorOld := Brush.Color;
Brush.Color := clRed;
FillRgn(Handle, Rgn, Brush.Handle);
Brush.Color := ColorOld;

StyleOld := Brush.Style;
Brush.Style := bsClear;
TextOut(PointText.X, PointText.Y, IntToStr(Number));
Brush.Style := StyleOld;
end;
end;
end;


======================================
已经好三天了,我都快疯了。。。。
 
有点补充的是,在图左上角的那个用来选择范围的双滑块轨道条(TRangeBar),即使从来都没去动过他的情况下,在那个走势图出现问题后也会跟着不能使用。

TRangeBar同样也是用TCustomControl做容器,TGraphicControl做子窗口的控件。
 
后退
顶部