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

📄 teeorgseries.pas

📁 BCB第三方组件
💻 PAS
📖 第 1 页 / 共 2 页
字号:
              ParentChart.Canvas.DoVertLine(XPos,tmpY,YPos+maxH+(Spacing.Vertical div 2));
            end;

            DrawChilds(tmpRoots,XPos,YPos+maxH+Spacing.Vertical);
          end;
        finally
          tmpRoots.Free;
        end;
      end;
    end;

  var tmpRoots : TList;
  begin
    tmpRoots:=TList.Create;
    try
      GetChilds(tmpRoots,Parent,True);
      DrawChilds(tmpRoots, XPos, YPos);
    finally
      tmpRoots.Free;
    end;
  end;

  procedure AutoSizeNodes;
  var t : Integer;
      tmp : TTextShape;
  begin
    for t:=0 to Min(FNodes.Count,Count)-1 do
    begin
      tmp:=FNodes[t].FFormat;
      tmp.Text:=XLabel[t];

      if tmp.AutoSize then
         {$IFNDEF CLR}TFormatAccess{$ENDIF}(tmp).CalcBounds(ParentChart);
    end;
  end;

begin
  with IBounds do
  begin
    Top:=MaxLongint;
    Left:=MaxLongint;
    Right:=-MaxLongint;
    Bottom:=-MaxLongint;
  end;

  AutoSizeNodes;
  DrawNodes(-1, ParentChart.ChartXCenter, ParentChart.ChartRect.Top);
end;

Function TOrgSeries.Clicked(x,y:Integer):Integer;
var t : Integer;
begin
  result:=TeeNoPointClicked;

  for t:=0 to Min(FNodes.Count,Count)-1 do
  if PointInRect(FNodes[t].FFormat.ShapeBounds,x,y) then
  begin
    result:=t;
    break;
  end;
end;

function TOrgSeries.UseAxis: Boolean;
begin
  result:=False;
end;

function TOrgSeries.IsValidSourceOf(Value: TChartSeries): Boolean;
begin
  result:=Value is TOrgSeries;
end;

procedure TOrgSeries.AddSampleValues(NumValues: Integer;
  OnlyMandatory: Boolean);

const
  MaxNames=8;

  Names:Array[0..MaxNames] of String=
    ('John','Anne','Mary','Paul','Bob','Mike','Lisa','Brad','Peter');

  SurNames:Array[0..MaxNames] of String=
    ('Smith','Shane','Wizard','Smart','Best','Patson','Hood','Dale','Scarlet');

  function RandomName:String;
  begin
    result:=Names[Random(MaxNames+1)]+' '+SurNames[Random(MaxNames+1)]+TeeLineSeparator;
  end;

var tmp,
    tmp1 : Integer;
