VclSkin原理及相关问题

Eagle_ice 2009-08-18 08:37:18
大家好,我用的是VclSkin5.03版本,我想请教一下它换皮肤的原理,TSkinData类中有很多类及方法,但是很多不知道是做什么的,还有我通过Button单击换皮肤,没效果,是说要进行画面的更新吗?
Code:

procedure TForm1.FormCreate(Sender: TObject);
begin
if not SkinData1.Active then
begin
SkinData1.Active:= True;
end;
OpenDialog1.Filter:='Skin皮肤文件(*.skn)|*.SKN';
OpenDialog1.InitialDir:='D:\Program Files\VclSkin\VCLSkin5.03.07.12\skins\'
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
// SkinData1.LoadFromCollection(SkinStore1, 0);
// SkinStore1.LoadFromFile(OpenDialog1.FileName);
SkinData1.SkinFile:= OpenDialog1.FileName;
// SkinData1.SkinStore:= OpenDialog1.FileName;
end;
end;

程序运行起来,点击Button没反应?但是如果你在Object Inspector中去设置它的Active和SkinStore再运行就OK,为什么在代码中操作就不行呢?请指教...
...全文
238 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eagle_ice 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zzflover 的回复:]
我试了,没有报错,你在窗体关闭里写什么代码了?我这么写的,没问题
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  skindata1.Active:=false;
  Action:=cafree;
end;
要不就是VCL版本不一样?
[/Quote]
正解,窗体关闭时,我没有去将它的Active:= False;多谢...
7年 2009-08-19
  • 打赏
  • 举报
回复
我试了,没有报错,你在窗体关闭里写什么代码了?我这么写的,没问题
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
skindata1.Active:=false;
Action:=cafree;
end;
要不就是VCL版本不一样?
7年 2009-08-19
  • 打赏
  • 举报
回复
报错 ?我这没有啊。==我去试试。
Eagle_ice 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zzflover 的回复:]
我做了下测试,你改下代码就可以了
procedure TForm1.FormCreate(Sender: TObject);
begin
//  if not SkinData1.Active then
//  begin
//    SkinData1.Active:= True;
//  end;
  OpenDialog1.Filter:='Skin皮肤文件(*.skn)|*.SKN';
  OpenDialog1.InitialDir:='D:\第三方控件\VclSkin\skins\'
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
  begin
//    SkinData1.LoadFromCollection(SkinStore1, 0);
//    SkinStore1.LoadFromFile(OpenDialog1.FileName);
    SkinData1.SkinFile:= OpenDialog1.FileName;
//    SkinData1.SkinStore:= OpenDialog1.FileName;
    skindata1.Active:=true;
  end;

end;
[/Quote]
这样可以解决问题,但是窗体在关闭的时候会报错...
报错出现在TWinSkinForm.DrawBorder的
temp:=GetHMap(r,fsd.border[n].map,fsd.border[n].r,I,fsd.border[n].frame,Tile,sp);
请问这是什么问题?
7年 2009-08-19
  • 打赏
  • 举报
回复
我做了下测试,你改下代码就可以了
procedure TForm1.FormCreate(Sender: TObject);
begin
// if not SkinData1.Active then
// begin
// SkinData1.Active:= True;
// end;
OpenDialog1.Filter:='Skin皮肤文件(*.skn)|*.SKN';
OpenDialog1.InitialDir:='D:\第三方控件\VclSkin\skins\'
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
// SkinData1.LoadFromCollection(SkinStore1, 0);
// SkinStore1.LoadFromFile(OpenDialog1.FileName);
SkinData1.SkinFile:= OpenDialog1.FileName;
// SkinData1.SkinStore:= OpenDialog1.FileName;
skindata1.Active:=true;
end;

end;
bdmh 2009-08-19
  • 打赏
  • 举报
回复
VclSkin好像有一个激活的属性,要激活它才有效果,好像是active之类的
lhy 2009-08-18
  • 打赏
  • 举报
回复
好像要用钩子什么的。
dinoalex 2009-08-18
  • 打赏
  • 举报
回复
最好是loadfromstream

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