Changeset 296 for trunk/UItemList.pas


Ignore:
Timestamp:
Mar 29, 2019, 12:58:09 PM (6 years ago)
Author:
chronos
Message:
  • Added: New enumeration field type in generic TItem classes.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UItemList.pas

    r294 r296  
    99
    1010type
     11  TUndefinedEnum = (eeNone);
     12
    1113  TDataType = (dtNone, dtString, dtBoolean, dtInteger, dtFloat, dtColor,
    1214    dtTime, dtDate, dtDateTime, dtEnumeration);
     
    2123    Position: TPoint;
    2224    Size: TPoint;
     25    EnumStates: TStringList;
     26    constructor Create;
     27    destructor Destroy; override;
    2328    procedure Assign(Source: TItemField);
    2429  end;
     
    4853    function GetValueColor(Index: Integer): TColor;
    4954    function GetValueBoolean(Index: Integer): Boolean;
     55    function GetValueEnumeration(Index: Integer): TUndefinedEnum;
    5056    function GetValueAsText(Index: Integer): string;
    5157    procedure SetValue(Index: Integer; var Value); virtual;
     
    5460    procedure SetValueColor(Index: Integer; Value: TColor);
    5561    procedure SetValueBoolean(Index: Integer; Value: Boolean);
     62    procedure SetValueEnumeration(Index: Integer; Value: TUndefinedEnum);
    5663    procedure Assign(Source: TItem); virtual;
    5764    procedure LoadFromNode(Node: TDOMNode); virtual;
     
    8087  end;
    8188
     89const
     90  DataTypeStr: array[TDataType] of string = ('None', 'String', 'Boolean',
     91    'Integer', 'Float', 'Color', 'Time', 'Date', 'DateTime', 'Enumeration');
     92
     93resourcestring
     94    SUnsupportedDataType = 'Unsupported field value data type %s';
     95
    8296
    8397implementation
     
    90104
    91105{ TItemField }
     106
     107constructor TItemField.Create;
     108begin
     109  EnumStates := TStringList.Create;
     110end;
     111
     112destructor TItemField.Destroy;
     113begin
     114  EnumStates.Free;
     115  inherited Destroy;
     116end;
    92117
    93118procedure TItemField.Assign(Source: TItemField);
     
    99124  Position := Source.Position;
    100125  Size := Source.Size;
     126  EnumStates.Assign(Source.EnumStates);
    101127end;
    102128
     
    231257
    232258procedure TItem.AssignValue(Source: TItem; Field: TItemField);
    233 var
    234   ValueString: string;
    235   ValueColor: TColor;
    236   ValueInteger: Integer;
    237   ValueBoolean: Boolean;
    238259begin
    239260  if Field.DataType = dtString then begin
    240     Source.GetValue(Field.Index, ValueString);
    241     SetValue(Field.Index, ValueString);
     261    SetValueString(Field.Index, Source.GetValueString(Field.Index));
    242262  end else
    243263  if Field.DataType = dtColor then begin
    244     Source.GetValue(Field.Index, ValueColor);
    245     SetValue(Field.Index, ValueColor);
     264    SetValueColor(Field.Index, Source.GetValueColor(Field.Index));
    246265  end else
    247266  if Field.DataType = dtInteger then begin
    248     Source.GetValue(Field.Index, ValueInteger);
    249     SetValue(Field.Index, ValueInteger);
     267    SetValueInteger(Field.Index, Source.GetValueInteger(Field.Index));
    250268  end else
    251269  if Field.DataType = dtBoolean then begin
    252     Source.GetValue(Field.Index, ValueBoolean);
    253     SetValue(Field.Index, ValueBoolean);
    254   end else
    255   raise Exception.Create('Unsupported field value data type');
     270    SetValueBoolean(Field.Index, Source.GetValueBoolean(Field.Index));
     271  end else
     272  if Field.DataType = dtEnumeration then begin
     273    SetValueEnumeration(Field.Index, Source.GetValueEnumeration(Field.Index));
     274  end else
     275    raise Exception.Create(Format(SUnsupportedDataType, [DataTypeStr[Field.DataType]]));
    256276end;
    257277
    258278procedure TItem.LoadValueFromNode(Node: TDOMNode; Field: TItemField);
    259 var
    260   ValueString: string;
    261   ValueColor: TColor;
    262   ValueInteger: Integer;
    263279begin
    264280  if Field.DataType = dtString then begin
    265     ValueString := ReadString(Node, Field.SysName, '');
    266     SetValue(Field.Index, ValueString);
     281    SetValueString(Field.Index, ReadString(Node, Field.SysName, ''));
    267282  end else
    268283  if Field.DataType = dtColor then begin
    269     ValueColor := ReadInteger(Node, Field.SysName, 0);
    270     SetValue(Field.Index, ValueColor);
     284    SetValueColor(Field.Index, ReadInteger(Node, Field.SysName, 0));
    271285  end else
    272286  if Field.DataType = dtInteger then begin
    273     ValueInteger := ReadInteger(Node, Field.SysName, 0);
    274     SetValue(Field.Index, ValueInteger);
    275   end else
    276   raise Exception.Create('Unsupported field value data type');
     287    SetValueInteger(Field.Index, ReadInteger(Node, Field.SysName, 0));
     288  end else
     289  if Field.DataType = dtBoolean then begin
     290    SetValueBoolean(Field.Index, ReadBoolean(Node, Field.SysName, False));
     291  end else
     292  if Field.DataType = dtEnumeration then begin
     293    SetValueEnumeration(Field.Index, TUndefinedEnum(ReadInteger(Node, Field.SysName, 0)));
     294  end else
     295    raise Exception.Create(Format(SUnsupportedDataType, [DataTypeStr[Field.DataType]]));
    277296end;
    278297
    279298procedure TItem.SaveValueToNode(Node: TDOMNode; Field: TItemField);
    280 var
    281   ValueString: string;
    282   ValueColor: TColor;
    283   ValueInteger: Integer;
    284299begin
    285300  if Field.DataType = dtString then begin
    286     GetValue(Field.Index, ValueString);
    287     WriteString(Node, Field.SysName, ValueString);
     301    WriteString(Node, Field.SysName, GetValueString(Field.Index));
    288302  end else
    289303  if Field.DataType = dtColor then begin
    290     GetValue(Field.Index, ValueColor);
    291     WriteInteger(Node, Field.SysName, ValueColor);
     304    WriteInteger(Node, Field.SysName, GetValueColor(Field.Index));
    292305  end else
    293306  if Field.DataType = dtInteger then begin
    294     GetValue(Field.Index, ValueInteger);
    295     WriteInteger(Node, Field.SysName, ValueInteger);
    296   end else
    297   raise Exception.Create('Unsupported field value data type');
     307    WriteInteger(Node, Field.SysName, GetValueInteger(Field.Index));
     308  end else
     309  if Field.DataType = dtBoolean then begin
     310    WriteBoolean(Node, Field.SysName, GetValueBoolean(Field.Index));
     311  end else
     312  if Field.DataType = dtEnumeration then begin
     313    WriteInteger(Node, Field.SysName, Integer(GetValueEnumeration(Field.Index)));
     314  end else
     315    raise Exception.Create(Format(SUnsupportedDataType, [DataTypeStr[Field.DataType]]));
    298316end;
    299317
     
    319337procedure TItem.GetValue(Index: Integer; out Value);
    320338begin
     339  raise Exception.Create('Unsupported value index ' + IntToStr(Index));
    321340end;
    322341
     
    341360end;
    342361
     362function TItem.GetValueEnumeration(Index: Integer): TUndefinedEnum;
     363begin
     364  GetValue(Index, Result);
     365end;
     366
    343367function TItem.GetValueAsText(Index: Integer): string;
    344368var
    345369  Fields: TItemFields;
    346   ItemField: TItemField;
     370  Field: TItemField;
    347371begin
    348372  Fields := GetFields;
    349   ItemField := GetField(Fields.IndexOf(Fields.SearchByIndex(Index)));
    350   if ItemField.DataType = dtInteger then Result := IntToStr(GetValueInteger(Index))
    351   else if ItemField.DataType = dtString then Result := GetValueString(Index)
    352   else if ItemField.DataType = dtColor then Result := ''
    353   else if ItemField.DataType = dtBoolean then begin
     373  Field := GetField(Fields.IndexOf(Fields.SearchByIndex(Index)));
     374  if Field.DataType = dtInteger then Result := IntToStr(GetValueInteger(Index))
     375  else if Field.DataType = dtString then Result := GetValueString(Index)
     376  else if Field.DataType = dtColor then Result := ''
     377  else if Field.DataType = dtEnumeration then Result := Field.EnumStates[Integer(GetValueEnumeration(Index))]
     378  else if Field.DataType = dtBoolean then begin
    354379    if GetValueBoolean(Index) then Result := SYes else Result := SNo;
    355   end;
    356   ItemField.Free;
     380  end else
     381    raise Exception.Create(Format(SUnsupportedDataType, [DataTypeStr[Field.DataType]]));
     382  Field.Free;
    357383  Fields.Free;
    358384end;
     
    360386procedure TItem.SetValue(Index: Integer; var Value);
    361387begin
     388  raise Exception.Create('Unsupported value index ' + IntToStr(Index));
    362389end;
    363390
     
    378405
    379406procedure TItem.SetValueBoolean(Index: Integer; Value: Boolean);
     407begin
     408  SetValue(Index, Value);
     409end;
     410
     411procedure TItem.SetValueEnumeration(Index: Integer;
     412  Value: TUndefinedEnum);
    380413begin
    381414  SetValue(Index, Value);
Note: See TracChangeset for help on using the changeset viewer.