begin
  tmp:=Add(RandomName+'President');
         Add(RandomName+'Sales Director',tmp);
   tmp1:=Add(RandomName+'Product Manager'#13'USA',tmp);
          Add(RandomName+'Asian Sales',tmp1);
   tmp1:=Add(RandomName+'Human Relations',tmp);
          Add(RandomName+'Assistant',tmp1);
end;

procedure TOrgSeries.SetSpacing(const Value: TSpacing);
begin
  FSpacing.Assign(Value);
end;

procedure TOrgSeries.ClearLists;
begin
  inherited;

  if not (csLoading in ComponentState) then
     if Assigned(FNodes) then
        FNodes.Clear;
end;

procedure TOrgSeries.SwapValueIndex(a,b:Integer);
var tmp : TCollectionItem;
begin
  inherited;
  tmp:=FNodes.Items[b];
  FNodes.Items[a].Index:=b;
  tmp.Index:=a;
end;

procedure TOrgSeries.Loaded;
var tmp : TOrgItem;
begin
  inherited;

  while FNodes.Count<Count do
  begin
    tmp:=TOrgItem(FNodes.Add);
    tmp.FFormat.Assign(FDefault);
    tmp.FFormat.Text:=XLabel[FNodes.Count-1];
  end;
end;

function TOrgSeries.FirstChild(ValueIndex:Integer):Integer;
begin
  for result:=0 to Count-1 do
  if MandatoryValueList.Value[result]=ValueIndex then
     Exit;

  result:=-1;
end;

procedure TOrgSeries.Delete(ValueIndex:Integer);
var tmp : Integer;
begin
  // Cascade deleting of child nodes, recursive
  repeat
    tmp:=FirstChild(ValueIndex);
    if tmp<>-1 then
       Delete(tmp);
  until tmp=-1;

  inherited;

  if FNodes.Count>ValueIndex then
     FNodes[ValueIndex].Free;

  with MandatoryValueList do
  for tmp:=0 to Count-1 do
  if Value[tmp]>ValueIndex then
     Value[tmp]:=Value[tmp]-1;
end;

class function TOrgSeries.GetEditorClass: String;
begin
  result:='TOrgSeriesEditor';
end;

procedure TOrgSeries.SetNodes(const Value: TOrgItemCollection);
begin
  FNodes.Assign(Value);
end;

function TOrgSeries.GetItem(Index: Integer): TOrgItem;
begin
  result:=FNodes.Items[Index];
end;

procedure TOrgSeries.SetDefault(const Value: TOrgShape);
begin
  FDefault.Assign(Value);
end;

procedure TOrgSeries.SetItem(Index: Integer; const Value: TOrgItem);
begin
  FNodes.Items[Index]:=Value;
end;

procedure TOrgSeries.SetParentChart(const Value: TCustomAxisPanel);
var t : Integer;
begin
  inherited;

  if Assigned(FNodes) then
  for t:=0 to Items.Count-1 do
      Items[t].FFormat.ParentChart:=Value;
end;

function TOrgSeries.CalcXPos(ValueIndex: Integer): Integer;
begin
  with FNodes[ValueIndex].FFormat.ShapeBounds do
       result:=(Left+Right) div 2;
end;

function TOrgSeries.CalcYPos(ValueIndex: Integer): Integer;
begin
  result:=FNodes[ValueIndex].FFormat.ShapeBounds.Bottom;
end;

procedure TOrgSeries.SetLineStyle(const Value: TOrgLineStyle);
begin
  if FLineStyle<>Value then
  begin
    FLineStyle:=Value;
    Repaint;
  end;
end;

{ TSpacing }
Constructor TSpacing.Create;
begin
  inherited;
  FHoriz:=8;
  FVert:=16;
end;

procedure TSpacing.Assign(Source: TPersistent);
begin
  if Source is TSpacing then
  with TSpacing(Source) do
  begin
    Self.FHoriz:=FHoriz;
    Self.FVert:=FVert;
  end
  else
    inherited;
end;

procedure TSpacing.SetHoriz(const Value: Integer);
begin
  if FHoriz<>Value then
  begin
    FHoriz:=Value;
    ISeries.Repaint;
  end;
end;

procedure TSpacing.SetVert(const Value: Integer);
begin
  if FVert<>Value then
  begin
    FVert:=Value;
    ISeries.Repaint;
  end;
end;

{ TOrgItem }
Constructor TOrgItem.Create(Collection: TCollection);
begin
  inherited;
  FFormat:=TOrgShape.Create(nil);
  FFormat.TextAlignment:=taCenter;
  FFormat.ParentChart:=Series.ParentChart;
end;

Destructor TOrgItem.Destroy;
begin
  FreeAndNil(FFormat);
  inherited;
end;

procedure TOrgItem.Assign(Source: TPersistent);
begin
  if Source is TOrgItem then
     Format:=TOrgItem(Source).Format
  else
     inherited;
end;

{$IFNDEF CLR}
type
  TOwnedCollectionAccess=class(TOwnedCollection);
{$ENDIF}

function TOrgItem.Series:TOrgSeries;
begin
  {$IFDEF CLR}
  result:=TOrgSeries(Collection.Owner);
  {$ELSE}
  result:=TOrgSeries(TOwnedCollectionAccess(Collection).GetOwner);
  {$ENDIF}
end;

procedure TOrgItem.SetFormat(const Value: TOrgShape);
begin
  FFormat.Assign(Value);
end;

function TOrgItem.GetText: String;
begin
  result:=Series.XLabel[Index];
end;

procedure TOrgItem.SetText(const Value: String);
begin
  Series.XLabel[Index]:=Value;
end;

function TOrgItem.AddChild(const Text: String): TOrgItem;
begin
  result:=Series[Series.Add(Text,Index)];
end;

function TOrgItem.AddBrother(const Text: String): TOrgItem;
begin
  result:=Series[Series.Add(Text,Superior)];
end;

function TOrgItem.GetSuperior: Integer;
begin
  result:=Round(Series.MandatoryValueList[Index]);
end;

procedure TOrgItem.SetSuperior(const Value: Integer);
begin
  Series.MandatoryValueList[Index]:=Value;
end;

{ TOrgItemCollection }
function TOrgItemCollection.Get(Index: Integer): TOrgItem;
begin
  result:=TOrgItem(inherited Items[Index]);
end;

procedure TOrgItemCollection.Put(Index: Integer; const Value: TOrgItem);
begin
  inherited Items[Index]:=Value;
end;

procedure TOrgSeriesEditor.FormCreate(Sender: TObject);
begin
  NodeEditor:=InsertTeeObjectForm(PageControl1,nil);

  MarginsForm:=TMarginsEditor.Create(Self);
  AddFormTo(MarginsForm,TabMargins);

  PageControl1.ActivePage:=TabText;
end;

procedure TOrgSeriesEditor.ScrollBar1Change(Sender: TObject);
begin
  Series.Spacing.Horizontal:=ScrollBar1.Position;
end;

procedure TOrgSeriesEditor.ScrollBar2Change(Sender: TObject);
begin
  Series.Spacing.Vertical:=ScrollBar2.Position;
end;

procedure TOrgSeriesEditor.Memo1Change(Sender: TObject);
begin
  if not IChanging then
  begin
    CurrentItem.Format.Text:=Memo1.Lines.Text;
    Series.XLabel[CurrentIndex]:=Memo1.Lines.Text;
    Series.Repaint;
  end;
end;

procedure TOrgSeriesEditor.ComboFlat1Change(Sender: TObject);
begin
  case ComboFlat1.ItemIndex of
    0: CurrentItem.Format.TextAlignment:=taLeftJustify;
    1: CurrentItem.Format.TextAlignment:=taCenter;
  else
    CurrentItem.Format.TextAlignment:=taRightJustify;
  end;

  Series.Repaint;
end;

procedure TOrgSeriesEditor.CBCursorChange(Sender: TObject);
begin
  with CurrentItem.Format do
       Cursor:=TeeSetCursor(Cursor,CBCursor.CurrentItem);
end;

procedure TOrgSeriesEditor.PageControl1Change(Sender: TObject);
begin
  NodeEditor.PC1Change(PageControl1);
end;

procedure TOrgSeriesEditor.SpeedButton1Click(Sender: TObject);
begin
  with Series do
  if Count=0 then
     AddListNodes(Series,Add('#'+IntToStr(Count),-1))
  else
     AddListNodes(Series,Add('#'+IntToStr(Count),CurrentItem.Index));
end;

procedure TOrgSeriesEditor.LBNodesClick(Sender: TObject);
//var t : Integer;
begin
  { Highlight selected node:
  with Series do
  for t:=0 to Count-1 do
      Items[t].Format.Gradient.Visible:= t = CurrentIndex;
  }

  with CurrentItem.Format do
  begin
    IChanging:=True;
    try
      Memo1.Lines.Text:=Text;
      UDWidth.Position:=Width;
      UDHeight.Position:=Height;
    finally
      IChanging:=False;
    end;

    CBVisible.Checked:=Visible;
    CBAutoSize.Checked:=AutoSize;
    CBClip.Checked:=ClipText;

    case TextAlignment of
      taLeftJustify: ComboFlat1.ItemIndex:=0;
      taCenter: ComboFlat1.ItemIndex:=1;
    else
      ComboFlat1.ItemIndex:=2;
    end;

    NodeEditor.RefreshControls(CurrentItem.Format);
    MarginsForm.RefreshControls(Margins);

    TeeFillCursors(CBCursor,Cursor);
  end;

  SpeedButton1.Enabled:=True;
  SpeedButton2.Enabled:=True;

  if not PageControl1.Visible then
     PageControl1.Show;
end;

procedure TOrgSeriesEditor.Button1Click(Sender: TObject);
begin
  TeeEditStrings(Self,Memo1.Lines)
end;

procedure TOrgSeriesEditor.SpeedButton2Click(Sender: TObject);
var tmp : Integer;
begin
  tmp:=CurrentIndex;
  Series.Delete(tmp);
  AddListNodes(Series,tmp-1);

  SpeedButton2.Enabled:=Series.Count>0;
end;

function TOrgSeriesEditor.CurrentIndex:Integer;
begin
  result:=Integer(LBNodes.Items.Objects[LBNodes.ItemIndex]);
end;

function TOrgSeriesEditor.CurrentItem:TOrgItem;
begin
  result:=Series.Items[CurrentIndex];
end;

procedure TOrgSeriesEditor.RefreshNode(Index:Integer);
begin
  LBNodes.ItemIndex:=LBNodes.Items.IndexOfObject(TObject(Index));
  LBNodesClick(Self);
end;

procedure TOrgSeriesEditor.SetupEditor(ASeries:TOrgSeries);
begin
  Series:=ASeries;

  ScrollBar1.Position:=Series.Spacing.Horizontal;
  ScrollBar2.Position:=Series.Spacing.Vertical;
  ButtonPen1.LinkPen(Series.Pen);
  CBLineStyle.ItemIndex:=Ord(Series.LineStyle);

  AddListNodes(Series,0);
end;

procedure TOrgSeriesEditor.AddListNodes(Series:TOrgSeries; Current:Integer);

  procedure AddNodes(const Prefix:String; Parent:Integer);

    function FirstLine(const s:String):String;
    var i : Integer;
    begin
      i:=Pos(TeeLineSeparator,s);
      if i=0 then
         result:=s
      else
         result:=Copy(s,1,i-1);
    end;

  var t : Integer;
  begin
    with Series do
    for t:=0 to Count-1 do
    if MandatoryValueList.Value[t]=Parent then
    begin
      LBNodes.Items.AddObject(Prefix+FirstLine(XLabel[t]),TObject(t));
      AddNodes(Prefix+' ',t);
    end;
  end;

begin
  LBNodes.Clear;
  AddNodes('',-1);

  if (Current<>-1) and (Series.Count>Current) then
     RefreshNode(Current)
  else
     PageControl1.Hide;
end;

procedure TOrgSeriesEditor.FormShow(Sender: TObject);
begin
  Series:=TOrgSeries(Tag);
  SetupEditor(Series);
end;

procedure TOrgSeriesEditor.ECustWidthChange(Sender: TObject);
begin
  if (not IChanging) and (CurrentItem.Format.Width<>UDWidth.Position) then
  begin
    CurrentItem.Format.Width:=UDWidth.Position;
    CBAutoSize.Checked:=False;
    Series.Repaint;
  end;
end;

procedure TOrgSeriesEditor.ECustHeightChange(Sender: TObject);
begin
  if (not IChanging) and (CurrentItem.Format.Height<>UDHeight.Position) then
  begin
    CurrentItem.Format.Height:=UDHeight.Position;
    CBAutoSize.Checked:=False;
    Series.Repaint;
  end;
end;

procedure TOrgSeriesEditor.CBAutoSizeClick(Sender: TObject);
begin
  if not IChanging then
  begin
    CurrentItem.Format.AutoSize:=CBAutoSize.Checked;

    
    Series.Repaint;
  end;
end;

procedure TOrgSeriesEditor.CBClipClick(Sender: TObject);
begin
  CurrentItem.Format.ClipText:=CBClip.Checked;
end;

procedure TOrgSeriesEditor.CBVisibleClick(Sender: TObject);
begin
  CurrentItem.Format.Visible:=CBVisible.Checked;
  Series.Repaint;
end;

procedure TOrgSeriesEditor.CBLineStyleChange(Sender: TObject);
begin
  Series.LineStyle:=TOrgLineStyle(CBLineStyle.ItemIndex);
end;

procedure TOrgSeriesEditor.PageControl2Change(Sender: TObject);
begin
  if Series.Count<>LBNodes.Items.Count then
     AddListNodes(Series,0);
end;

initialization
  RegisterClass(TOrgSeriesEditor);
  RegisterTeeSeries( TOrgSeries, {$IFNDEF CLR}@{$ENDIF}TeeMsg_GalleryOrgSeries,
                                 {$IFNDEF CLR}@{$ENDIF}TeeMsg_GalleryExtended, 1);
finalization
  UnRegisterTeeSeries([TOrgSeries]);
end.

⌨️ 快捷键说明

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