📄 teeorgseries.pas
字号:
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 + -