⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 teecomma.pas

📁 complete source code for teechart 7
💻 PAS
📖 第 1 页 / 共 2 页
字号:
begin
  if FPanel is TCustomAxisPanel then result:=TeeCommanMsg_Chart
                                else result:=TeeCommanMsg_Panel;
end;

Procedure TCustomTeeCommander.FreeOwnedControls;
var Num : Integer;
    tmp : Integer;
    t   : Integer;
begin
  Repeat
    Num:=0;
    tmp:=-1;
    for t:=0 to ControlCount-1 do
    if Controls[t].Owner=Self then
    begin
      Inc(Num);
      tmp:=t;
    end;
    if tmp<>-1 then
    begin
      RemovingControl(Controls[tmp]);
      Controls[tmp].Free;
    end;
  Until Num=0;
end;

procedure TCustomTeeCommander.RemovingControl(AControl: TControl);
begin
end;

{ TTeeCommander }
Constructor TTeeCommander.Create(AOwner:TComponent);
begin
  inherited;
  {$IFNDEF TEEOCXNOEDITOR}
  FEditor:=nil;
  FPreviewer:=nil;
  {$ENDIF}
  FDragging:=False;
  FLabelValues:=True;
  FVertical:=False;
  FEnablePieExp:=True;

  CreateControls([ tcbNormal,
                   tcbSeparator,
                   tcbRotate,
                   tcbMove,
                   tcbZoom,
                   tcbDepth,
                   tcb3D,
                   tcbSeparator,
                   tcbEdit,
                   tcbPrintPreview,
                   tcbCopy,
                   tcbSave,
                   tcbLabel ]);

  {$IFDEF TEEOCXNOEDITOR}
  FButtonEdit.Hide;
  FButtonPrint.Hide;
  RepositionControls;
  {$ENDIF}
  
  if Assigned(FButtonNormal) then FButtonNormal.Down:=True;
end;

Procedure TTeeCommander.RemovingControl(AControl:TControl);
begin
  inherited;
  if AControl=FButtonNormal then FButtonNormal:=nil else
  if AControl=FButtonRotate then FButtonRotate:=nil else
  if AControl=FButtonMove then FButtonMove:=nil else
  if AControl=FButtonZoom then FButtonZoom:=nil else
  if AControl=FButtonDepth then FButtonDepth:=nil else
  if AControl=FButtonEdit then FButtonEdit:=nil else
  if AControl=FButtonPrint then FButtonPrint:=nil else
  if AControl=FButtonCopy then FButtonCopy:=nil else
  if AControl=FButtonSave then FButtonSave:=nil else
  if AControl=FButton3D then FButton3D:=nil else
  if AControl=FLabel then FLabel:=nil;
end;

Procedure TTeeCommander.CreateControls(AControls:Array of TeeCommanderControls);
var t,
    tmpPos:Integer;
begin
  FreeOwnedControls;
  tmpPos:=4;

  for t:=Low(AControls) to High(AControls) do
  begin
    Case AControls[t] of
      tcbNormal : FButtonNormal := CreateButton(tmpPos,ButtonNormalClick,TeeCommanMsg_Normal,'TeeNormal',1);
      tcbRotate:  FButtonRotate := CreateButton(tmpPos,ButtonRotateClick,TeeCommanMsg_Rotate,'TeeRotate',1);
      tcbMove:    FButtonMove   := CreateButton(tmpPos,ButtonMoveClick,TeeCommanMsg_Move,'TeeMove',1);
      tcbZoom:    FButtonZoom   := CreateButton(tmpPos,ButtonZoomClick,TeeCommanMsg_Zoom,'TeeZoom',1);
      tcbDepth:   FButtonDepth  := CreateButton(tmpPos,ButtonDepthClick,TeeCommanMsg_Depth,'TeeDepth',1);
      tcbEdit:    FButtonEdit   := CreateButton(tmpPos,ButtonEditClick,TeeCommanMsg_Edit,'TeeEdit',0);
 tcbPrintPreview: FButtonPrint  := CreateButton(tmpPos,ButtonPrintClick,TeeCommanMsg_Print,'TeePrint',0);
      tcbCopy:    FButtonCopy   := CreateButton(tmpPos,ButtonCopyClick,TeeCommanMsg_Copy,'TeeCopy',0);
      tcbSave:    FButtonSave   := CreateButton(tmpPos,ButtonSaveClick,TeeCommanMsg_Save,'TeeSave',0);
      tcb3D:      begin
                    FButton3D:= CreateButton(tmpPos,Button3DClick,TeeCommanMsg_3D,'TeeView3D',2);
                    FButton3D.AllowAllUp:=True;
                  end;
    tcbSeparator: CreateBevel(tmpPos);
      tcbLabel:   FLabel        := CreateLabel(tmpPos,clNavy);
    end;

    if AControls[t]=tcbSeparator then Inc(tmpPos,4+2)
                                 else Inc(tmpPos,25+4);
  end;

  ShowHideControls(Assigned(Panel));
