www.pudn.com > mmtd1.1.rar > SUIDsgn.pas


//////////////////////////////////////////////////////////////////////////////// 
// 
// 
//  FileName    :   SUIDsgn.pas 
//  Creator     :   Shen Min 
//  Date        :   2003-04-07 V1-V3 
//                  2003-07-11 V4 
//  Comment     : 
// 
//  Copyright (c) 2002-2003 Sunisoft 
//  http://www.sunisoft.com 
//  Email: support@sunisoft.com 
// 
//////////////////////////////////////////////////////////////////////////////// 
 
unit SUIDsgn; 
 
interface 
 
{$I SUIPack.inc} 
 
uses Classes, Forms, Controls, TypInfo, Menus, StdCtrls, ComCtrls, ExtCtrls, 
     CheckLst, SysUtils, Grids, Dialogs, Mask, FileCtrl, Windows, 
     {$IFDEF DB}DBCtrls, DBGrids,{$ENDIF} 
{$IFDEF SUIPACK_D5} 
    DsgnIntf; 
{$ENDIF} 
{$IFDEF SUIPACK_D6UP} 
    DesignIntf, DesignEditors, DesignMenus; 
{$ENDIF} 
 
type 
    TsuiPageControlEditor = class(TComponentEditor) 
    public 
        procedure Edit; override; 
        procedure ExecuteVerb(Index:Integer);override; 
        function GetVerb(Index:Integer):String;override; 
        function GetVerbCount:Integer;override; 
{$IFDEF SUIPACK_D5} 
        procedure PrepareItem(Index: Integer; const AItem: TMenuItem); override; 
{$ENDIF} 
{$IFDEF SUIPACK_D6UP} 
        procedure PrepareItem(Index: Integer; const AItem: IMenuItem); override; 
{$ENDIF} 
    end; 
 
    TsuiTabSheetEditor = class(TComponentEditor) 
    public 
        procedure Edit; override; 
        procedure ExecuteVerb(Index:Integer);override; 
        function GetVerb(Index:Integer):String;override; 
        function GetVerbCount:Integer;override; 
{$IFDEF SUIPACK_D5} 
        procedure PrepareItem(Index: Integer; const AItem: TMenuItem); override; 
{$ENDIF} 
{$IFDEF SUIPACK_D6UP} 
        procedure PrepareItem(Index: Integer; const AItem: IMenuItem); override; 
{$ENDIF} 
    end; 
 
    TsuiDialogEditor = class(TComponentEditor) 
    public 
        procedure Edit; override; 
    end; 
 
    TsuiThemeManagerEditor = class(TComponentEditor) 
    public 
        procedure Edit; override; 
        procedure ExecuteVerb(Index:Integer);override; 
        function GetVerb(Index:Integer):String;override; 
        function GetVerbCount:Integer;override; 
    end; 
 
    TsuiThemeMgrCompListEditor = class(TPropertyEditor) 
    public 
        procedure Edit(); override; 
        function GetAttributes() : TPropertyAttributes; override; 
        function GetValue() : string; override; 
    end; 
 
    TsuiConvertor = class(TComponent) 
    public 
        constructor Create(AOwner: TComponent); override; 
 
    end; 
 
    TsuiUnConvertor = class(TComponent) 
    public 
        constructor Create(AOwner : TComponent); override; 
         
    end; 
 
    TsuiThemeFileEditor = class(TPropertyEditor) 
    public 
        procedure Edit; override; 
        function GetAttributes: TPropertyAttributes; override; 
        function GetValue: string; override; 
    end; 
 
    TsuiFileThemeEditor = class(TComponentEditor) 
    public 
        procedure Edit; override; 
        procedure ExecuteVerb(Index:Integer);override; 
        function GetVerb(Index:Integer):String;override; 
        function GetVerbCount:Integer;override; 
    end; 
 
    TsuiBuiltInThemeFileEditor = class(TPropertyEditor) 
    public 
        procedure Edit; override; 
        function GetAttributes: TPropertyAttributes; override; 
        function GetValue: string; override; 
    end; 
 
    TsuiBuiltInFileThemeEditor = class(TsuiFileThemeEditor) 
    public 
        procedure Edit; override; 
    end; 
 
 
implementation 
 
uses SUIMgr, SUIPageControl, SUIDlg, SUIPublic, SUIThemes, SUIForm, frmConvert, 
     SUIPopupMenu, SUIMainMenu, SUIButton, SUIProgressBar, SUIEdit, SUIMemo, 
     SUIListBox, SUIComboBox, SUIColorBox, SUICheckListBox, SUIGroupBox, 
     SUIRadioGroup, SUIListView, SUITreeView, SUITabControl, SUITrackBar, 
     SUIScrollBar, SUIStatusBar, {$IFDEF DB}SUIDBCtrls,{$ENDIF} SUIGrid; 
 
// --------- Convertor ----------------------- 
type 
{$IFDEF SUIPACK_D6UP} 
    IsuiDesigner = type IDesigner; 
{$ENDIF} 
{$IFDEF SUIPACK_D5} 
    IsuiDesigner = type IFormDesigner; 
{$ENDIF} 
 
var 
    l_ToRemoveList : TList = nil; 
 
procedure RemoveOldControl(Ctrl : TComponent; DoNow : Boolean = false); 
var 
    i : Integer; 
begin 
    if DoNow then 
    begin 
        if l_ToRemoveList = nil then 
            Exit; 
        for i := 0 to l_ToRemoveList.Count - 1 do 
        begin 
            if l_ToRemoveList[i] = nil then 
                continue; 
            TComponent(l_ToRemoveList[i]).Free(); 
            l_ToRemoveList[i] := nil; 
        end; 
 
        l_ToRemoveList.Free(); 
        l_ToRemoveList := nil; 
    end 
    else 
    begin 
        if l_ToRemoveList = nil then 
            l_ToRemoveList := TList.Create(); 
        l_ToRemoveList.Add(Ctrl); 
    end; 
end; 
 
procedure AssignProps(NewCtrl, OldCtrl : TComponent; Dsgn : IsuiDesigner); 
    function SUIGetPropList(TypeInfo: PTypeInfo; out PropList: PPropList): Integer; overload; 
    begin 
      Result := GetTypeData(TypeInfo)^.PropCount; 
      if Result > 0 then 
      begin 
        GetMem(PropList, Result * SizeOf(Pointer)); 
        GetPropInfos(TypeInfo, PropList); 
      end; 
    end; 
 
    function SUIGetPropList(AObject: TObject; out PropList: PPropList): Integer; overload; 
    begin 
      Result := SUIGetPropList(PTypeInfo(AObject.ClassInfo), PropList); 
    end; 
 
var 
    PropList : PPropList; 
    nCount : Integer; 
    i : Integer; 
    PropInfo: PPropInfo; 
    PopupMenu : TPopupMenu; 
    {$IFDEF SUIPACK_D5} 
    TempObj : TObject; 
    {$ENDIF} 
begin 
    nCount := SUIGetPropList(OldCtrl, PropList); 
    try 
        for i := 0 to nCount - 1 do 
        begin 
            PropInfo := PropList^[I]; 
 
            if PropInfo^.Name = 'Name' then 
                continue; 
 
            if PropInfo^.Name = 'Top' then 
                continue; 
 
            if ( 
                (PropInfo^.Name = 'Items') and 
                (OldCtrl is TMenu) 
            ) then 
                continue; 
 
            if not IsHasProperty(NewCtrl, PropInfo^.Name) then 
                continue; 
 
            if PropInfo^.Name = 'PopupMenu' then 
            begin 
                PopupMenu := GetObjectProp(OldCtrl, 'PopupMenu') as TPopupMenu; 
                if PopupMenu <> nil then 
                begin 
                    if Copy(PopupMenu.Name, 1, 7) = 'suitemp' then 
                    begin 
                        SetObjectProp(NewCtrl, 'PopupMenu', Dsgn.GetComponent(Copy(PopupMenu.Name, 8, Length(PopupMenu.Name)))); 
                        Continue; 
                    end; 
                end; 
            end; 
 
            case PropInfo^.PropType^.Kind of 
 
            tkInteger, tkChar, tkWChar, tkEnumeration : 
            begin 
                try 
                    SetOrdProp(NewCtrl, PropInfo^.Name, GetOrdProp(OldCtrl, PropInfo^.Name)); 
                except 
                end; 
            end; 
 
            tkFloat : 
            begin 
                try 
                    SetFloatProp(NewCtrl, PropInfo^.Name, GetFloatProp(OldCtrl, PropInfo^.Name)); 
                except 
                end; 
            end; 
 
            tkString : 
            begin 
                try 
                    SetStrProp(NewCtrl, PropInfo^.Name, GetStrProp(OldCtrl, PropInfo^.Name)); 
                except 
                end; 
            end; 
 
            tkSet : 
            begin 
                {$IFDEF SUIPACK_D6UP} 
                try 
                    SetSetProp(NewCtrl, PropInfo^.Name, GetSetProp(OldCtrl, PropInfo^.Name)); 
                except 
                end; 
                {$ENDIF} 
            end; 
 
            tkMethod : 
            begin 
                try 
                    SetMethodProp(NewCtrl, PropInfo^.Name, GetMethodProp(OldCtrl, PropInfo^.Name)); 
                except 
                end; 
            end; 
 
            tkClass : 
            begin 
                {$IFDEF SUIPACK_D6UP} 
                try 
                    SetObjectProp(NewCtrl, PropInfo^.Name, GetObjectProp(OldCtrl, PropInfo^.Name)); 
                except 
                end; 
                {$ENDIF} 
                {$IFDEF SUIPACK_D5} 
                try 
                    TempObj := GetObjectProp(OldCtrl, PropInfo^.Name); 
                    if TempObj is TStrings then 
                        SetObjectProp(NewCtrl, PropInfo^.Name, TempObj); 
                except 
                end; 
                {$ENDIF} 
            end; 
 
            else 
            begin 
                try 
                    if PropInfo^.Name = 'Caption' then 
                        SetStrProp(NewCtrl, PropInfo^.Name, GetStrProp(OldCtrl, PropInfo^.Name)); 
                except 
                end; 
            end; 
 
            end; //case 
        end; 
    finally 
        FreeMem(PropList); 
    end; 
end; 
 
Procedure ConvertControls(var Ctrl : TControl; Cls : TControlClass; UIStyle : String; IncHeight : Integer; Dsgn : IsuiDesigner); 
var 
    NewCtrl : TControl; 
    TempName : String; 
    TempName2 : String; 
    Form : TCustomForm; 
begin 
    try 
        NewCtrl := Dsgn.CreateComponent(Cls, Ctrl.Parent, Ctrl.Left, Ctrl.Top + IncHeight, Ctrl.Width, Ctrl.Height) as TControl; 
    except 
        Form := GetParentForm(Ctrl); 
        NewCtrl := Dsgn.CreateComponent(Cls, Form, Ctrl.Left, Ctrl.Top + IncHeight, Ctrl.Width, Ctrl.Height) as TControl; 
        NewCtrl.Parent := Ctrl.Parent; 
        NewCtrl.SetBounds(Ctrl.Left, Ctrl.Top, Ctrl.Width, Ctrl.Height); 
    end; 
 
    AssignProps(NewCtrl, Ctrl, Dsgn); 
    if IsHasProperty(NewCtrl, 'UIStyle') then 
        SetEnumProp(NewCtrl, 'UIStyle', UIStyle); 
    TempName := Ctrl.Name; 
    TempName2 := 'suitemp' + TempName; 
    if Dsgn.GetComponent(TempName2) <> nil then 
        TempName2 := TempName2 + '1'; 
    Ctrl.Name := TempName2; 
    NewCtrl.Name := TempName; 
 
    if NewCtrl is TsuiScrollBar then 
        (NewCtrl as TsuiScrollBar).LargeChange := 2; 
    if NewCtrl is TsuiTabSheet then 
    begin 
        (NewCtrl as TsuiTabSheet).PageIndex := (NewCtrl as TsuiTabSheet).PageControl.PageCount - 1; 
    end; 
    RemoveOldControl(Ctrl); 
    Ctrl := NewCtrl;     
end; 
 
type 
    TMenuClass = class of TMenu; 
 
Procedure ConvertMenus(Comp : TMenu; Cls : TMenuClass; UIStyle : String; Dsgn : IsuiDesigner); 
var 
    NewMenu : TMenu; 
    TempName : String; 
    TempName2 : String; 
    i : Integer; 
    MenuItem : TMenuItem; 
begin 
    NewMenu := Dsgn.CreateComponent(Cls, Comp.Owner, 0, 0, 0, 0) as TMenu; 
    AssignProps(NewMenu, Comp, Dsgn); 
    SetEnumProp(NewMenu, 'UIStyle', UIStyle); 
    TempName := Comp.Name; 
    TempName2 := 'suitemp' + TempName; 
    if Dsgn.GetComponent(TempName2) <> nil then 
        TempName2 := TempName2 + '1'; 
    Comp.Name := TempName2; 
    NewMenu.Name := TempName; 
     
    for i := 0 to Comp.Items.Count - 1 do 
    begin 
        MenuItem := Comp.Items[0]; 
        Comp.Items.Delete(0); 
        NewMenu.Items.Add(MenuItem); 
    end; 
 
    RemoveOldControl(Comp); 
end; 
 
procedure ConvertToSUIPack(Form : TCustomForm; StrUIStyle: String; UIStyle : TsuiUIStyle); 
var 
    Dsgn : IsuiDesigner; 
    i : Integer; 
    Ctrl : TControl; 
    Comp : TComponent; 
    suiForm : TsuiForm; 
    IncHeight : Integer; 
    FormIncHeight : Integer; 
    aDB: TComponent; 
    aFld: string; 
    bFld: string; 
    cFld: string;     
