📄 teexml.pas
字号:
if tmpX='' then {$IFDEF CLR}tmpValueX:=nil{$ELSE}VarClear(tmpValueX){$ENDIF} // 7.0
else tmpValueX:=tmpPointItem.GetNamedItem(tmpX);
// Add point !
if VarIsClear(tmpValue) then
if VarIsClear(tmpValueX) then
tmpSeries.AddNull(tmpTex)
else
tmpSeries.AddNullXY({$IFDEF CLR}Convert.ToDouble{$ENDIF}(tmpValueX.NodeValue),0,tmpTex)
else
if VarIsClear(tmpValueX) then
tmpSeries.Add({$IFDEF CLR}Convert.ToDouble{$ENDIF}(tmpValue.NodeValue),tmpTex,tmpCol)
else
tmpSeries.AddXY({$IFDEF CLR}Convert.ToDouble{$ENDIF}(tmpValueX.NodeValue),
{$IFDEF CLR}Convert.ToDouble{$ENDIF}(tmpValue.NodeValue),tmpTex,tmpCol)
end;
end;
end;
end
else XMLError('No <points> node.');
end;
Function TTeeXMLSource.CreateAndLoadXML:XmlDocument;
begin
{$IFDEF LINUX}
result:=0;
{$ELSE}
{$IFDEF CLR}
result:=System.Xml.XmlDocument.Create;
{$ELSE}
result:=CreateOleObject('MSXML.DomDocument');
result.Async:=False;
{$ENDIF}
if FXML.Count>0 then
result.LoadXML(FXML.Text)
else
if FileName<>'' then
begin
{$IFDEF CLR}
result.Load(FileName);
{$ELSE}
if not result.Load(FileName) then
XMLError('Cannot load '+FileName);
{$ENDIF}
end;
{$ENDIF}
end;
procedure TTeeXMLSource.Load;
var tmpSeries : XmlNodeList;
t : Integer;
tmp : String;
tmpTitle : XmlNode;
tmpFound : Boolean;
begin
if not (csDesigning in ComponentState) then
if Assigned(Series) or Assigned(Chart) then
if (FileName<>'') or (XML.Count>0) then
begin
CloseXML;
FXMLDocument:=CreateAndLoadXML;
tmpSeries:=FXMLDocument.getElementsByTagName('series');
if VarIsClear(tmpSeries) then
XMLError('No <series> nodes.')
else
begin
if not Assigned(Series) then
Chart.FreeAllSeries;
if SeriesNode='' then
begin
if tmpSeries.Length>0 then
for t:=0 to tmpSeries.Length-1 do
begin
LoadSeriesNode(tmpSeries{$IFNDEF CLR}.Item{$ENDIF}[t]);
if Assigned(Series) then
break;
end
else
XMLError('Empty <series> node.');
end
else
begin
tmpFound:=False;
for t:=0 to tmpSeries.Length-1 do
begin
tmpTitle:=tmpSeries{$IFNDEF CLR}.Item{$ENDIF}[t].Attributes.GetNamedItem('title');
if not VarIsClear(tmpTitle) then // 6.01
begin
tmp:=tmpTitle.NodeValue;
if UpperCase(tmp)=UpperCase(SeriesNode) then
begin
LoadSeriesNode(tmpSeries{$IFNDEF CLR}.Item{$ENDIF}[t]);
tmpFound:=True;
break;
end;
end;
end;
if not tmpFound then
XMLError('Series '+SeriesNode+' not found');
end;
end;
end;
end;
Procedure TTeeXMLSource.FillSeries(AItems:TStrings);
var t : Integer;
tmpSeries : XmlNodeList;
tmpXML : {$IFDEF CLR}System.Xml{$ELSE}TeeXML{$ENDIF}.XmlDocument;
tmpNode : XmlNode;
begin
tmpXML:=CreateAndLoadXML;
try
AItems.Clear;
tmpSeries:=tmpXML.getElementsByTagName('series');
if not VarIsClear(tmpSeries) then
for t:=0 to tmpSeries.Length-1 do
begin
tmpNode:=tmpSeries{$IFNDEF CLR}.Item{$ENDIF}[t].Attributes.GetNamedItem('title');
if not VarIsClear(tmpNode) then
AItems.Add(tmpNode.NodeValue);
end;
finally
tmpXML{$IFDEF CLR}.Free{$ELSE}:=UnAssigned{$ENDIF};
end;
end;
procedure TTeeXMLSource.SetSeriesNode(const Value: String);
begin
if FSeriesNode<>Value then
begin
Close;
FSeriesNode:=Value;
end;
end;
procedure TTeeXMLSource.SetValueSource(const Value: String);
begin
if FValueSource<>Value then
begin
Close;
FValueSource:=Value;
end;
end;
procedure TTeeXMLSource.SetChart(const Value: TCustomChart);
begin
if FChart<>Value then
begin
{$IFDEF D5}
if Assigned(FChart) then FChart.RemoveFreeNotification(Self);
{$ENDIF}
FChart:=Value;
if Assigned(FChart) then FChart.FreeNotification(Self);
end;
end;
procedure TTeeXMLSource.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited;
if (Operation=opRemove) and Assigned(FChart) and (AComponent=FChart) then
Chart:=nil;
end;
constructor TTeeXMLSource.Create(AOwner: TComponent);
begin
inherited;
FXML:=TStringList.Create;
end;
destructor TTeeXMLSource.Destroy;
begin
FXML.Free;
inherited;
end;
procedure TTeeXMLSource.SetXML(const Value: TStrings);
begin
FXML.Assign(Value);
end;
procedure TTeeXMLSource.SetActive(const Value: Boolean);
begin
if Value<>Active then
begin
inherited;
if Active and (not Assigned(Series)) and (FileName<>'') then
if not (csLoading in ComponentState) then Load;
end;
end;
{ TXMLSourceEditor }
procedure TXMLSourceEditor.SpeedButton1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
EFile.Text:=OpenDialog1.FileName;
end;
procedure TXMLSourceEditor.EFileChange(Sender: TObject);
begin
CBSeries.Clear;
BApply.Enabled:=True;
end;
procedure TXMLSourceEditor.CBSeriesDropDown(Sender: TObject);
begin
if CBSeries.Items.Count=0 then
FillXMLSeries;
end;
Procedure TXMLSourceEditor.FillXMLSeries;
begin
Screen.Cursor:=crHourGlass;
try
if EFile.Text<>'' then
with TTeeXMLSource.Create(nil) do
try
FileName:=EFile.Text;
FillSeries(CBSeries.Items);
finally
Free;
end
else
if DataSource.XML.Count>0 then
DataSource.FillSeries(CBSeries.Items);
finally
Screen.Cursor:=crDefault;
end;
end;
procedure TXMLSourceEditor.CBSeriesChange(Sender: TObject);
begin
BApply.Enabled:=True;
end;
procedure TXMLSourceEditor.BApplyClick(Sender: TObject);
begin
inherited;
CheckReplaceSource(DataSource);
DataSource.FileName:=EFile.Text;
with CBSeries do
if ItemIndex=-1 then DataSource.SeriesNode:=''
else DataSource.SeriesNode:=Items[ItemIndex];
DataSource.ValueSource:=ESource.Text;
BApply.Enabled:=False;
if CBLoadMode.ItemIndex=0 then
DataSource.LoadMode:=lmClear
else
DataSource.LoadMode:=lmAppend;
DataSource.Close;
if (DataSource.FileName<>'') or (DataSource.XML.Count>0) then
DataSource.Open; // 6.0
end;
procedure TXMLSourceEditor.FormShow(Sender: TObject);
begin
inherited;
LLabel.Visible:=False;
CBSources.Visible:=False;
if not Assigned(TheSeries) then exit;
if TheSeries.DataSource is TTeeXMLSource then
DataSource:=TTeeXMLSource(TheSeries.DataSource)
else
begin
DataSource:=TTeeXMLSource.Create(TheSeries.Owner);
DataSource.Name:=TeeGetUniqueName(DataSource.Owner,'TeeXMLSource');
end;
with DataSource do
begin
EFile.Text:=FileName;
FillXMLSeries;
if SeriesNode<>'' then
with CBSeries do ItemIndex:=Items.IndexOf(SeriesNode);
ESource.Text:=ValueSource;
CBActive.Checked:=Active;
if LoadMode=lmClear then
CBLoadMode.ItemIndex:=0
else
CBLoadMode.ItemIndex:=1;
end;
BApply.Enabled:=Assigned(TheSeries) and (DataSource<>TheSeries.DataSource);
end;
procedure TXMLSourceEditor.FormDestroy(Sender: TObject);
begin
if Assigned(DataSource) and
(not Assigned(DataSource.Series)) then DataSource.Free;
inherited;
end;
procedure TXMLSourceEditor.ESourceChange(Sender: TObject);
begin
BApply.Enabled:=True;
end;
procedure TXMLSourceEditor.CBActiveClick(Sender: TObject);
begin
DataSource.Active:=CBActive.Checked;
end;
procedure TXMLSourceEditor.FormCreate(Sender: TObject);
begin
inherited;
OpenDialog1.Filter:=TeeMsg_XMLFile+'|*.xml';
{$IFDEF D6}
SpeedButton1.HelpContext:=1865;
{$ENDIF}
end;
procedure TXMLSourceEditor.CBLoadModeChange(Sender: TObject);
begin
BApply.Enabled:=True;
end;
initialization
RegisterClass(TTeeXMLSource);
TeeSources.Add({$IFDEF CLR}TObject{$ENDIF}(TTeeXMLSource));
finalization
TeeSources.Remove({$IFDEF CLR}TObject{$ENDIF}(TTeeXMLSource));
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -