1. 程式人生 > >DAX 錯誤另外一種解決辦法

DAX 錯誤另外一種解決辦法

 一個是ParkingWindowProc()函式,修改如下: function ParkingWindowProc(Wnd: HWND; Msg, wParam, lParam: Longint): Longint; stdcall; var   ControlWnd: HWND; begin   case Msg of     WM_COMPAREITEM, WM_DELETEITEM, WM_DRAWITEM, WM_MEASUREITEM, WM_COMMAND:       begin         case Msg of           WM_COMPAREITEM: ControlWnd := PCompareItemStruct(lParam).CtlID;           WM_DELETEITEM:  ControlWnd := PDeleteItemStruct(lParam).CtlID;           WM_DRAWITEM:    ControlWnd := PDrawItemStruct(lParam).CtlID;           WM_MEASUREITEM: ControlWnd := PMeasureItemStruct(lParam).CtlID;           WM_COMMAND:     ControlWnd := HWND(lParam);         else           Result := 0;           Exit;         end;         Result := SendMessage(ControlWnd, OCM_BASE + Msg, wParam, lParam);       end;   else     ////////////////////////////////////////////////////////////////////////////     //zhaoyan edit begin     {     if (Msg = WM_NCDESTROY) and (Wnd = xParkingWindow) then xParkingWindow := 0;     Result := DefWindowProc(Wnd, Msg, WParam, LParam);     }     if (Msg = WM_NCDESTROY) and (Wnd = xParkingWindow) then     begin         xParkingWindow := 0;         Result := DefWindowProc(Wnd, Msg, WParam, LParam);     end else begin         Result := SendMessage(ControlWnd, OCM_BASE + Msg, wParam, lParam);     end;     //zhaoyan edit end     /////////////////////////////////////////////////////////////////////////////   end; end; -------------------------------------------------------- 另外一個是ParkingWindow()函式,修改如下: function ParkingWindow: HWND; var   TempClass: TWndClass;   ParkingName:String; //zhaoyan add begin   Result := xParkingWindow;   if Result <> 0 then Exit;   //zhaoyan add start   //fixDaxerror:accessviolation(win2k,winxp)   ParkingName:='DAXParkingWindow_'+Format('%p',[@ParkingWindowProc]);   //zhaoyan add end   FillChar(TempClass, sizeof(TempClass), 0);   //zhaoyan edit start   //fixDaxerror:accessviolation(win2k,winxp)   if not GetClassInfo(HInstance,PChar(ParkingName),TempClass)then   //if not GetClassInfo(HInstance, 'DAXParkingWindow', TempClass) then   //zhaoyan edit end   begin     TempClass.hInstance := HInstance;     TempClass.lpfnWndProc := @ParkingWindowProc;     //zhaoyan edit start     TempClass.lpszClassName:=PChar(ParkingName);//fixDaxerror:accessviolation(win2k,winxp)     //TempClass.lpszClassName := 'DAXParkingWindow';     //zhaoyan edit end     if Windows.RegisterClass(TempClass) = 0 then       raise EOutOfResources.Create(SWindowClass);   end;   xParkingWindow := CreateWindowEx(WS_EX_TOOLWINDOW, TempClass.lpszClassName, nil,     WS_POPUP, GetSystemMetrics(SM_CXSCREEN) div 2,     GetSystemMetrics(SM_CYSCREEN) div 2, 0, 0, 0, 0, HInstance, nil);   SetWindowPos(xParkingWindow, 0, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOREDRAW     or SWP_NOZORDER or SWP_SHOWWINDOW);   Result := xParkingWindow; end; -------------------------------------------------------- 結貼 -------------------------------------------------------- 一個是ParkingWindowProc()函式,修改如下:   function  ParkingWindowProc(Wnd:  HWND;  Msg,  wParam,  lParam:  Longint):  Longint;  stdcall;   var      ControlWnd:  HWND;   begin      case  Msg  of          WM_COMPAREITEM,  WM_DELETEITEM,  WM_DRAWITEM,  WM_MEASUREITEM,  WM_COMMAND:              begin                  case  Msg  of                      WM_COMPAREITEM:  ControlWnd  :=  PCompareItemStruct(lParam).CtlID;                      WM_DELETEITEM:    ControlWnd  :=  PDeleteItemStruct(lParam).CtlID;                      WM_DRAWITEM:        ControlWnd  :=  PDrawItemStruct(lParam).CtlID;                      WM_MEASUREITEM:  ControlWnd  :=  PMeasureItemStruct(lParam).CtlID;                      WM_COMMAND:          ControlWnd  :=  HWND(lParam);                  else                      Result  :=  0;                      Exit;                  end;                  Result  :=  SendMessage(ControlWnd,  OCM_BASE  +  Msg,  wParam,  lParam);              end;      else          ////////////////////////////////////////////////////////////////////////////          //zhaoyan  edit  begin          {          if  (Msg  =  WM_NCDESTROY)  and  (Wnd  =  xParkingWindow)  then  xParkingWindow  :=  0;          Result  :=  DefWindowProc(Wnd,  Msg,  WParam,  LParam);          }          if  (Msg  =  WM_NCDESTROY)  and  (Wnd  =  xParkingWindow)  then          begin                  xParkingWindow  :=  0;                  Result  :=  DefWindowProc(Wnd,  Msg,  WParam,  LParam);          end  else  begin                  Result  :=  SendMessage(ControlWnd,  OCM_BASE  +  Msg,  wParam,  lParam);          end;          //zhaoyan  edit  end          /////////////////////////////////////////////////////////////////////////////      end;   end;  按上面改後,對原有的在XP和2000系統的IE6環境下,控制元件無法釋放的問題解決了,但隨之而來的問題是原來在Tscrollbar中有一個TImage控制元件進行畫圖時,出現錯拉!造成更大的問題!