begin 
    Dsgn := Form.Designer as IsuiDesigner; 
 
    suiForm := TsuiForm(Dsgn.CreateComponent(TsuiForm, Form, 0, 0, 0, 0)); 
    suiForm.UIStyle := UIStyle; 
    suiForm.SendToBack(); 
    FormIncHeight := suiForm.TitleBarHeight; 
 
    if Form is TForm then 
        TForm(Form).Height := TForm(Form).Height + FormIncHeight; 
 
    for i := 0 to Form.ComponentCount - 1 do 
    begin // Pre-process menus 
        Comp := Form.Components[i]; 
        if Comp is TPopupMenu then 
            ConvertMenus(Comp as TPopupMenu, TsuiPopupMenu, StrUIStyle, Dsgn); 
        if Comp is TMainMenu then 
            ConvertMenus(Comp as TMainMenu, TsuiMainMenu, StrUIStyle, Dsgn); 
    end; 
 
    for i := 0 to Form.ComponentCount - 1 do 
    begin 
        if Form.Components[i] is TControl then 
        begin 
            IncHeight := FormIncHeight; 
 
            Ctrl := Form.Components[i] as TControl; 
 
            if IsHasProperty(Ctrl, 'DataSource') then 
               aDB := GetObjectProp(Ctrl, 'DataSource') as TComponent; 
            if IsHasProperty(Ctrl, 'DataField') then 
               aFld := GetPropValue(Ctrl, 'DataField'); 
            if IsHasProperty(Ctrl, 'ListField') then 
               bFld := GetPropValue(Ctrl, 'ListField'); 
            if IsHasProperty(Ctrl, 'KeyField') then 
               cFld := GetPropValue(Ctrl, 'KeyField'); 
 
            if ( 
                (Ctrl <> suiForm) and 
                (Ctrl.Parent = Form) 
            ) then 
                Ctrl.Parent := suiForm; 
 
            if ( 
                (Ctrl.Parent <> suiForm) and 
                (Ctrl.Parent <> nil) 
            ) then 
            begin 
                if Copy(Ctrl.Parent.Name, 1, 7) = 'suitemp' then 
                begin 
                    Comp := Dsgn.GetComponent(Copy(Ctrl.Parent.Name, 8, Length(Ctrl.Parent.Name))); 
                    if (Comp = nil) or (not (Comp is TWinControl)) then 
                        continue; 
                    Ctrl.Parent := Comp as TWinControl; 
                end; 
                IncHeight := 0; 
            end; 
 
            if Ctrl is TToolBar then 
            begin 
                (Ctrl as TToolBar).Top := 800; 
                (Ctrl as TToolBar).Flat := true; 
                continue; 
            end; 
 
            if Ctrl is TButton then 
                ConvertControls(Ctrl, TsuiButton, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TCheckBox then 
                ConvertControls(Ctrl, TsuiCheckBox, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TRadioButton then 
                ConvertControls(Ctrl, TsuiRadioButton, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TProgressBar then 
                ConvertControls(Ctrl, TsuiProgressBar, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TEdit then 
                ConvertControls(Ctrl, TsuiEdit, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TMemo then 
                ConvertControls(Ctrl, TsuiMemo, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TListBox then 
                ConvertControls(Ctrl, TsuiListBox, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TComboBox then 
                ConvertControls(Ctrl, TsuiComboBox, StrUIStyle, IncHeight, Dsgn) 
            {$IFDEF SUIPACK_D6UP} 
            else if Ctrl is TColorBox then 
                ConvertControls(Ctrl, TsuiColorBox, StrUIStyle, IncHeight, Dsgn) 
            {$ENDIF} 
            else if Ctrl is TCheckListBox then 
                ConvertControls(Ctrl, TsuiCheckListBox, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TGroupBox then 
                ConvertControls(Ctrl, TsuiGroupBox, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TRadioGroup then 
                ConvertControls(Ctrl, TsuiRadioGroup, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TListView then 
                ConvertControls(Ctrl, TsuiListView, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TTreeView then 
                ConvertControls(Ctrl, TsuiTreeView, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TTabControl then 
                ConvertControls(Ctrl, TsuiTabControl, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TTabSheet then 
                ConvertControls(Ctrl, TsuiTabSheet, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TPageControl then 
                ConvertControls(Ctrl, TsuiPageControl, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TTrackBar then 
                ConvertControls(Ctrl, TsuiTrackBar, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TScrollBar then 
                ConvertControls(Ctrl, TsuiScrollBar, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TStringGrid then 
                ConvertControls(Ctrl, TsuiStringGrid, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TDrawGrid then 
                ConvertControls(Ctrl, TsuiDrawGrid, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TStatusBar then 
                ConvertControls(Ctrl, TsuiStatusBar, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TMaskEdit then 
                ConvertControls(Ctrl, TsuiMaskEdit, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TDriveComboBox then 
                ConvertControls(Ctrl, TsuiDriveComboBox, StrUIStyle, IncHeight, Dsgn) 
{$IFDEF DB} 
            else if Ctrl is TDBEdit then 
                ConvertControls(Ctrl, TsuiDBEdit, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TDBMemo then 
                ConvertControls(Ctrl, TsuiDBMemo, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TDBImage then 
                ConvertControls(Ctrl, TsuiDBIMage, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TDBListBox then 
                ConvertControls(Ctrl, TsuiDBListBox, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TDBComboBox then 
                ConvertControls(Ctrl, TsuiDBComboBox, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TDBCheckBox then 
                ConvertControls(Ctrl, TsuiDBCheckBox, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TDBRadioGroup then 
                ConvertControls(Ctrl, TsuiDBRadioGroup, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TDBNavigator then 
                ConvertControls(Ctrl, TsuiDBNavigator, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TDBLookupListBox then 
                ConvertControls(Ctrl, TsuiDBLookupListBox, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TDBLookupComboBox then 
                ConvertControls(Ctrl, TsuiDBLookupComboBox, StrUIStyle, IncHeight, Dsgn) 
            else if Ctrl is TDBGrid then 
                ConvertControls(Ctrl, TsuiDBGrid, StrUIStyle, IncHeight, Dsgn) 
{$ENDIF} 
            else 
            begin 
                if IsHasProperty(Ctrl, 'Top') then 
                    SetOrdProp(Ctrl, 'Top', GetOrdProp(Ctrl, 'Top') + IncHeight); 
            end; 
 
            if IsHasProperty(Ctrl, 'DataSource') then 
                SetObjectProp(Ctrl, 'DataSource', aDB); 
            if IsHasProperty(Ctrl, 'DataField') then 
                SetPropValue(Ctrl, 'DataField', aFld); 
            if IsHasProperty(Ctrl, 'ListField') then 
                SetPropValue(Ctrl, 'ListField', bFld); 
            if IsHasProperty(Ctrl, 'KeyField') then 
                SetPropValue(Ctrl, 'KeyField', cFld);                                 
        end 
    end; 
 
    RemoveOldControl(nil, true); 
end; 
 
Procedure UnConvertMenus(Comp : TMenu; Cls : TMenuClass; Dsgn : IsuiDesigner); 
var 
    NewMenu : TMenu; 
    TempName : String; 
    TempName2 : String; 
    i : Integer; 
    MenuItem : TMenuItem; 
begin 
    NewMenu := Dsgn.CreateComponent(Cls, Comp.Owner, 0, 0, 0, 0) as TMenu; 
    AssignProps(NewMenu, Comp, Dsgn); 
    TempName := Comp.Name; 
    TempName2 := 'suitemp' + TempName; 
    if Dsgn.GetComponent(TempName2) <> nil then 
        TempName2 := TempName2 + '1'; 
    Comp.Name := TempName2; 
    NewMenu.Name := TempName; 
     
    for i := 0 to Comp.Items.Count - 1 do 
    begin 
        MenuItem := Comp.Items[0]; 
        Comp.Items.Delete(0); 
        NewMenu.Items.Add(MenuItem); 
        NewMenu.OwnerDraw := false; 
    end; 
 
    RemoveOldControl(Comp); 
end; 
 
Procedure UnConvertControls(var Ctrl : TControl; Cls : TControlClass; IncHeight : Integer; Dsgn : IsuiDesigner); 
var 
    NewCtrl : TControl; 
    TempName : String; 
    TempName2 : String; 
    Form : TCustomForm; 
begin 
    try 
        NewCtrl := Dsgn.CreateComponent(Cls, Ctrl.Parent, Ctrl.Left, Ctrl.Top - IncHeight, Ctrl.Width, Ctrl.Height) as TControl; 
        if NewCtrl is TTabSheet then 
        begin 
            NewCtrl.Parent := Ctrl.Parent; 
            (NewCtrl as TTabSheet).PageControl := Ctrl.Parent as TPageControl; 
        end; 
    except 
        Form := GetParentForm(Ctrl); 
        NewCtrl := Dsgn.CreateComponent(Cls, Form, Ctrl.Left, Ctrl.Top - IncHeight, Ctrl.Width, Ctrl.Height) as TControl; 
        NewCtrl.Parent := Ctrl.Parent; 
        NewCtrl.SetBounds(Ctrl.Left, Ctrl.Top, Ctrl.Width, Ctrl.Height); 
    end; 
 
    AssignProps(NewCtrl, Ctrl, Dsgn); 
    TempName := Ctrl.Name; 
    TempName2 := 'suitemp' + TempName; 
    if Dsgn.GetComponent(TempName2) <> nil then 
        TempName2 := TempName2 + '1'; 
    Ctrl.Name := TempName2; 
    NewCtrl.Name := TempName; 
 
    if NewCtrl is TTabSheet then 
    begin 
        (NewCtrl as TTabSheet).PageIndex := (NewCtrl as TTabSheet).PageControl.PageCount - 1; 
    end; 
    RemoveOldControl(Ctrl); 
    Ctrl := NewCtrl;     
end; 
 
procedure ConvertToVCL(Form : TCustomForm); 
var 
    Dsgn : IsuiDesigner; 
    i : Integer; 
    Ctrl : TControl; 
    Comp : TComponent; 
    suiForm : TsuiForm; 
    FormIncHeight : Integer; 
    IncHeight : Integer; 
    aDB: TComponent; 
    aFld: string;             
begin 
    Dsgn := Form.Designer as IsuiDesigner; 
    FormIncHeight := 0; 
    suiForm := nil; 
 
    g_SUIPackConverting := true; 
 
    for i := 0 to Form.ComponentCount - 1 do 
    begin // Pre-process menus and TsuiForm 
        Comp := Form.Components[i]; 
        if Comp is TsuiPopupMenu then 
            UnConvertMenus(Comp as TsuiPopupMenu, TPopupMenu, Dsgn); 
        if Comp is TsuiMainMenu then 
            UnConvertMenus(Comp as TsuiMainMenu, TMainMenu, Dsgn); 
        if Comp is TsuiForm then 
        begin 
            suiForm := Comp as TsuiForm; 
            FormIncHeight := suiForm.TitleBarHeight; 
        end; 
    end; 
 
    g_SUIPackConverting := false;     
 
//    if Form is TForm then 
//        TForm(Form).Height := TForm(Form).Height - FormIncHeight; 
 
    for i := 0 to Form.ComponentCount - 1 do 
    begin 
        if Form.Components[i] is TControl then 
        begin 
            IncHeight := FormIncHeight; 
 
            Ctrl := Form.Components[i] as TControl; 
 
            if IsHasProperty(Ctrl, 'DataSource') then 
               aDB := GetObjectProp(Ctrl, 'DataSource') as TComponent; 
            if IsHasProperty(Ctrl, 'DataField') then 
               aFld := GetPropValue(Ctrl, 'DataField'); 
 
            if suiForm <> nil then 
            begin 
                if ( 
                    (Ctrl <> suiForm) and 
                    (Ctrl.Parent = suiForm) 
                ) then 
                    Ctrl.Parent := Form; 
 
            end; 
 
            if ( 
                (Ctrl.Parent <> suiForm) and 
                (Ctrl.Parent <> Form) and 
                (Ctrl.Parent <> nil) 
            ) then 
            begin 
                if Copy(Ctrl.Parent.Name, 1, 7) = 'suitemp' then 
                begin 
                    Comp := Dsgn.GetComponent(Copy(Ctrl.Parent.Name, 8, Length(Ctrl.Parent.Name))); 
                    if (Comp = nil) or (not (Comp is TWinControl)) then 
                        continue; 
                    Ctrl.Parent := Comp as TWinControl; 
                end; 
                IncHeight := 0; 
            end; 
 
            if Ctrl.ClassNameIs('TsuiButton') then 
                UnConvertControls(Ctrl, TButton, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiCheckBox') then 
                UnConvertControls(Ctrl, TCheckBox, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiRadioButton') then 
                UnConvertControls(Ctrl, TRadioButton, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiProgressBar') then 
                UnConvertControls(Ctrl, TProgressBar, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiEdit') then 
                UnConvertControls(Ctrl, TEdit, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiMemo') then 
                UnConvertControls(Ctrl, TMemo, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiListBox') then 
                UnConvertControls(Ctrl, TListBox, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiComboBox') then 
                UnConvertControls(Ctrl, TComboBox, IncHeight, Dsgn) 
            {$IFDEF SUIPACK_D6UP} 
            else if Ctrl.ClassNameIs('TsuiColorBox') then 
                UnConvertControls(Ctrl, TColorBox, IncHeight, Dsgn) 
            {$ENDIF} 
            else if Ctrl.ClassNameIs('TsuiCheckListBox') then 
                UnConvertControls(Ctrl, TCheckListBox, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiGroupBox') then 
                UnConvertControls(Ctrl, TGroupBox, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiRadioGroup') then 
                UnConvertControls(Ctrl, TRadioGroup, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiListView') then 
                UnConvertControls(Ctrl, TListView, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiTreeView') then 
                UnConvertControls(Ctrl, TTreeView, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiTabControl') then 
                UnConvertControls(Ctrl, TTabControl, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiTabSheet') then 
                UnConvertControls(Ctrl, TTabSheet, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiPageControl') then 
                UnConvertControls(Ctrl, TPageControl, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiTrackBar') then 
                UnConvertControls(Ctrl, TTrackBar, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiScrollBar') then 
                UnConvertControls(Ctrl, TScrollBar, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiStringGrid') then 
                UnConvertControls(Ctrl, TStringGrid, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiDrawGrid') then 
                UnConvertControls(Ctrl, TDrawGrid, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiStatusBar') then 
                UnConvertControls(Ctrl, TStatusBar, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiMaskEdit') then 
                UnConvertControls(Ctrl, TMaskEdit, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiDriveComboBox') then 
                UnConvertControls(Ctrl, TDriveComboBox, IncHeight, Dsgn) 
{$IFDEF DB} 
            else if Ctrl.ClassNameIs('TsuiDBEdit') then 
                UnConvertControls(Ctrl, TDBEdit, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiDBMemo') then 
                UnConvertControls(Ctrl, TDBMemo, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiDBImage') then 
                UnConvertControls(Ctrl, TDBIMage, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiDBListBox') then 
                UnConvertControls(Ctrl, TDBListBox, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiDBComboBox') then 
                UnConvertControls(Ctrl, TDBComboBox, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiDBCheckBox') then 
                UnConvertControls(Ctrl, TDBCheckBox, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiDBRadioGroup') then 
                UnConvertControls(Ctrl, TDBRadioGroup, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiDBNavigator') then 
                UnConvertControls(Ctrl, TDBNavigator, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiDBLookupListBox') then 
                UnConvertControls(Ctrl, TDBLookupListBox, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiDBLookupComboBox') then 
                UnConvertControls(Ctrl, TDBLookupComboBox, IncHeight, Dsgn) 
            else if Ctrl.ClassNameIs('TsuiDBGrid') then 
                UnConvertControls(Ctrl, TDBGrid, IncHeight, Dsgn) 
{$ENDIF} 
            else 
            begin 
                if IsHasProperty(Ctrl, 'Top') then 
                    SetOrdProp(Ctrl, 'Top', GetOrdProp(Ctrl, 'Top') - IncHeight); 
            end; 
 
            if IsHasProperty(Ctrl, 'DataSource') then 
                SetObjectProp(Ctrl, 'DataSource', aDB); 
            if IsHasProperty(Ctrl, 'DataField') then 
                SetPropValue(Ctrl, 'DataField', aFld); 
        end 
    end; 
 
    if suiForm <> nil then 
        RemoveOldControl(suiForm); 
 
    RemoveOldControl(nil, true); 
end; 
 
{ TsuiPageControlEditor } 
 
procedure TsuiPageControlEditor.Edit; 
begin 
 
end; 
 
procedure TsuiPageControlEditor.ExecuteVerb(Index: Integer); 
begin 
    case Index of 
    0 : PageControl_InsertPage(Component); 
    1 : PageControl_RemovePage(Component); 
    end; 
 
    Designer.Modified(); 
end; 
 
function TsuiPageControlEditor.GetVerb(Index: Integer): String; 
begin 
    case Index of 
    0 : Result := 'New Page'; 
    1 : Result := 'Delete Page'; 
    end; 
end; 
 
function TsuiPageControlEditor.GetVerbCount: Integer; 
begin 
    Result := 2; 
end; 
 
procedure TsuiPageControlEditor.PrepareItem(Index: Integer; 
{$IFDEF SUIPACK_D5} 
    const AItem: TMenuItem); 
{$ENDIF} 
{$IFDEF SUIPACK_D6UP} 
    const AItem: IMenuItem); 
{$ENDIF} 
begin 
    inherited; 
    if Index = 1 then 
        AItem.Enabled := PageControl_CanRemove(Component); 
end; 
 
{ TsuiUnConvertor } 
 
constructor TsuiUnConvertor.Create(AOwner: TComponent); 
begin 
    inherited; 
 
    if not (AOwner is TCustomForm) then 
        Exit; 
 
    if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then 
    begin 
        MessageDlg('Sorry, can''t convert under Windows 98.', mtError, [mbOK], 0); 
        SysUtils.Abort; 
        Exit; 
    end; 
 
    if MessageDlg('Are you sure to convert all controls to the standard VCL?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then 
        ConvertToVCL(TCustomForm(AOwner)); 
 
    SysUtils.Abort; 
end; 
 
{ TsuiFileThemeEditor } 
 
procedure TsuiFileThemeEditor.Edit; 
begin 
    if Component is TsuiFileTheme then 
    begin 
        FileThemeEdit(Component as TsuiFileTheme); 
        Designer.Modified(); 
    end; 
end; 
 
procedure TsuiFileThemeEditor.ExecuteVerb(Index: Integer); 
begin 
    case Index of 
    0 : Edit; 
    end; 
end; 
 
function TsuiFileThemeEditor.GetVerb(Index: Integer): String; 
begin 
    case Index of 
    0 : Result := 'Load a theme file...'; 
    end; 
end; 
 
function TsuiFileThemeEditor.GetVerbCount: Integer; 
begin 
    Result := 1; 
end; 
 
{ TsuiThemeMgrCompListEditor } 
 
procedure TsuiThemeMgrCompListEditor.Edit; 
begin 
    ThemeManagerEdit(GetComponent(0) as TsuiThemeManager); 
    Designer.Modified(); 
end; 
 
function TsuiThemeMgrCompListEditor.GetAttributes: TPropertyAttributes; 
begin 
    Result := [paDialog, paReadOnly{$IFDEF SMLPACK_D6UP}, paVCL{$ENDIF}]; 
end; 
 
function TsuiThemeMgrCompListEditor.GetValue: string; 
begin 
    Result := 'Component List'; 
end; 
 
{ TsuiTabSheetEditor } 
 
procedure TsuiTabSheetEditor.Edit; 
begin 
 
end; 
 
procedure TsuiTabSheetEditor.ExecuteVerb(Index: Integer); 
begin 
    case Index of 
    0 : TabSheet_InsertPage(Component); 
    1 : TabSheet_RemovePage(Component); 
    end; 
 
    Designer.Modified(); 
end; 
 
function TsuiTabSheetEditor.GetVerb(Index: Integer): String; 
begin 
    case Index of 
    0 : Result := 'New Page'; 
    1 : Result := 'Delete Page'; 
    end; 
end; 
 
function TsuiTabSheetEditor.GetVerbCount: Integer; 
begin 
    Result := 2; 
end; 
 
procedure TsuiTabSheetEditor.PrepareItem(Index: Integer; 
{$IFDEF SUIPACK_D5} 
    const AItem: TMenuItem); 
{$ENDIF} 
{$IFDEF SUIPACK_D6UP} 
    const AItem: IMenuItem); 
{$ENDIF} 
begin 
    inherited; 
    if Index = 1 then 
        AItem.Enabled := TabSheet_CanRemove(Component); 
end; 
 
{ TsuiDialogEditor } 
 
procedure TsuiDialogEditor.Edit; 
begin 
    if Component is TsuiDialog then 
        (Component as TsuiDialog).ShowModal(); 
end; 
 
{ TsuiThemeManagerEditor } 
 
procedure TsuiThemeManagerEditor.Edit; 
begin 
    if Component is TsuiThemeManager then 
    begin 
        ThemeManagerEdit(Component as TsuiThemeManager); 
        Designer.Modified(); 
    end; 
end; 
 
procedure TsuiThemeManagerEditor.ExecuteVerb(Index: Integer); 
begin 
    case Index of 
    0 : Edit; 
    end; 
end; 
 
function TsuiThemeManagerEditor.GetVerb(Index: Integer): String; 
begin 
    case Index of 
    0 : Result := 'Edit list...'; 
    end; 
end; 
 
function TsuiThemeManagerEditor.GetVerbCount: Integer; 
begin 
    Result := 1; 
end; 
 
{ TsuiConvertor } 
 
constructor TsuiConvertor.Create(AOwner: TComponent); 
var 
    Form : TCustomForm; 
    i : Integer; 
begin 
    inherited; 
 
    if not (AOwner is TCustomForm) then 
        Exit; 
 
    if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then 
    begin 
        MessageDlg('Sorry, can''t convert under Windows 98.', mtError, [mbOK], 0); 
        SysUtils.Abort; 
        Exit; 
    end; 
 
    Form := AOwner as TCustomForm; 
    for i := 0 to Form.ControlCount - 1 do 
    begin 
        if Form.Controls[i] is TsuiForm then 
        begin 
            MessageDlg('Sorry, you have a TsuiForm already. Converting canceled.', mtError, [mbOK], 0); 
            SysUtils.Abort; 
            Exit; 
        end; 
    end; 
 
    frmConv := TfrmConv.Create(nil); 
    frmConv.cb_theme.ItemIndex := 0; 
    if frmConv.ShowModal() = mrOK then 
        ConvertToSUIPack(TCustomForm(AOwner), frmConv.cb_theme.Text, TsuiUIStyle(frmConv.cb_theme.ItemIndex + 1)); 
    frmConv.Free(); 
    SysUtils.Abort; 
end; 
 
{ TsuiThemeFileEditor } 
 
procedure TsuiThemeFileEditor.Edit; 
var 
    OpenDialog: TOpenDialog; 
begin 
    OpenDialog := TOpenDialog.Create(Application); 
    OpenDialog.Filter := 'SUIPack Theme File(*.sui)|*.sui'; 
    if OpenDialog.Execute() then 
    begin 
        TsuiFileTheme(GetComponent(0)).ThemeFile := OpenDialog.FileName; 
        Modified(); 
    end; 
    OpenDialog.Free(); 
end; 
 
function TsuiThemeFileEditor.GetAttributes: TPropertyAttributes; 
begin 
    Result := [paDialog]; 
end; 
 
function TsuiThemeFileEditor.GetValue: string; 
begin 
    Result := TsuiFileTheme(GetComponent(0)).ThemeFile; 
end; 
 
{ TsuiBuiltInThemeFileEditor } 
 
procedure TsuiBuiltInThemeFileEditor.Edit; 
var 
    OpenDialog: TOpenDialog; 
begin 
    OpenDialog := TOpenDialog.Create(Application); 
    OpenDialog.Filter := 'SUIPack Theme File(*.sui)|*.sui'; 
    if OpenDialog.Execute() then 
    begin 
        TsuiBuiltInFileTheme(GetComponent(0)).ThemeFile := OpenDialog.FileName; 
        Modified(); 
    end; 
    OpenDialog.Free(); 
end; 
 
function TsuiBuiltInThemeFileEditor.GetAttributes: TPropertyAttributes; 
begin 
    Result := [paDialog, paReadOnly]; 
end; 
 
function TsuiBuiltInThemeFileEditor.GetValue: string; 
begin 
    Result := TsuiBuiltInFileTheme(GetComponent(0)).ThemeFile; 
end; 
 
{ TsuiBuiltInFileThemeEditor } 
 
procedure TsuiBuiltInFileThemeEditor.Edit; 
begin 
    if Component is TsuiFileTheme then 
    begin 
        BuiltInFileThemeEdit(Component as TsuiBuiltInFileTheme); 
        Designer.Modified(); 
    end; 
end; 
 
end.