• 主页
  • 招聘
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API

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,为什么在代码中操作就不行呢?请指教...
...全文
155 点赞 收藏 8
写回复
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
回复 点赞
发动态
发帖子
Delphi
创建于2007-08-02

1478

社区成员

26.2w+

社区内容

Delphi 开发及应用
社区公告
暂无公告