end;

Procedure TTeeCommander.RepositionControls;
var t      : Integer;
    tmpPos : Integer;
begin
  tmpPos:=0;
  for t:=0 to ControlCount-1 do
  begin
    if (Controls[t].Owner=Self) and Controls[t].Visible then
    begin
      Controls[t].Left:=tmpPos;
      if Controls[t] is TBevel then Inc(tmpPos,4+2)
                               else Inc(tmpPos,25+4);
    end;
  end;
end;

Procedure TTeeCommander.DoMouseDown(X,Y:Integer);

  Function ButtonNormalUp:Boolean;
  begin
    result:=(not Assigned(FButtonNormal)) or (not FButtonNormal.Down);
  end;

begin
  IPieSeries:=GetPieSeries(x,y);

  if Assigned(IPieSeries) or ButtonNormalUp then
  begin
    FDragging:=True;
    FOldX:=X;
    FOldY:=Y;

    if Assigned(IPieSeries) then FDraggingIndex:=IPieSeries.Clicked(X,Y)
                            else FDraggingIndex:=-1;

    if FPanel is TCustomTeePanel then
       TCustomTeePanel(FPanel).CancelMouse:=(FDraggingIndex<>-1) or ButtonNormalUp;
  end;
end;

Function TTeeCommander.DoPanelMouse:Boolean;

  Function IsButtonUp(AButton:TSpeedButton):Boolean;
  begin
    result:=((not Assigned(AButton)) or (not AButton.Down));
  end;

begin
  result:=IsButtonUp(FButtonRotate) and
          IsButtonUp(FButtonDepth) and
          IsButtonUp(FButtonMove) and
          IsButtonUp(FButtonZoom);
end;

Procedure TTeeCommander.DoMouseUp;
begin
  IPieSeries:=nil;
  FDragging:=False;
  FDraggingIndex:=-1;
end;

Function TTeeCommander.GetPieSeries(x,y:Integer):TPieSeries;
var t : Integer;
    tmp : TChartSeries;
    tmpPart : TChartClickedPart;
begin
  result:=nil;

  if EnablePieExploding and (FPanel is TCustomChart) then
  With TCustomChart(FPanel) do
  begin
    CalcClickedPart(TeePoint(x,y),tmpPart);

    if (tmpPart.Part=cpSeries) and (tmpPart.ASeries is TPieSeries) then
       result:=tmpPart.ASeries as TPieSeries
    else
    for t:=0 to SeriesCount-1 do
    begin
      tmp:=Series[t];

      if (tmp is TPieSeries) and tmp.Active then
      begin
        result:=tmp as TPieSeries;
        exit;
      end;
    end;
  end;
end;

Function TTeeCommander.IsButtonDown(AButton:TSpeedButton):Boolean;
begin
  result:=Assigned(AButton) and AButton.Down;
end;

Procedure TTeeCommander.DoMouseMove(X,Y:Integer);

   Procedure Set3D;
   begin
     FPanel.View3D:=True;
     if Assigned(FButton3D) then FButton3D.Down:=True;
   end;

   Procedure DoRotate;

      Function CorrectAngle(Const AAngle:Integer):Integer;
      begin
        result:=AAngle;
        if result>360 then result:=result-360 else
        if result<0 then result:=360+result;
      end;

    Var tmpX      : Integer;
        tmpY      : Integer;
    begin
      With FPanel,View3DOptions do
      begin
        Set3D;
        Orthogonal:=False;
        tmpX:=Round(90.0*(X-FOldX)/Width);
        tmpY:=Round(90.0*(FOldY-Y)/Height);

        if Canvas.SupportsFullRotation then
        begin
          Rotation:=CorrectAngle(Rotation+tmpX);
          Elevation:=CorrectAngle(Elevation+tmpY);
        end
        else
        begin
          if Assigned(IPieSeries) then
          begin
            Rotation:=360;
            if not Canvas.SupportsFullRotation then Perspective:=0;

            if tmpX<>0 then
               With IPieSeries do RotationAngle:=CorrectAngle(RotationAngle+tmpX);
          end
          else
           Rotation:=TRotateTool.RotationChange(FPanel.Canvas.SupportsFullRotation,Rotation,tmpX);

          Elevation:=TRotateTool.ElevationChange(FPanel.Canvas.SupportsFullRotation,Elevation,tmpY);
        end;

        FOldX:=X;
        FOldY:=Y;
      end;
    end;

    Procedure DoMove;
    begin
      Set3D;
      With FPanel.View3DOptions do
      begin
        HorizOffset:=HorizOffset+(X-FOldX);
        VertOffset:=VertOffset+(Y-FOldY);
      end;
      FOldX:=X;
      FOldY:=Y;
    end;

    Procedure DoZoom;
    var tmp  : Double;
        tmp2 : Double;
    begin
      Set3D;
      With FPanel,View3DOptions do
      begin
        tmp:=(10.0*(FOldY-Y)/TeeDistance(ChartWidth,ChartHeight));

        tmp2:=(10.0*tmp*Zoom/100.0);
        if tmp>0 then
           Zoom:=Zoom+Round(Math.Max(1,tmp2))
        else
        if tmp<0 then
           Zoom:=Math.Max(1,Zoom+Round(Math.Min(-1,tmp2)));
      end;

      FOldY:=Y;
    end;

    Function CalcDistPercent(APercent,AWidth,AHeight:Integer):Integer;
    begin
      result:=Round(1.0*APercent*TeeDistance(FOldX-X,FOldY-Y)/TeeDistance(AWidth,AHeight));
    end;

    Procedure DoDepth;
    var tmp : Integer;
    begin
      if FPanel is TCustomAxisPanel then
      With TCustomAxisPanel(FPanel) do
      begin
        Set3D;
        tmp:=CalcDistPercent(200,ChartWidth,ChartHeight);
        if (tmp>=1) then
           Chart3DPercent:=Math.Min(100,tmp);
      end;
    end;

    Procedure DoNormal;
    Var tmp : Integer;
    begin
      if FDraggingIndex<>-1 then
      begin
        if Assigned(IPieSeries) then
        With IPieSeries do
        begin
          tmp:=Math.Min(100,CalcDistPercent(100,CircleWidth,CircleHeight));
          ExplodedSlice[FDraggingIndex]:=tmp;
        end;
      end;
    end;

begin
  if FDragging then
  begin
    FDragging:=False;
    if (not Assigned(FButtonNormal)) or IsButtonDown(FButtonNormal) then  // 7.0
       DoNormal  { first do this !!! }
    else
    if FMouseButton=mbRight then DoMove
    else
    if IsButtonDown(FButtonRotate) then DoRotate else
    if IsButtonDown(FButtonMove)   then DoMove else
    if IsButtonDown(FButtonZoom)   then DoZoom else
    if IsButtonDown(FButtonDepth)  then DoDepth;
    if FLabelValues and (not FVertical) then ShowValues;
    FDragging:=True;
  end;
end;

Function TTeeCommander.CaptionPanel(Const ACaption:String):String;
begin
  result:=Format(ACaption,[TeePanelClass]);
end;

procedure TTeeCommander.SetLabelCaption(Const ACaption:String);
var tmp: String;
begin
  tmp:=ACaption;
  if Assigned(FOnSetLabel) then FOnSetLabel(Self,tmp); { 5.02 }

  if Assigned(FLabel) then
     if FLabelValues and (not FVertical) then
        FLabel.Caption:=tmp
     else
        FLabel.Visible:=False;
end;

procedure TTeeCommander.ButtonRotateClick(Sender: TObject);
begin
  SetLabelCaption(CaptionPanel(TeeCommanMsg_RotateLabel));
end;

procedure TTeeCommander.ButtonMoveClick(Sender: TObject);
begin
  SetLabelCaption(CaptionPanel(TeeCommanMsg_MoveLabel));
end;

procedure TTeeCommander.ButtonZoomClick(Sender: TObject);
begin
  SetLabelCaption(CaptionPanel(TeeCommanMsg_ZoomLabel));
end;

procedure TTeeCommander.ButtonDepthClick(Sender: TObject);
begin
  SetLabelCaption(CaptionPanel(TeeCommanMsg_DepthLabel));
end;

procedure TTeeCommander.ButtonEditClick(Sender: TObject);
begin
  {$IFNDEF TEEOCXNOEDITOR}
  if Assigned(FEditor) then FEditor.Execute
  else
  if Assigned(FPanel) and (FPanel is TCustomChart) then
     EditChart(nil,TCustomChart(FPanel));
  if Assigned(FOnEditedChart) then FOnEditedChart(Self,FPanel as TCustomChart);
  if Assigned(FButton3D) then FButton3D.Down:=FPanel.View3D;
  {$ENDIF}
end;

procedure TTeeCommander.ButtonPrintClick(Sender: TObject);
begin
  {$IFNDEF TEEOCXNOEDITOR}
  if Assigned(FPreviewer) then FPreviewer.Execute
  else
  if Assigned(FPanel) then ChartPreview(nil,FPanel);
  {$ENDIF}
end;

