Changeset 285 for trunk/UItemList.pas


Ignore:
Timestamp:
Mar 10, 2019, 11:57:03 PM (6 years ago)
Author:
chronos
Message:
  • Modified: More work on item class with defined form fields.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UItemList.pas

    r284 r285  
    66
    77uses
    8   Classes, SysUtils, fgl, DOM, UXMLUtils, UCommon;
     8  Classes, SysUtils, fgl, DOM, UXMLUtils, UCommon, Graphics;
    99
    1010type
     11  TDataType = (dtNone, dtString, dtBoolean, dtInteger, dtFloat, dtColor,
     12    dtTime, dtDate, dtDateTime);
    1113
    1214  TItemField = class
     15    SysName: string;
    1316    Name: string;
    1417    Index: Integer;
     18    DataType: TDataType;
     19    Position: TPoint;
     20    Size: TPoint;
    1521  end;
    1622
     
    1824
    1925  TItemFields = class(TFPGObjectList<TItemField>)
    20     function AddField(Name: string): TItemField;
     26    function AddField(Index: Integer; SysName, Name: string; DataType: TDataType): TItemField;
    2127  end;
    2228
     
    2430
    2531  TItem = class
     32  private
     33    procedure AssignValue(Source: TItem; Field: TItemField);
     34    procedure LoadValueFromNode(Node: TDOMNode; Field: TItemField); virtual;
     35    procedure SaveValueToNode(Node: TDOMNode; Field: TItemField); virtual;
     36  public
    2637    Id: Integer;
    2738    Name: string;
     
    3243    procedure LoadFromNode(Node: TDOMNode); virtual;
    3344    procedure SaveToNode(Node: TDOMNode); virtual;
     45    class function GetClassSysName: string; virtual;
    3446  end;
    3547
     
    4052  TItemList = class(TFPGObjectList<TItem>)
    4153    NewId: Integer;
    42     function GetItemClass: TItemClass; virtual;
     54    class function GetItemClass: TItemClass; virtual;
    4355    function IncrementName(Name: string): string;
    4456    function GetNextAvailableName(Name: string): string;
     
    4860    procedure Assign(Source: TItemList); virtual;
    4961    function AddItem(Name: string): TItem; virtual;
     62    procedure LoadFromNode(Node: TDOMNode); virtual;
     63    procedure SaveToNode(Node: TDOMNode); virtual;
    5064    constructor Create(FreeObjects: Boolean = True);
    5165  end;
     
    7488end;
    7589
     90procedure TItemList.LoadFromNode(Node: TDOMNode);
     91var
     92  Node2: TDOMNode;
     93  NewItem: TItem;
     94begin
     95  Count := 0;
     96  Node2 := Node.FirstChild;
     97  while Assigned(Node2) and (Node2.NodeName = UnicodeString(GetItemClass.GetClassSysName)) do begin
     98    NewItem := GetItemClass.Create;
     99    NewItem.LoadFromNode(Node2);
     100    Add(NewItem);
     101    Node2 := Node2.NextSibling;
     102  end;
     103end;
     104
     105procedure TItemList.SaveToNode(Node: TDOMNode);
     106var
     107  I: Integer;
     108  NewNode2: TDOMNode;
     109begin
     110  for I := 0 to Count - 1 do
     111  with TItem(Items[I]) do begin
     112    NewNode2 := Node.OwnerDocument.CreateElement(UnicodeString(GetItemClass.GetClassSysName));
     113    Node.AppendChild(NewNode2);
     114    SaveToNode(NewNode2);
     115  end;
     116end;
     117
    76118constructor TItemList.Create(FreeObjects: Boolean);
    77119begin
     
    80122end;
    81123
    82 function TItemList.GetItemClass: TItemClass;
     124class function TItemList.GetItemClass: TItemClass;
    83125begin
    84126  Result := TItem;
     
    133175{ TItemFields }
    134176
    135 function TItemFields.AddField(Name: string): TItemField;
     177function TItemFields.AddField(Index: Integer; SysName, Name: string; DataType: TDataType): TItemField;
    136178begin
    137179  Result := TItemField.Create;
     180  Result.Index := Index;
    138181  Result.Name := Name;
     182  Result.SysName := SysName;
     183  Result.DataType := DataType;
    139184  Add(Result);
    140185end;
     
    142187{ TItem }
    143188
     189procedure TItem.AssignValue(Source: TItem; Field: TItemField);
     190var
     191  ValueString: string;
     192  ValueColor: TColor;
     193  ValueInteger: Integer;
     194begin
     195  if Field.DataType = dtString then begin
     196    Source.GetValue(Field.Index, ValueString);
     197    SetValue(Field.Index, ValueString);
     198  end else
     199  if Field.DataType = dtColor then begin
     200    Source.GetValue(Field.Index, ValueColor);
     201    SetValue(Field.Index, ValueColor);
     202  end else
     203  if Field.DataType = dtInteger then begin
     204    Source.GetValue(Field.Index, ValueInteger);
     205    SetValue(Field.Index, ValueInteger);
     206  end else
     207  raise Exception.Create('Unsupported field value data type');
     208end;
     209
     210procedure TItem.LoadValueFromNode(Node: TDOMNode; Field: TItemField);
     211var
     212  ValueString: string;
     213  ValueColor: TColor;
     214  ValueInteger: Integer;
     215begin
     216  if Field.DataType = dtString then begin
     217    ValueString := ReadString(Node, Field.SysName, '');
     218    SetValue(Field.Index, ValueString);
     219  end else
     220  if Field.DataType = dtColor then begin
     221    ValueColor := ReadInteger(Node, Field.SysName, 0);
     222    SetValue(Field.Index, ValueColor);
     223  end else
     224  if Field.DataType = dtInteger then begin
     225    ValueInteger := ReadInteger(Node, Field.SysName, 0);
     226    SetValue(Field.Index, ValueInteger);
     227  end else
     228  raise Exception.Create('Unsupported field value data type');
     229end;
     230
     231procedure TItem.SaveValueToNode(Node: TDOMNode; Field: TItemField);
     232var
     233  ValueString: string;
     234  ValueColor: TColor;
     235  ValueInteger: Integer;
     236begin
     237  if Field.DataType = dtString then begin
     238    GetValue(Field.Index, ValueString);
     239    WriteString(Node, Field.SysName, ValueString);
     240  end else
     241  if Field.DataType = dtColor then begin
     242    GetValue(Field.Index, ValueColor);
     243    WriteInteger(Node, Field.SysName, ValueColor);
     244  end else
     245  if Field.DataType = dtInteger then begin
     246    GetValue(Field.Index, ValueInteger);
     247    WriteInteger(Node, Field.SysName, ValueInteger);
     248  end else
     249  raise Exception.Create('Unsupported field value data type');
     250end;
     251
    144252function TItem.GetFields: TItemFields;
    145253begin
    146254  Result := TItemFields.Create;
     255  Result.AddField(1, 'Name', 'Name', dtString);
    147256end;
    148257
     
    156265
    157266procedure TItem.Assign(Source: TItem);
     267var
     268  I: Integer;
     269  Fields: TItemFields;
    158270begin
    159271  Id := Source.Id;
    160   Name := Source.Name;
     272  if Source is ClassType then begin
     273    Fields := GetFields;
     274    try
     275      for I := 0 to Fields.Count - 1 do
     276        AssignValue(Source, Fields[I]);
     277    finally
     278      Fields.Free;
     279    end;
     280  end;
    161281end;
    162282
    163283procedure TItem.LoadFromNode(Node: TDOMNode);
     284var
     285  Fields: TItemFields;
     286  I: Integer;
    164287begin
    165288  Id := ReadInteger(Node, 'Id', 0);
    166   Name := ReadString(Node, 'Name', '');
     289  Fields := GetFields;
     290  try
     291    for I := 0 to Fields.Count - 1 do begin
     292      LoadValueFromNode(Node, Fields[I]);
     293    end;
     294  finally
     295    Fields.Free;
     296  end;
    167297end;
    168298
    169299procedure TItem.SaveToNode(Node: TDOMNode);
     300var
     301  Fields: TItemFields;
     302  I: Integer;
    170303begin
    171304  WriteInteger(Node, 'Id', Id);
    172   WriteString(Node, 'Name', Name);
     305  Fields := GetFields;
     306  try
     307    for I := 0 to Fields.Count - 1 do begin
     308      SaveValueToNode(Node, Fields[I]);
     309    end;
     310  finally
     311    Fields.Free;
     312  end;
     313end;
     314
     315class function TItem.GetClassSysName: string;
     316begin
     317  Result := 'Item';
    173318end;
    174319
Note: See TracChangeset for help on using the changeset viewer.