Changeset 7 for trunk


Ignore:
Timestamp:
Apr 13, 2026, 7:11:03 PM (2 weeks ago)
Author:
chronos
Message:
Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ean.pas

    r6 r7  
    1717    class function Create(Time: TDateTime; ValueIn, ValueOut: Single): TEanValue; static;
    1818    function GetShared: Double;
     19    procedure LoadFromXmlNode(Node: TDOMNode);
     20    procedure SaveToXmlNode(Node: TDOMNode);
    1921  end;
    2022
     
    2325  TEanValues = class(TList<TEanValue>)
    2426    function Comparer(constref Left, Right: TEanValue): Integer;
     27    procedure LoadFromXmlNode(Node: TDOMNode);
     28    procedure SaveToXmlNode(Node: TDOMNode);
    2529  end;
    2630
     
    5155  TEans = class(TObjectList<TEan>)
    5256    function SearchByNumber(Number: string): TEan;
     57    function SearchByOwner(Owner: string): TEan;
    5358    procedure LoadToStrings(Strings: TStrings; AllowNone: Boolean = False);
    5459    procedure LoadFromXmlNode(Node: TDOMNode);
     
    6469  EansName = 'Eans';
    6570  EanName = 'Ean';
     71  EanValueName = 'EanValue';
     72  EanValuesName = 'EanValues';
    6673
    6774
     
    94101end;
    95102
     103procedure TEanValue.LoadFromXmlNode(Node: TDOMNode);
     104begin
     105  Time := ReadDateTime(Node, 'Time', Time);
     106  ValueIn := ReadDouble(Node, 'ValueIn', ValueIn);
     107  ValueOut := ReadDouble(Node, 'ValueOut', ValueOut);
     108end;
     109
     110procedure TEanValue.SaveToXmlNode(Node: TDOMNode);
     111begin
     112  if Time <> 0 then WriteDateTime(Node, 'Time', Time);
     113  if ValueIn <> 0 then WriteDouble(Node, 'ValueIn', ValueIn);
     114  if ValueOut <> 0 then WriteDouble(Node, 'ValueOut', ValueOut);
     115end;
     116
    96117{ TEanValues }
    97118
     
    99120begin
    100121  Result := CompareDateTime(Left.Time, Right.Time);
     122end;
     123
     124procedure TEanValues.LoadFromXmlNode(Node: TDOMNode);
     125var
     126  Node2: TDOMNode;
     127  EanValue: TEanValue;
     128begin
     129  Node2 := Node.FirstChild;
     130  while Assigned(Node2) and (Node2.NodeName = EanValueName) do begin
     131    EanValue.LoadFromXmlNode(Node2);
     132    Add(EanValue);
     133    Node2 := Node2.NextSibling;
     134  end;
     135end;
     136
     137procedure TEanValues.SaveToXmlNode(Node: TDOMNode);
     138var
     139  Node2: TDOMNode;
     140  I: Integer;
     141begin
     142  for I := 0 to Count - 1 do begin
     143    Node2 := Node.OwnerDocument.CreateElement(EanValueName);
     144    Items[I].SaveToXmlNode(Node2);
     145    Node.AppendChild(Node2);
     146  end;
    101147end;
    102148
     
    133179
    134180procedure TEan.LoadFromXmlNode(Node: TDOMNode);
     181var
     182  NewNode: TDOMNode;
    135183begin
    136184  Number := ReadString(Node, 'Number', Number);
     
    140188  PriceHigh := ReadDouble(Node, 'PriceHigh', PriceHigh);
    141189  PriceSpot := ReadDouble(Node, 'PriceSpot', PriceSpot);
     190  Kind := TEanKind(ReadInteger(Node, 'Kind', Integer(Kind)));
     191
     192  NewNode := Node.FindNode(EanValuesName);
     193  if Assigned(NewNode) then
     194    Values.LoadFromXmlNode(NewNode);
    142195end;
    143196
    144197procedure TEan.SaveToXmlNode(Node: TDOMNode);
    145 begin
    146   WriteString(Node, 'Number', Number);
    147   WriteString(Node, 'Owner', Owner);
    148   WriteString(Node, 'DistributionTariff', DistributionTariff);
    149   WriteDouble(Node, 'PriceLow', PriceLow);
    150   WriteDouble(Node, 'PriceHigh', PriceHigh);
    151   WriteDouble(Node, 'PriceSpot', PriceSpot);
     198var
     199  NewNode: TDOMNode;
     200begin
     201  if Number <> '' then WriteString(Node, 'Number', Number);
     202  if Owner <> '' then WriteString(Node, 'Owner', Owner);
     203  if DistributionTariff <> '' then WriteString(Node, 'DistributionTariff', DistributionTariff);
     204  if PriceLow <> 0 then WriteDouble(Node, 'PriceLow', PriceLow);
     205  if PriceHigh <> 0 then WriteDouble(Node, 'PriceHigh', PriceHigh);
     206  if PriceSpot <> 0 then WriteDouble(Node, 'PriceSpot', PriceSpot);
     207  WriteInteger(Node, 'Kind', Integer(Kind));
     208
     209  if Values.Count > 0 then begin
     210    NewNode := Node.OwnerDocument.CreateElement(EanValuesName);
     211    Node.AppendChild(NewNode);
     212    Values.SaveToXmlNode(NewNode);
     213  end;
    152214end;
    153215
     
    171233  I := 0;
    172234  while (I < Count) and (Items[I].Number <> Number) do Inc(I);
     235  if I < Count then Result := Items[I]
     236    else Result := nil;
     237end;
     238
     239function TEans.SearchByOwner(Owner: string): TEan;
     240var
     241  I: Integer;
     242begin
     243  I := 0;
     244  while (I < Count) and (Items[I].Owner <> Owner) do Inc(I);
    173245  if I < Count then Result := Items[I]
    174246    else Result := nil;
  • trunk/EdcProject.pas

    r6 r7  
    55uses
    66  Classes, SysUtils, Generics.Collections, Generics.Defaults, XML, DateUtils,
    7   fphttpclient, opensslsockets, Ean, DOM, XMLRead, XMLWrite, Common, CsvDocument,
     7  Ean, DOM, XMLRead, XMLWrite, Common, CsvDocument,
    88  SpotPrice;
    99
     
    4848  I: Integer;
    4949begin
     50  for I := 0 to Eans.Count - 1 do
     51    Eans[I].Values.Clear;
     52
    5053  Reports := TStringList.Create;
    5154  try
     
    5962  for I := 0 to Eans.Count - 1 do
    6063    Eans[I].Values.Sort(TComparer<TEanValue>.Construct(Eans[I].Values.Comparer));
     64
    6165
    6266  CreateEan('', STotalSupply, ekSupply);
     
    102106    AppendChild(RootNode);
    103107
    104     NewNode := RootNode.OwnerDocument.CreateElement(EansName);
    105     RootNode.AppendChild(NewNode);
    106     Eans.SaveToXmlNode(NewNode);
    107 
    108     NewNode := RootNode.OwnerDocument.CreateElement(SpotPricesName);
    109     RootNode.AppendChild(NewNode);
    110     SpotPrices.SaveToXmlNode(NewNode);
     108    if Eans.Count > 0 then begin
     109      NewNode := RootNode.OwnerDocument.CreateElement(EansName);
     110      RootNode.AppendChild(NewNode);
     111      Eans.SaveToXmlNode(NewNode);
     112    end;
     113
     114    if SpotPrices.Count > 0 then begin
     115      NewNode := RootNode.OwnerDocument.CreateElement(SpotPricesName);
     116      RootNode.AppendChild(NewNode);
     117      SpotPrices.SaveToXmlNode(NewNode);
     118    end;
    111119
    112120    if ExtractFileDir(FileName) <> '' then
     
    136144  C: Integer;
    137145  CSVDoc: TCSVDocument;
     146  Date: TDateTime;
    138147  TimeFrom: TDateTime;
    139148  TimeTo: TDateTime;
     
    147156  try
    148157    CSVDoc.Delimiter := ';';
    149     //BufferedFileStream := TBufferedFileStream.Create(FileName, fmOpenRead);
    150     //CSVDoc.LoadFromStream(BufferedFileStream);
    151158    CSVDoc.LoadFromFile(FileName);
    152     //BufferedFileStream.Free;
    153159
    154160    for C := 0 to ((CSVDoc.ColCount[0] - 3) div 2) - 1 do begin
     
    172178      Ean.Kind := EanKind;
    173179
     180      Ean.Values.Capacity := Ean.Values.Count + CSVDoc.RowCount;
     181
    174182      for R := 1 to CSVDoc.RowCount - 1 do begin
    175         TimeFrom := StrToDate(CSVDoc.Cells[0, R]) + StrToTime(CSVDoc.Cells[1, R]);
    176         TimeTo := StrToDate(CSVDoc.Cells[0, R]) + StrToTime(CSVDoc.Cells[2, R]);
     183        Date := StrToDate(CSVDoc.Cells[0, R]);
     184        TimeFrom := Date + StrToTime(CSVDoc.Cells[1, R]);
     185        TimeTo := Date + StrToTime(CSVDoc.Cells[2, R]);
    177186
    178187        CellValueIn := 0;
     
    203212  Value: TEanValue;
    204213begin
    205   Ean := TEan.Create;
    206   Ean.Number := Number;
    207   Ean.Owner := Owner;
    208   Ean.Kind := Kind;
     214  Ean := Eans.SearchByOwner(Owner);
     215  if not Assigned(Ean) then begin
     216    Ean := TEan.Create;
     217    Ean.Number := Number;
     218    Ean.Owner := Owner;
     219    Ean.Kind := Kind;
     220    Eans.Add(Ean);
     221  end;
     222
     223  Ean.Values.Clear;
    209224
    210225  Values := TDictionary<TDateTime, TEanValue>.Create;
     
    223238
    224239  ValuesArray := Values.ToArray;
     240  Ean.Values.Capacity := Values.Count;
    225241  for I := 0 to Values.Count - 1 do begin
    226242    Ean.Values.Add(TEanValue.Create(ValuesArray[I].Key, ValuesArray[I].Value.ValueIn, ValuesArray[I].Value.ValueOut));
     
    229245
    230246  Values.Free;
    231 
    232   Eans.Add(Ean);
    233247end;
    234248
  • trunk/FormMain.lfm

    r6 r7  
    11object FormMain: TFormMain
    2   Left = 372
     2  Left = 367
    33  Height = 884
    4   Top = 366
     4  Top = 361
    55  Width = 1203
    66  Caption = 'EDC Stats'
     
    1111  LCLVersion = '4.6.0.0'
    1212  WindowState = wsMaximized
     13  OnClose = FormClose
    1314  OnCreate = FormCreate
    1415  OnDestroy = FormDestroy
     
    7273            Width = 135
    7374          end>
     75        PopupMenu = PopupMenuOverview
    7476        ReadOnly = True
    7577        RowSelect = True
     
    384386    Left = 216
    385387    Top = 376
    386     object MenuItem1: TMenuItem
     388    object MenuItemFile: TMenuItem
     389      Caption = 'File'
     390      object MenuItemLoad: TMenuItem
     391        Caption = 'Load'
     392        OnClick = MenuItemLoadClick
     393      end
     394      object MenuItemSave: TMenuItem
     395        Caption = 'Save'
     396        OnClick = MenuItemSaveClick
     397      end
     398    end
     399    object MenuItemTools: TMenuItem
    387400      Caption = 'Tools'
    388       object MenuItem2: TMenuItem
    389         Caption = 'Load reports'
    390         OnClick = MenuItem2Click
    391       end
    392       object MenuItem3: TMenuItem
    393         Caption = 'Load spot prices'
    394         OnClick = MenuItem3Click
    395       end
     401      object MenuItemImportReports: TMenuItem
     402        Caption = 'Import reports'
     403        OnClick = MenuItemImportReportsClick
     404      end
     405      object MenuItemImportSpotPrices: TMenuItem
     406        Caption = 'Import spot prices'
     407        OnClick = MenuItemImportSpotPricesClick
     408      end
     409    end
     410  end
     411  object PopupMenuOverview: TPopupMenu
     412    Left = 506
     413    Top = 274
     414    object MenuItemRemove: TMenuItem
     415      Caption = 'Remove'
     416      OnClick = MenuItemRemoveClick
    396417    end
    397418  end
  • trunk/FormMain.lrj

    r6 r7  
    2727{"hash":60,"name":"tformmain.buttonintervalleft.caption","sourcebytes":[60],"value":"<"},
    2828{"hash":6049914,"name":"tformmain.label5.caption","sourcebytes":[85,110,105,116,58],"value":"Unit:"},
    29 {"hash":5989939,"name":"tformmain.menuitem1.caption","sourcebytes":[84,111,111,108,115],"value":"Tools"},
    30 {"hash":234102723,"name":"tformmain.menuitem2.caption","sourcebytes":[76,111,97,100,32,114,101,112,111,114,116,115],"value":"Load reports"},
    31 {"hash":17275603,"name":"tformmain.menuitem3.caption","sourcebytes":[76,111,97,100,32,115,112,111,116,32,112,114,105,99,101,115],"value":"Load spot prices"}
     29{"hash":315429,"name":"tformmain.menuitemfile.caption","sourcebytes":[70,105,108,101],"value":"File"},
     30{"hash":341364,"name":"tformmain.menuitemload.caption","sourcebytes":[76,111,97,100],"value":"Load"},
     31{"hash":366789,"name":"tformmain.menuitemsave.caption","sourcebytes":[83,97,118,101],"value":"Save"},
     32{"hash":5989939,"name":"tformmain.menuitemtools.caption","sourcebytes":[84,111,111,108,115],"value":"Tools"},
     33{"hash":212990659,"name":"tformmain.menuitemimportreports.caption","sourcebytes":[73,109,112,111,114,116,32,114,101,112,111,114,116,115],"value":"Import reports"},
     34{"hash":67557683,"name":"tformmain.menuitemimportspotprices.caption","sourcebytes":[73,109,112,111,114,116,32,115,112,111,116,32,112,114,105,99,101,115],"value":"Import spot prices"},
     35{"hash":93079237,"name":"tformmain.menuitemremove.caption","sourcebytes":[82,101,109,111,118,101],"value":"Remove"}
    3236]}
  • trunk/FormMain.pas

    r6 r7  
    77  EditBtn, Menus, TAGraph, TASeries, Generics.Collections, Generics.Defaults,
    88  DateUtils, Ean, Translator, ApplicationInfo, RegistryEx, PersistentForm,
    9   Theme, Common, XML, DOM, XMLRead, EdcProject;
     9  Theme, Common, XML, EdcProject;
    1010
    1111type
     
    4545    MainMenu1: TMainMenu;
    4646    Memo1: TMemo;
    47     MenuItem1: TMenuItem;
    48     MenuItem2: TMenuItem;
    49     MenuItem3: TMenuItem;
     47    MenuItemRemove: TMenuItem;
     48    MenuItemLoad: TMenuItem;
     49    MenuItemSave: TMenuItem;
     50    MenuItemTools: TMenuItem;
     51    MenuItemImportReports: TMenuItem;
     52    MenuItemImportSpotPrices: TMenuItem;
     53    MenuItemFile: TMenuItem;
    5054    PageControl1: TPageControl;
    5155    PersistentForm1: TPersistentForm;
     56    PopupMenuOverview: TPopupMenu;
    5257    TabSheetOverview: TTabSheet;
    5358    TabSheetData: TTabSheet;
     
    6469    procedure ComboBoxUnitSelect(Sender: TObject);
    6570    procedure DateEdit1Change(Sender: TObject);
     71    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    6672    procedure FormCreate(Sender: TObject);
    6773    procedure FormDestroy(Sender: TObject);
    6874    procedure FormShow(Sender: TObject);
    69     procedure MenuItem2Click(Sender: TObject);
    70     procedure MenuItem3Click(Sender: TObject);
     75    procedure MenuItemImportReportsClick(Sender: TObject);
     76    procedure MenuItemImportSpotPricesClick(Sender: TObject);
     77    procedure MenuItemLoadClick(Sender: TObject);
     78    procedure MenuItemRemoveClick(Sender: TObject);
     79    procedure MenuItemSaveClick(Sender: TObject);
    7180    procedure TabSheetOverviewShow(Sender: TObject);
    7281    procedure TabSheetChartShow(Sender: TObject);
     
    8190    Period: TPeriod;
    8291    ReportsDir: string;
    83     OwnersFileName: string;
     92    ProjectFileName: string;
    8493    ShowResult: Boolean;
    8594    EdcProject: TEdcProject;
    86     procedure LoadReports;
    8795    function MeasureToFloat(Value: Double; Interval: Double): Double;
    8896    function MeasureToStr(Value: Double): string;
     
    110118{$R *.lfm}
    111119
    112 uses
    113   csvdocument, BufferedFileStream;
    114 
    115120resourcestring
    116121  SEAN = 'EAN';
     
    174179end;
    175180
     181procedure TFormMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
     182begin
     183end;
     184
    176185procedure TFormMain.FormCreate(Sender: TObject);
    177186begin
     
    189198procedure TFormMain.FormShow(Sender: TObject);
    190199begin
    191   LoadReports;
    192 end;
    193 
    194 procedure TFormMain.MenuItem2Click(Sender: TObject);
    195 begin
    196   LoadReports;
    197 end;
    198 
    199 procedure TFormMain.MenuItem3Click(Sender: TObject);
     200  MenuItemLoad.Click;
     201end;
     202
     203procedure TFormMain.MenuItemImportReportsClick(Sender: TObject);
     204begin
     205  EdcProject.Import(ReportsDir);
     206
     207  if (EdcProject.Eans.Count > 0) and (EdcProject.Eans[0].Values.Count > 0) then
     208    IntervalTo := EdcProject.Eans[0].Values.Last.Time + 15 * OneMinute;
     209  UpdateInterval;
     210  UpdateInterface;
     211end;
     212
     213procedure TFormMain.MenuItemImportSpotPricesClick(Sender: TObject);
    200214begin
    201215  EdcProject.SpotPrices.LoadSpotPrices(StrToDate('1.4.2026'));
     216end;
     217
     218procedure TFormMain.MenuItemLoadClick(Sender: TObject);
     219begin
     220  EdcProject.LoadFromFile(ProjectFileName);
     221
     222  if (EdcProject.Eans.Count > 0) and (EdcProject.Eans[0].Values.Count > 0) then
     223    IntervalTo := EdcProject.Eans[0].Values.Last.Time + 15 * OneMinute;
     224  UpdateInterval;
     225  UpdateInterface;
     226end;
     227
     228procedure TFormMain.MenuItemRemoveClick(Sender: TObject);
     229begin
     230  if Assigned(ListView1.Selected) then
     231    EdcProject.Eans.Remove(ListView1.Selected.Data);
     232  ReloadListViewOverview;
     233end;
     234
     235procedure TFormMain.MenuItemSaveClick(Sender: TObject);
     236begin
     237  EdcProject.SaveToFile(ProjectFileName);
    202238end;
    203239
     
    248284  ComboBoxPeriod.Items[Integer(prYear)] := SYear;
    249285  Ean.Translate;
    250 end;
    251 
    252 procedure TFormMain.LoadReports;
    253 begin
    254   EdcProject.LoadFromFile(OwnersFileName);
    255   EdcProject.Import(ReportsDir);
    256 
    257   if (EdcProject.Eans.Count > 0) and (EdcProject.Eans[0].Values.Count > 0) then
    258     IntervalTo := EdcProject.Eans[0].Values.Last.Time + 15 * OneMinute;
    259   UpdateInterval;
    260   UpdateInterface;
    261286end;
    262287
     
    314339      ListItem := ListView1.Items.Add;
    315340      ListItem.Caption := Number;
     341      ListItem.Data := EdcProject.Eans[I];
    316342      ListItem.SubItems.Add(Owner);
    317343      ListItem.SubItems.Add(MeasureToStr(GetTotalIn(IntervalFrom, IntervalTo)));
     
    470496    Period := TPeriod(ReadIntegerWithDefault('Period', Integer(Period)));
    471497    ReportsDir := ReadStringWithDefault('ReportsDir', ReportsDir);
    472     OwnersFileName := ReadStringWithDefault('OwnersFileName', OwnersFileName);
     498    ProjectFileName := ReadStringWithDefault('ProjectFileName', ProjectFileName);
    473499    PageControl1.TabIndex := ReadIntegerWithDefault('ActiveTab', PageControl1.TabIndex);
    474500    ShowResult := ReadBoolWithDefault('ShowResult', ShowResult);
     
    492518    WriteInteger('Period', Integer(Period));
    493519    WriteString('ReportsDir', ReportsDir);
    494     WriteString('OwnersFileName', OwnersFileName);
     520    WriteString('ProjectFileName', ProjectFileName);
    495521    WriteInteger('ActiveTab', PageControl1.TabIndex);
    496522    WriteBool('ShowResult', ShowResult);
  • trunk/Languages/EdcStats.cs.po

    r6 r7  
    180180msgstr "Sdíleno [%]"
    181181
    182 #: tformmain.menuitem1.caption
     182#: tformmain.menuitemfile.caption
     183msgid "File"
     184msgstr ""
     185
     186#: tformmain.menuitemimportreports.caption
     187msgid "Import reports"
     188msgstr ""
     189
     190#: tformmain.menuitemimportspotprices.caption
     191msgctxt "tformmain.menuitemimportspotprices.caption"
     192msgid "Import spot prices"
     193msgstr ""
     194
     195#: tformmain.menuitemload.caption
     196msgid "Load"
     197msgstr ""
     198
     199#: tformmain.menuitemremove.caption
     200msgid "Remove"
     201msgstr ""
     202
     203#: tformmain.menuitemsave.caption
     204msgid "Save"
     205msgstr ""
     206
     207#: tformmain.menuitemtools.caption
     208#, fuzzy
     209msgctxt "tformmain.menuitemtools.caption"
    183210msgid "Tools"
    184211msgstr "Nástroje"
    185 
    186 #: tformmain.menuitem2.caption
    187 msgid "Load reports"
    188 msgstr "Načíst reporty"
    189 
    190 #: tformmain.menuitem3.caption
    191 msgid "Load spot prices"
    192 msgstr "Načíst spotové ceny"
    193212
    194213#: tformmain.tabsheetchart.caption
     
    208227msgid "Overview"
    209228msgstr "Přehled"
     229
  • trunk/Languages/EdcStats.pot

    r6 r7  
    170170msgstr ""
    171171
    172 #: tformmain.menuitem1.caption
     172#: tformmain.menuitemfile.caption
     173msgid "File"
     174msgstr ""
     175
     176#: tformmain.menuitemimportreports.caption
     177msgid "Import reports"
     178msgstr ""
     179
     180#: tformmain.menuitemimportspotprices.caption
     181msgctxt "tformmain.menuitemimportspotprices.caption"
     182msgid "Import spot prices"
     183msgstr ""
     184
     185#: tformmain.menuitemload.caption
     186msgid "Load"
     187msgstr ""
     188
     189#: tformmain.menuitemremove.caption
     190msgid "Remove"
     191msgstr ""
     192
     193#: tformmain.menuitemsave.caption
     194msgid "Save"
     195msgstr ""
     196
     197#: tformmain.menuitemtools.caption
     198msgctxt "tformmain.menuitemtools.caption"
    173199msgid "Tools"
    174 msgstr ""
    175 
    176 #: tformmain.menuitem2.caption
    177 msgid "Load reports"
    178 msgstr ""
    179 
    180 #: tformmain.menuitem3.caption
    181 msgid "Load spot prices"
    182200msgstr ""
    183201
  • trunk/Packages/Common/XML.pas

    r6 r7  
    243243begin
    244244  NewNode := Node.OwnerDocument.CreateElement(DOMString(Name));
    245   NewNode.TextContent := DOMString(FloatToStr(Value));
     245  NewNode.TextContent := DOMString(FloatToStr(Value, XmlFormatSettings));
    246246  Node.AppendChild(NewNode);
    247247end;
  • trunk/SpotPrice.pas

    r6 r7  
    6565  Value: Double;
    6666begin
     67  Clear;
    6768  URL := 'https://spotovaelektrina.cz/denni-ceny/' + DateToStr(Date, XmlFormatSettings);
    6869  with TFPHttpClient.Create(nil) do
Note: See TracChangeset for help on using the changeset viewer.