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

📄 teeseriestexted.pas

📁 BCB第三方组件
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    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 + -