这段程序有程序问题在哪儿?(50分)

  • 主题发起人 主题发起人 luaijun
  • 开始时间 开始时间
L

luaijun

Unregistered / Unconfirmed
GUEST, unregistred user!

procedure TForm1.FormCreate(Sender: TObject);
var Bitmap:TBitMap;
begin
ListBox1.Items:=Screen.Fonts;
Bitmap:=TBitMap.Create ;
Bitmap.LoadFromFile('FIRST.BMP');
TabSet1.Tabs.AddObject('first',Bitmap);
Bitmap:=TBitMap.Create ;
Bitmap.LoadFromFile('LAST.BMP');
TabSet1.Tabs.AddObject('last',Bitmap);

end;

procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;
var Height: Integer);
begin
with ListBox1.Canvas do
begin
Font.Name :=ListBox1.Items[index];
Height:=TextHeight('a');
end;
end;

procedure TForm1.TabSet1MeasureTab(Sender: TObject; Index: Integer;
var TabWidth: Integer);
var BitmapWidth:Integer;
begin
BitmapWidth:=TBitmap(TabSet1.Tabs.Objects[index]).Width;//这句有错,去掉后编译通过
Inc(TabWidth,2+BitmapWidth);
end;

procedure TForm1.TabSet1DrawTab(Sender: TObject; TabCanvas: TCanvas;
R: TRect; Index: Integer; Selected: Boolean);
var Bitmap:TBitMap;
begin
Bitmap:=TBitMap(TabSet1.Tabs.Objects[index]);
with TabSet1.Canvas do
begin
Draw(R.Left,R.Top+4,Bitmap);
TextOut(R.Left+2+Bitmap.Width,R.Top+2,TabSet1.Tabs[index]);
end;
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with ListBox1.Canvas do
begin
FillRect(Rect);
Font.Name:=ListBox1.Items[index];
TextOut(Rect.Left,Rect.Top,ListBox1.Items[index]);
end;
end;

end.
 
我试了一下,没错误,一切正常。
 
BitmapWidth:=(TabSet1.Tabs.Objects[index] as tbitmap).Width;
 
谢谢各位
BitmapWidth:=TBitmap(TabSet1.Tabs.Objects[index]).Width;这句有错
错误显示如下: (raised exception...... with message'access voilation at addreeess...')
read of address 00000000

to hhzh426 :我替换成你的源码仍然不成,错误信息一样

是不是我的编译器有问题,我是delphi5.0 D版
 
这种情况通常是没有对象或者对象被释放以后再对其进行引用时产生的错误!
你作如下修改后再试试!
procedure TForm1.FormCreate(Sender: TObject);
var Bitmap:TBitMap;
begin
ListBox1.Items:=Screen.Fonts;
Bitmap:=TBitMap.Create ;
TabSet1.tabs.clear;
Bitmap.LoadFromFile('FIRST.BMP');
TabSet1.Tabs.AddObject('first',Bitmap);
Bitmap.LoadFromFile('LAST.BMP');
TabSet1.Tabs.AddObject('last',Bitmap);
end;

 
to hhzh426:你说的很对,非常感谢,按你说的做,编译可通过
不过,又产生新问题,我想在tabset上产即有位图又有文字的效果,按原来的程序编译后这个效
果没有,tabset上什么都没有,我想请问,是不是不是这样实现,这样实现为什么不行

 
你必须在ondrawtab事件中自己画图和写字,因为你将它的风格设置成自画的了。
 
我发现原因了,TAB的宽度是由标题文字的多少来决定的,因此你要在自画的时候将标题前面
增加一定数量的空格,然后画图,写字(写字之前将空格截去)。根据你的程序,应该能看
到一部分位图!
 
to hhzh426
我试了一下,还是什么也看不到,你可给一例程吗,或在我的程序上直接改也成
你说自画前将标题前面增加一定数量的,我不太明的,我在ondrawtab事件试着对tabs 赋值,会
出错
我是一delphi初学者,不胜感谢 
 
后退
顶部