📄 teeseriestexted.pas
字号:
DataSource.Close; { 5.02 }
DataSource.Open;
finally
Screen.Cursor:=crDefault;
end;
end;
procedure TSeriesTextEditor.RBFileClick(Sender: TObject);
begin
EFile.Enabled:=RBFile.Checked;
RBManual.Checked:=False;
if Sender<>RBManual then
RBWeb.Checked:=not RBFile.Checked;
EWeb.Enabled:=not EFile.Enabled;
BBrowse.Enabled:=EFile.Enabled;
EFileChange(Sender);
end;
procedure TSeriesTextEditor.SpeedButton1Click(Sender: TObject);
begin
if OpenDialog1.Execute then EFile.Text:=OpenDialog1.FileName;
end;
{ TSeriesTextSource }
Constructor TSeriesTextSource.Create(AOwner: TComponent);
begin
inherited;
FFields:=TSeriesTextFields.Create(Self,TSeriesTextField);
FSeparator:=TeeDefaultFieldSeparator;
FText:=TStringList.Create;
end;
Destructor TSeriesTextSource.Destroy;
begin
FText.Free;
FFields.Free;
inherited;
end;
function TSeriesTextSource.AddField(const AName: String;
AIndex: Integer):TSeriesTextField;
begin
result:=TSeriesTextField(FFields.Add);
with result do
begin
FieldName:=AName;
FieldIndex:=AIndex;
end;
end;
{$IFDEF AXUNICODE}
procedure TSeriesTextSource.LoadFromStream(AStream: TStream);
var tmp : TWideStringList;
isWide : Boolean;
begin
inherited;
isWide:=False;
AStream.Position:=0;
tmp:=TWideStringList.Create;
try
tmp.LoadFromStream(AStream);
LoadFromWideStrings(tmp);
finally
tmp.Free;
end;
end;
{$ELSE}
procedure TSeriesTextSource.LoadFromStream(AStream: TStream);
begin
inherited;
AStream.Position:=0;
Text.LoadFromStream(AStream);
LoadFromStrings(Text);
end;
{$ENDIF}
procedure TSeriesTextSource.SetFields(const Value: TSeriesTextFields);
begin
FFields.Assign(Value);
end;
procedure TSeriesTextSource.SetText(const Value: TStrings);
begin
FText.Assign(Value);
end;
{$IFDEF AXUNICODE}
procedure TSeriesTextSource.LoadFromWideStrings(AStrings: TWideStringList);
Var St,StLabel : String;
t,
tt, lastPart : Integer;
tmpLabel,
tmpText,tmpLabel2 : String;
tmpHasNot : Boolean;
tmpX : Double;
tmpValue : Double;
tmpValueList : TChartValueList; // 7.02
function getLabel(const inStr:WideString) : WideString;
var i: Integer;
tmpStr:WideString;
Begin
i:=0;
tmpStr:=inStr;
while Pos(FSeparator,tmpStr)<>0 do
Begin
i:=Pos(FSeparator,tmpStr);
tmpStr:=Copy(tmpStr,i+1,Length(tmpStr));
end;
result:=tmpStr;
end;
begin
if Assigned(Series) then
begin
{ by default, series has no X values }
tmpHasNot:=False;
{ prepare list of fields }
for tt:=0 to FFields.Count-1 do
With FFields[tt] do
begin
if Uppercase(FieldName)=Uppercase(TeeMsg_Text) then { text labels }
Data:=Series.Labels
else
begin
{ values }
if Uppercase(FieldName)=Uppercase(Series.NotMandatoryValueList.Name) then
begin
tmpHasNot:=True;
Data:=Series.NotMandatoryValueList;
end
else Data:=Series.GetYValueList(FieldName);
end;
end;
TeeFieldsSeparator:=FSeparator;
{ empty series }
Series.Clear;
{ loop all strings }
for t:=HeaderLines to AStrings.Count-1 do
begin
StLabel:=Unicoding.CodeUTF8String(getLabel(AStrings[t]));
St:=AStrings[t];
if St<>'' then
begin
{ clear temporary values }
for tt:=0 to Series.ValuesList.Count-1 do
Series.ValuesList[tt].TempValue:=0;
tmpLabel:='';
{ set temporary values from loaded text string }
for tt:=0 to FFields.Count-1 do
With FFields[tt] do
begin
tmpText:=TeeExtractField(St,FieldIndex);
if Data=Series.Labels then
tmpLabel:=StLabel //tmpText
else
begin
tmpValueList:=TChartValueList(Data);
if Assigned(FOnGetValue) then
FOnGetValue(FFields[tt],tmpText,tmpValue)
else
if tmpValueList.DateTime then tmpValue:=StrToDateTime(tmpText)
else tmpValue:=StrToFloat(tmpText);
tmpValueList.TempValue:=tmpValue;
end;
end;
{ add new point to series }
With Series do
begin
if not tmpHasNot then tmpX:=Count
else tmpX:=NotMandatoryValueList.TempValue;
AddXY(tmpX,MandatoryValueList.TempValue,tmpLabel);
end;
end;
end;
{ tell changes to other series }
Series.RefreshSeries;
end;
end;
{$ENDIF}
procedure TSeriesTextSource.LoadFromStrings(AStrings: TStrings);
Var St : String;
t,
tt : Integer;
tmpLabel,
tmpText : String;
tmpHasNot : Boolean;
tmpX : Double;
tmpValue : Double;
tmpValueList : TChartValueList; // 7.02
begin
if Assigned(Series) then
begin
{ by default, series has no X values }
tmpHasNot:=False;
{ prepare list of fields }
for tt:=0 to FFields.Count-1 do
With FFields[tt] do
begin
if Uppercase(FieldName)=Uppercase(TeeMsg_Text) then { text labels }
Data:=Series.Labels
else
begin
{ values }
if Uppercase(FieldName)=Uppercase(Series.NotMandatoryValueList.Name) then
begin
tmpHasNot:=True;
Data:=Series.NotMandatoryValueList;
end
else Data:=Series.GetYValueList(FieldName);
end;
end;
TeeFieldsSeparator:=FSeparator;
{ empty series }
if Self.LoadMode=lmClear then
Series.Clear;
{ loop all strings }
for t:=HeaderLines to AStrings.Count-1 do
begin
St:=AStrings[t];
if St<>'' then
begin
{ clear temporary values }
for tt:=0 to Series.ValuesList.Count-1 do
Series.ValuesList[tt].TempValue:=0;
tmpLabel:='';
{ set temporary values from loaded text string }
for tt:=0 to FFields.Count-1 do
With FFields[tt] do
begin
tmpText:=TeeExtractField(St,FieldIndex);
if Data=Series.Labels then tmpLabel:=tmpText
else
begin
tmpValueList:=TChartValueList(Data);
if Assigned(FOnGetValue) then
FOnGetValue(FFields[tt],tmpText,tmpValue)
else
if tmpValueList.DateTime then tmpValue:=StrToDateTime(tmpText)
else tmpValue:=StrToFloat(tmpText);
tmpValueList.TempValue:=tmpValue;
end;
end;
{ add new point to series }
With Series do
begin
if not tmpHasNot then tmpX:=Count
else tmpX:=NotMandatoryValueList.TempValue;
AddXY(tmpX,MandatoryValueList.TempValue,tmpLabel);
end;
end;
end;
{ tell changes to other series }
Series.RefreshSeries;
end;
end;
class function TSeriesTextSource.Description: String;
begin
result:=TeeMsg_TextFile;
end;
class function TSeriesTextSource.Editor: TComponentClass;
begin
result:=TSeriesTextEditor;
end;
{ TSeriesTextField }
procedure TSeriesTextField.SetFieldIndex(const Value: Integer);
begin
if Value>0 then FFieldIndex:=Value
else Raise Exception.Create(TeeMsg_SeriesTextFieldZero);
end;
{ TSeriesTextFields }
function TSeriesTextFields.Get(Index: Integer): TSeriesTextField;
begin
result:=TSeriesTextField(inherited Items[Index]);
end;
procedure TSeriesTextFields.Put(Index: Integer; const Value: TSeriesTextField);
begin
Items[Index].Assign(Value);
end;
procedure TSeriesTextEditor.FormCreate(Sender: TObject);
begin
inherited;
Align:=alClient;
BorderStyle:=TeeBorderStyle;
LLabel.Visible:=False;
CBSources.Visible:=False;
BBrowse.Flat:=True;
end;
procedure TSeriesTextEditor.BApplyClick(Sender: TObject);
begin
inherited;
CheckReplaceSource(DataSource);
SetOptions;
BApply.Enabled:=False;
DataSource.Open; { 5.02 }
end;
procedure TSeriesTextEditor.EFileChange(Sender: TObject);
begin
inherited;
if Pan.Visible then BApply.Enabled:=True;
end;
procedure TSeriesTextEditor.EWebChange(Sender: TObject);
begin
inherited;
EFileChange(Sender);
end;
procedure TSeriesTextEditor.CBSepChange(Sender: TObject);
begin
inherited;
EFileChange(Sender);
end;
procedure TSeriesTextEditor.Edit1Change(Sender: TObject);
begin
inherited;
EFileChange(Sender);
end;
procedure TSeriesTextEditor.StringGrid1SetEditText(Sender: TObject; ACol,
ARow: Integer; const Value: String);
begin
inherited;
EFileChange(Sender);
end;
procedure TSeriesTextEditor.FormDestroy(Sender: TObject);
begin { free the temporary datasource }
if Assigned(DataSource) and InternalSource and
(not (csDesigning in DataSource.ComponentState)) and
(not Assigned(DataSource.Series)) then
DataSource.Free;
inherited;
end;
procedure TSeriesTextEditor.MemoTextChange(Sender: TObject);
begin
BApply.Enabled:=True;
end;
procedure TSeriesTextEditor.RBManualClick(Sender: TObject);
begin
RBFile.Checked:=False;
RBWeb.Checked:=False;
RBFileClick(Sender);
end;
initialization
RegisterClass(TSeriesTextSource);
{$IFNDEF TEEOCX}
TeeSources.Add({$IFDEF CLR}TObject{$ENDIF}(TSeriesTextSource));
{$ENDIF}
finalization
{$IFNDEF TEEOCX}
TeeSources.Remove({$IFDEF CLR}TObject{$ENDIF}(TSeriesTextSource));
{$ENDIF}
UnRegisterClass(TSeriesTextSource);
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -