大家好,我用的是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,为什么在代码中操作就不行呢?请指教...

解决方案 »

  1.   

    VclSkin好像有一个激活的属性,要激活它才有效果,好像是active之类的
      

  2.   

    我做了下测试,你改下代码就可以了
    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;
      

  3.   

    这样可以解决问题,但是窗体在关闭的时候会报错...
    报错出现在TWinSkinForm.DrawBorder的
    temp:=GetHMap(r,fsd.border[n].map,fsd.border[n].r,I,fsd.border[n].frame,Tile,sp);
    请问这是什么问题?
      

  4.   

    我试了,没有报错,你在窗体关闭里写什么代码了?我这么写的,没问题
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      skindata1.Active:=false;
      Action:=cafree;
    end;
    要不就是VCL版本不一样?
      

  5.   

    正解,窗体关闭时,我没有去将它的Active:= False;多谢...