EPrivelege error: 是关于权限方面的错误,比如在Win NT/2000中调用ExitWindowEx就需要设置一下权限。
Check Range error:是因为有些参数超界了。
abstract error:是因为创建了抽象类并调用了抽象方法。如上面仁兄所说,代码呢?

解决方案 »

  1.   

    procedure tMainForm.CreateDLLForm(Mname,FuncName,FuncPass: String;FuncType:integer);
    var
                                //Mname 中文菜单名称  FUNCNAME: 菜单的英文名称      FUNCTYPE:表类型如电费. FUNCPASS:表示路径消息
      MyModMain: TModMain;
      Path,DllPath,LocalPath:String;
      WinName: array[0..144] of char;
      I:Integer;
    begin
      dllModHandle_ := LoadLibrary(Pchar(LocalPath));
      if dllModHandle_<> 0 then
      begin
        @MyModMain := GetProcAddress(dllModHandle_,'ModMain');
        if (@MyModMain <> nil) then
        begin
            //CurrentformHandle_:=MyModMain(inttostr(ssdw),LoginUserid,MYCOLOR,Mname,IME,DbUser,dbPassword,FuncPass,BDEAlias,0,scrollbox1,panelShow.Handle,mainform.handle,Sessions);
            currentModhandle_:=DllModhandle_;
            MainForm.caption:=MName;        Inc(ArrayIndex_);   //数组下标加一
            setLength(MyArray,ArrayIndex_+1);
            MyArray[ArrayIndex_]:=CurrentModHandle_;
            GetWindowText(CurrentformHandle_, WinName, 144);
            ///////////////////////////////////////////////////
            setLength(pnlLeftArray,ArrayIndex_+1);                         //却省界面
            setLength(pnlCancelArray,ArrayIndex_+1);
            setLength(pnlBackArray,ArrayIndex_+1);
            pnlBackArray[arrayIndex_]:=TMyPanel.Create(pnlOnToolbar);
            with pnlBackArray[arrayIndex_] do begin
              Parent:=pnlOnToolbar;
              Align:=alLeft;
              Caption:='';
              Width:=120;
              tag:=currentModhandle_;
              Hint:=FuncPass;
              borderStyle:=bsNone;
              bevelOuter:=bvNone;
              bevelInner:=bvLowered;
              isDown:=false;
              Name:='PnlBack'+IntToStr(ArrayIndex_);
             // OnMouseEnter:=MyMouseEnterDB;
             // OnMouseLeave:=MyMouseLeaveDB;
              //OnMouseMove:=MyMouseMoveDB;
              pnlOnToolbar.Width:=pnlOnToolbar.Width+60;
            end;        pnlLeftArray[arrayIndex_]:=TMyPanel.Create(pnlBackArray[arrayIndex_]);
            with pnlLeftArray[arrayIndex_] do begin
              Parent:=pnlBackArray[arrayIndex_];
              Align:=alclient;
              Alignment:=taLeftJustify;
              Caption:=strpas(winname);
              font.Charset:=GB2312_CHARSET;
              font.Name:='宋体';
              font.Size:=10;
              width:=length(caption)*6;
              //Width:=GetTextLen;
              tag:=currentModhandle_;
              Hint:=FuncPass;
              Name:='PnlLeft'+IntToStr(ArrayIndex_);
              OnClick:=MyLeftClick;
              borderStyle:=bsNone;
              bevelOuter:=bvNone;
              bevelInner:=bvLowered;
              IsDown:=True;
             // OnMouseEnter:=MyMouseEnter;
              //OnMouseMove:= MyMouseMove;
              //OnMouseLeave:=MyMouseLeave;
             // pnlBackArray[arrayIndex_].Width:=Width+20;   //为地板长度
             // pnlOnToolbar.Width:=pnlOnToolbar.Width+60;
            end;        pnlCancelArray[arrayIndex_]:=TMyPanel.Create(pnlBackArray[arrayIndex_]);
            with pnlCancelArray[arrayIndex_] do begin
              Parent:=pnlBackArray[arrayIndex_];
              Align:=alRight;
              Caption:='X';
              Width:=20;
              tag:=currentModhandle_;
              Hint:=FuncPass;
              Name:='pnlCancel'+IntToStr(ArrayIndex_);
              OnClick:=tbtncloseDllFrmClick;
              borderStyle:=bsNone;
              bevelOuter:=bvNone;
              bevelInner:=bvRaised;
              IsDown:=false;
             // OnMouseEnter:=MyMouseEnter;
              //OnMouseMove:= MyMouseMove;
             // OnMouseLeave:=MyMouseLeave;
            end;
        {
          for i:=low(MyArray) to High(MyArray) do    //取出当前句柄索引值
          begin
            if MyArray[i]=LongInt(currentModhandle_) then  //重新整理下凹 ,把新创建的下凹
            begin
              pnlLeftArray[I].BevelOuter:=bvNone;
              pnlLeftArray[I].BevelInner:=bvLowered;
              pnlLeftArray[I].isDown:=true;
              TMyPanel(pnlLeftArray[I].Parent).bevelOuter:=bvnone;
              TMyPanel(pnlLeftArray[I].Parent).bevelInner:=bvLowered;          //break;
            end
            else
            begin
              pnlLeftArray[I].BevelOuter:=bvNone;
              pnlLeftArray[I].BevelInner:=bvNone;
              pnlLeftArray[I].IsDown:=false;
              pnlCancelArray[I].BevelOuter:=bvNone;
              pnlCancelArray[I].BevelInner:=bvNone;
              TMyPanel(pnlLeftArray[I].Parent).bevelOuter:=bvnone;
              TMyPanel(pnlLeftArray[I].Parent).bevelInner:=bvNone;        end;
          end;
          pnlbackCentrel.bevelOuter:=bvnone;
          pnlbackCentrel.bevelInner:=bvnone;
          pnlleftCentrel.bevelOuter:=bvnone;
          pnlleftCentrel.bevelInner:=bvnone;
         }
           { TabSheetArray[arrayIndex_]:=ttabsheet.Create(self);
            tabsheetArray[arrayIndex_].Caption:=strpas(winname);
            tabsheetArray[arrayIndex_].PageControl:=pagecontrol1;
            tabsheetArray[arrayindex_].tag:=currentModhandle_;
            tabsheetArray[arrayindex_].Hint:=FuncPass;
          }
           { tabsheetArray[arrayindex_].Brush.Style:=bsSolid;
            tabsheetArray[arrayindex_].Brush.Color:=clyellow;
            tabsheetArray[arrayindex_].Repaint;
            }
    ////////////////////////////////////////////////////////////
         setLength(MenuItemsArray,ArrayIndex_+1);
         MenuitemsArray[ArrayIndex_]:= menus.NewItem(strpas(winname),TextToShortCut('Ctrl+'+inttostr(ArrayIndex_)),false,true,nil,0,'menuites'+inttostr(ArrayIndex_));
         MenuitemsArray[ArrayIndex_].Tag:=currentModHandle_;
         MenuItemsArray[ArrayIndex_].Hint:=FuncPass;
         MenuitemsArray[ArrayIndex_].OnClick:=MenuClick;
         MnuView.Add(MenuItemsArray[ArrayIndex_]);
        end
        else
          ShowMessage('调用非法的模块,在模块内没有指定方法,(CreateDllForm)');
      end
      else
        ShowMessage('加载程序失败'+LocalPath+'  在(CreateDllForm)');
    end;procedure TMainform.myMessage(var Msg:TMessage);
    var tmpNode:tfcTreeNode;
    begin
      MsgCloseBZ:=false;
      if not CheckDllModHandle(CurrentModhandle_) then begin
        application.MessageBox('异常错误,当前句柄不存在','错误',MB_OK + MB_DEFBUTTON1);
        exit;
      end;  if CurrentModHandle_<> 0 then
      begin
        deleteMenuItem(CurrentModHandle_);
        FreePnlLeft(CurrentModHandle_);
        FreePnlCancel(CurrentModHandle_);
        FreePnlBack(CurrentModHandle_);
        pnlOnToolbar.Width:=pnlOnToolbar.Width-60;    if FindHandle(currentModHandle_) then
        begin
          tmpNode:= GetNode2(CurrentModHandle_);
          tmpNode.StringData:='';                  //删除树的stringData置为零
          Treechange(tree,tmpnode.Parent);
        end;
          FreeArrayHandle;
          MsgCloseBZ:=true;
    ////////////////////////////////////////////////////////////////
          dec(ArrayIndex_);                        //由于释放了一个DLLFORM所以    arrayIndex_ 再减去一
          if (ArrayIndex_>=0) then
          begin
            currentModHandle_:=Myarray[ArrayIndex_];
            showDLLForm(pnlLeftArray[arrayindex_].Hint,CurrentModHandle_);
          end
          else
          begin
            currentModHandle_:=0;
            mainform.Caption:= '苏源高科系统主控模块';
            panel100.SendToBack;
            paneldb.BringToFront;
          end;
    ///////////////////////////////////////////////////////////////////////
      end
      else
        begin
          ShowMessage('响应消息错误,当前的句柄值为'+inttostr(currentModHandle_));
          //application.Terminate;
        end;procedure TMainForm.FreePnlBack(FreeTabHandle: thandle);
    var I,J:integer;
    begin
       j:=-1;   for  I:=low(pnlBackArray) to high(pnlBackArray) do
       begin
         if pnlBackArray[i].Tag=LongInt(FreeTabHandle) then
         begin
           pnlBackArray[i].free;
           j:=i;
           break;
         end;
       end;   if (j=0) and (j=high(pnlBackArray)) then
       begin
         pnlBackArray:=nil;
         exit;
       end;   if j=High(pnlBackArray) then
       begin
         SetLength(tmppnlBackArray,high(pnlBackArray)); //设置tmpMyArray的长度,把数据倒入,再灌入MyArray中
         for I:=0 to high(pnlBackArray)-1 do //
         begin                                     //
           tmppnlBackArray[i]:=pnlBackArray[i];
         end;                                      //
         pnlBackArray:=nil;                             //
         setLength(pnlBackArray,high(tmppnlBackArray)+1);
         for I:=0 to High(tmppnlBackArray) do //
         begin
           pnlBackArray[i]:=tmppnlBackArray[i];              //
         end;
         tmppnlBackArray:=nil;                          //
         exit;
       end;   for I:=j to High(pnlBackArray)-1 do
       begin
         pnlBackArray[i]:=pnlBackArray[i+1];
       end;
         SetLength(tmppnlBackArray,high(pnlBackArray)); //设置tmpMyArray的长度,把数据倒入,再灌入MyArray中
         for I:=low(pnlBackArray) to high(pnlBackArray)-1 do //
         begin                                     //
           tmppnlBackArray[i]:=pnlBackArray[i];
         end;                                      //
         pnlBackArray:=nil;                             //
         setLength(pnlBackArray,high(tmppnlBackArray)+1);
         for I:=low(tmppnlBackArray) to High(tmppnlBackArray) do //
         begin
           pnlBackArray[i]:=tmppnlBackArray[i];              //
         end;
    end;procedure TMainForm.FreePnlCancel(FreeTabHandle: thandle);
    var I,J:integer;
    begin
       j:=-1;
       for  I:=low(pnlCancelArray) to high(pnlCancelArray) do
       begin
         if pnlCancelArray[i].Tag=LongInt(FreeTabHandle) then
         begin
           pnlCancelArray[i].free;
           j:=i;
           break;
         end;
       end;   if (j=0) and (j=high(pnlCancelArray)) then
       begin
         pnlCancelArray:=nil;
         exit;
       end;   if j=High(pnlCancelArray) then
       begin
         SetLength(tmppnlCancelArray,high(pnlCancelArray)); //设置tmpMyArray的长度,把数据倒入,再灌入MyArray中
         for I:=0 to high(pnlCancelArray)-1 do //
         begin                                     //
           tmppnlCancelArray[i]:=pnlCancelArray[i];
         end;                                      //
         pnlCancelArray:=nil;                             //
         setLength(pnlCancelArray,high(tmppnlCancelArray)+1);
         for I:=0 to High(tmppnlCancelArray) do //
         begin
           pnlCancelArray[i]:=tmppnlCancelArray[i];              //
         end;
         tmppnlCancelArray:=nil;                          //
         exit;
       end;   for I:=j to High(pnlCancelArray)-1 do
       begin
         pnlCancelArray[i]:=pnlCancelArray[i+1];
       end;
         SetLength(tmppnlCancelArray,high(pnlCancelArray)); //设置tmpMyArray的长度,把数据倒入,再灌入MyArray中
         for I:=low(pnlCancelArray) to high(pnlCancelArray)-1 do //
         begin                                     //
           tmppnlCancelArray[i]:=pnlCancelArray[i];
         end;                                      //
         pnlCancelArray:=nil;                             //
         setLength(pnlCancelArray,high(tmppnlCancelArray)+1);
         for I:=low(tmppnlCancelArray) to High(tmppnlCancelArray) do //
         begin
           pnlCancelArray[i]:=tmppnlCancelArray[i];              //
         end;
    end;
      

  2.   

    我把部分代码贴出来了,  问题比较难因为是有时报错,有时正确,谁要是解决了,我给他1500分procedure TMainForm.MyMouseEnter(Sender: Tobject);
    begin
      TMyPanel(sender).parent.Perform(CM_MouseEnter,0,0);
    end;procedure TMainForm.MyMouseLeave(sender: tobject);
    begin
      TMyPanel(sender).parent.Perform(CM_MouseLeave,0,0);
    end;procedure TMainForm.MyMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      TMyPanel(sender).parent.Perform(WM_MOUSEMOVE,0,0);
    end;procedure TMainForm.MyMouseMoveDB(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var I:integer;
        PnlTemp:TControl;
        tmpControlName:String;begin
        for I := 0 to TMyPanel(sender).ComponentCount-1 do
        begin
          tmpControlName:=TMyPanel(sender).Components[I].name;
          pnlTemp:=TMyPanel(sender).FindChildControl(tmpControlName);
          if TMyPanel(pnlTemp).isdown then begin
             TMyPanel(sender).bevelOuter:=bvNone;
             TMyPanel(sender).bevelInner:=bvLowered;
             TMyPanel(sender).borderstyle:=bsNone;
          end
          else begin
          TMyPanel(pnlTemp).BevelInner:=bvnone;
          TMyPanel(pnlTemp).BevelOuter:=bvRaised;
          end;
        end;end;procedure TMainForm.MyMouseEnterDB(Sender: Tobject);
    var I:integer;
        PnlTemp:TControl;
        tmpControlName:String;
    begin
      for I := 0 to TMyPanel(sender).ComponentCount-1 do
        begin
          tmpControlName:=TMyPanel(sender).Components[I].name;
          pnlTemp:=TMyPanel(sender).FindChildControl(tmpControlName);
          if TMyPanel(pnlTemp).isdown then begin
             TMyPanel(sender).bevelOuter:=bvNone;
             TMyPanel(sender).bevelInner:=bvLowered;
             TMyPanel(sender).borderstyle:=bsNone;
          end
          else begin
          TMyPanel(pnlTemp).BevelInner:=bvnone;
          TMyPanel(pnlTemp).BevelOuter:=bvRaised;
          end;
        end;
    end;procedure TMainForm.MyMouseLeaveDB(sender: tobject);
    var I:integer;
        PnlTemp:TControl;
        tmpControlName:String;
    begin
      TMyPanel(sender).bevelOuter:=bvNone;
      TMyPanel(sender).bevelInner:=bvNone;
      TMyPanel(sender).BorderStyle:=bsNone;
      for I := 0 to TMyPanel(sender).ComponentCount-1 do
        begin
          tmpControlName:=TMyPanel(sender).Components[I].name;
          pnlTemp:=TMyPanel(sender).FindChildControl(tmpControlName);
          if TMyPanel(pnlTemp).isdown then begin       //如果是IsDown 那么就是left
            TMyPanel(sender).bevelOuter:=bvNone;
            TMyPanel(sender).bevelInner:=bvLowered;
            TMyPanel(sender).BorderStyle:=bsNone;
          end
          else begin
            TMyPanel(pnlTemp).BevelInner:=bvNone;
            TMyPanel(pnlTemp).BevelOuter:=bvNone;
          end;
        end;
    end;
      

  3.   

    现在是经常的打开关闭达到7,8次时候报错 bpl 错误,有时EAbstract error,