procedure TTeeCommander.Button3DClick(Sender: TObject);
begin
  if Assigned(FPanel) then
  begin
    {$IFDEF CLX}
    IChanging3D:=True;
    {$ENDIF}
    FPanel.View3D:={$IFDEF CLX}not {$ENDIF}FButton3D.Down;
    {$IFDEF CLX}
    IChanging3D:=False;
    {$ENDIF}
  end;
end;

procedure TTeeCommander.ButtonCopyClick(Sender: TObject);
begin
  if Assigned(FPanel) then FPanel.CopyToClipboardBitmap;
end;

procedure TTeeCommander.ButtonNormalClick(Sender: TObject);
begin
  if GetPieSeries(0,0)=nil then
     SetLabelCaption(CaptionPanel(TeeCommanMsg_NormalLabel))
  else
     SetLabelCaption(CaptionPanel(TeeCommanMsg_NormalPieLabel))
end;

Procedure TTeeCommander.ShowHideControls(Value:Boolean);
begin
  EnableControls(Value,[FButtonRotate,FButtonMove,FButtonZoom,FButtonNormal,
                        FButtonCopy,FButtonSave,FButtonPrint,FButton3D]);

  if Value then Value:=FPanel is TCustomAxisPanel;

  if Assigned(FButtonDepth) then FButtonDepth.Enabled:=Value;  { 5.01 }
  if Assigned(FButtonEdit) then FButtonEdit.Enabled:=Value;    { 5.01 }
  if Assigned(FButtonSave) then FButtonSave.Enabled:=Value;    { 5.01 }

  if Assigned(FButton3D) and Assigned(FPanel) then
     {$IFDEF CLX}
     if not IChanging3D then
     {$ENDIF}
        FButton3D.Down:=FPanel.View3D;
end;

procedure TTeeCommander.SetLabelValues(Value:Boolean);
begin
  if FLabelValues<>Value then
  begin
    FLabelValues:=Value;
    if Assigned(FLabel) then FLabel.Visible:=FLabelValues;
  end;
end;

Procedure TTeeCommander.ShowValues;
var tmp : String;
begin
  With FPanel.View3DOptions do
  if IsButtonDown(FButtonRotate) then
     tmp:=Format(TeeCommanMsg_Rotating,[Rotation,Elevation]) { 5.02 }
  else
  if IsButtonDown(FButtonMove) then
     tmp:=Format(TeeCommanMsg_Moving,[HorizOffset,VertOffset])
  else
  if IsButtonDown(FButtonZoom) then
     tmp:=Format(TeeCommanMsg_Zooming,[Zoom])
  else
  if IsButtonDown(FButtonDepth) then
  begin
    if FPanel is TCustomAxisPanel then
    With TCustomAxisPanel(FPanel) do
      tmp:=Format(TeeCommanMsg_Depthing,[Chart3DPercent])
  end
  else
  if IsButtonDown(FButtonNormal) and (FDraggingIndex<>-1) then
  begin
    if Assigned(IPieSeries) then
       tmp:=Format( TeeCommanMsg_PieExploding,
                    [FDraggingIndex,IPieSeries.ExplodedSlice[FDraggingIndex]])
    else
       tmp:='';
  end
  else
  if Assigned(FLabel) then tmp:='';

  SetLabelCaption(tmp);
  if Assigned(FLabel) and FLabel.Visible then FLabel.Update;
end;

procedure TTeeCommander.ButtonSaveClick(Sender: TObject);
begin
  {$IFNDEF TEEOCXNOEDITOR}
  if Assigned(FPanel) then
  if FPanel is TCustomChart then SaveChartDialog(FPanel as TCustomChart);
  {$ENDIF}
end;

{$IFNDEF TEEOCXNOEDITOR}
procedure TTeeCommander.SetEditor(const Value: TChartEditor);
begin
  {$IFDEF D5}
  if Assigned(FEditor) then
     FEditor.RemoveFreeNotification(Self);
  {$ENDIF}

  if FEditor<>Value then
  begin
    FEditor:=Value;
    if Assigned(FEditor) then
       FEditor.FreeNotification(Self);
  end;
end;

procedure TTeeCommander.SetPreviewer(const Value: TChartPreviewer);
begin
  {$IFDEF D5}
  if Assigned(FPreviewer) then
     FPreviewer.RemoveFreeNotification(Self);
  {$ENDIF}

  if FPreviewer<>Value then
  begin
    FPreviewer:=Value;
    if Assigned(FPreviewer) then
       FPreviewer.FreeNotification(Self);
  end;
end;

procedure TTeeCommander.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited;
  if (Operation=opRemove) then
  begin
    if Assigned(FEditor) and (AComponent=FEditor) then
       FEditor:=nil;
    if Assigned(FPreviewer) and (AComponent=FPreviewer) then
       FPreviewer:=nil;
  end;
end;
{$ENDIF}

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -