我做了一个下拉列表控件,里面有一个DBGrid,我想要把他放在Published区域,以便在对象浏览器中编辑它的Columns属性.可是我发现,如果不设置DBGrid.SetSubComponent(True),则Columns将无法保存在dfm文件中,设置DBGrid.SetSubComponent(True)后,又发现无法读取Columns属性.请问各位有什么好办法解决这个问题?

解决方案 »

  1.   

    unit AnyNurbsActions;interface
                
    uses
      Windows, SysUtils, Variants, Classes, Controls, AnyStdCtrlsTools, AnyNurbs,
      AnyGlobalConsts, AnyXYs, AnyMap;
      
    type
      TCreateNurbsAction=class(TCreateShapeAction)
      private
        LineTracker:TAnyNurbs;
      public
        //------------------------------------------------------------------------//
        constructor Create(AView: TAnyMap);override;
        destructor Destroy; override;
        //------------------------------------------------------------------------//
        class function ToolId:Word;override;
        class function ToolType:TToolType;override;
        //------------------------------------------------------------------------//
        procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
          X, Y: Integer); override;
        procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
        //------------------------------------------------------------------------//
        procedure Paint; override;
        procedure MarkNoTrackFrame; override;
        //------------------------------------------------------------------------//
      end;implementation{ TCreateNurbsAction }constructor TCreateNurbsAction.Create(AView: TAnyMap);
    begin
      inherited Create(AView);
      LineTracker:=TAnyNurbs.Create;
    end;destructor TCreateNurbsAction.Destroy;
    begin
      LineTracker.Free;
      inherited Destroy;
    end;procedure TCreateNurbsAction.MarkNoTrackFrame;
    begin
      LineTracker.MarkNoTrackFrame;
    end;procedure TCreateNurbsAction.MouseDown(Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      APolyLine:TAnyNurbs;
      Pt:TAny2DPoint;
      PointIndex:Integer;
      LocalTrackData:TAnyNurbsFrameData;
    begin
      inherited;
      case Button of
        mbLeft:begin
          if LineTracker.InTracking then
          begin
            with LineTracker do
            begin
              ClearTrackFrame;
              {增加顶点}
              LocalTrackData:=TAnyNurbsFrameData(TrackData);
              Pt:=Parent.CanvasToClient(X, Y);
              PointIndex:=LocalTrackData.Points.Count-1;
              LocalTrackData.Points.CUEditXY(PointIndex, Pt.X, Pt.Y);
              LocalTrackData.Points.CUAddXY(Pt.X, Pt.Y);
              DrawTrackFrame;
            end;
          end
          else
          begin
            View.Container.CheckActiveEditLayer;
            with LineTracker do
            begin
              {则重新初始化LineTracker}
              Parent:=View.SelectionManager.Root;
              MapCanvas:=View.MapCanvas;
              Points.CUClear;
              {增加第一个点}
              Pt:=Parent.CanvasToClient(X, Y);
              Points.CUAddXY(Pt.X, Pt.Y);
              Points.CUAddXY(Pt.X, Pt.Y);
              {开始跟踪}
              BeginTrack;
            end;
          end;
        end;
        mbRight:begin
          with LineTracker do
          begin
            {如果正在编辑,则结束编辑}
            if InTracking then
            begin
              {结束跟踪}
              EndTrack;
              {创建多边形,并应用当前的LineTracker设置}
              APolyLine:=TAnyNurbs(CreateShapeAt(TAnyNurbs, 0, 0));
              APolyLine.Assign(LineTracker);
              AddAndRefresh(APolyLine);
            end;
          end;
        end;
      end;   
    end;
    procedure TCreateNurbsAction.MouseMove(Shift: TShiftState; X, Y: Integer);
    var
      Pt:TAny2DPoint;
      PointIndex:Integer;
      LocalTrackData:TAnyNurbsFrameData;
    begin
      inherited;
      with LineTracker do
        if InTracking then
        begin
          ClearTrackFrame;
          LocalTrackData:=TAnyNurbsFrameData(TrackData);
          Pt:=Parent.CanvasToClient(X, Y);
          PointIndex:=LocalTrackData.Points.Count-1;
          LocalTrackData.Points.Items[PointIndex]^:=Geo2DPoint(Pt.X, Pt.Y);
          DrawTrackFrame;
        end;
    end;procedure TCreateNurbsAction.Paint;
    begin
      if LineTracker.InTracking then
        LineTracker.DrawTrackFrame;
    end;class function TCreateNurbsAction.ToolId: Word;
    begin
      Result:=ID_TOOL_CREATE_NURBS;
    end;class function TCreateNurbsAction.ToolType: TToolType;
    begin
      Result:=ttCreate;
    end;end.