{special tab: parts settings}

function DlgProcOptions0(Dialog:HWND;hMessage:uint;wParam:WPARAM;lParam:LPARAM):LRESULT; stdcall;
const
  hasApply:boolean=false;
var
  i:integer;
  ptr:pwModule;
  wnd:HWND;
  rc:TRECT;
begin
  result:=0;
  case hMessage of
    WM_DESTROY: begin
      if hasApply then
      begin
        ptr:=ModuleLink;
        while ptr<>nil do
        begin
          if ptr^.ModuleName<>nil then
          begin
            i:=SendMessageW(ptr^.Button,BM_GETCHECK,0,0);
            if (i=BST_CHECKED) xor (ptr^.ModuleStat<>0) then
            begin
              if i=BST_CHECKED then
              begin
                ptr^.ModuleStat:=1;
                if @ptr^.Init<>nil then
                  if ptr^.Init(false)=0 then
                    ptr^.ModuleStat:=0;
              end
              else
              begin
                ptr^.ModuleStat:=0;
                if @ptr^.DeInit<>nil then
                  ptr^.DeInit(true);
              end;
            end;
//            if ptr^.ModuleStat then
          end;
          ptr:=ptr^.Next;
        end;
      end;
    end;

    WM_INITDIALOG: begin

      hasApply:=false;

      ptr:=ModuleLink;
      i:=0;
      while ptr<>nil do
      begin
        if ptr^.ModuleName<>nil then
        begin
          ptr^.Button:=CreateWindowW('BUTTON',TranslateW(ptr^.ModuleName),
              WS_CHILD+WS_VISIBLE+BS_AUTOCHECKBOX,
              14,20+i*20,150,14,Dialog,0,hInstance,nil);
          SendMessageW(ptr^.Button,WM_SETFONT,GetStockObject(DEFAULT_GUI_FONT),0);
          if ptr^.ModuleStat<>0 then
            SendMessageW(ptr^.Button,BM_SETCHECK,BST_CHECKED,0);
          inc(i);
        end;
        ptr:=ptr^.Next;
      end;
      if i>0 then
      begin
        wnd:=GetDlgItem(Dialog,IDC_MODULEGROUP);
        GetWindowRect(wnd,rc);
        SetWindowPos (wnd,0,0,0,rc.Right-rc.Left,(i+1)*20,
            SWP_NOMOVE+SWP_NOZORDER+SWP_NOACTIVATE);
      end;

      TranslateDialogDefault(Dialog);
    end;

    WM_COMMAND: begin
      if (wParam shr 16)=BN_CLICKED then
        SendMessage(GetParent(Dialog),PSM_CHANGED,0,0);
    end;

    WM_NOTIFY: begin
      if integer(PNMHdr(lParam)^.code)=PSN_APPLY then
      begin
        hasApply:=true;
      end;
    end;
  else
    {result:=}DefWindowProc(Dialog,hMessage,wParam,lParam);
  end;
end;