Changeset 296


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

Legend:

Unmodified
Added
Removed
  • trunk/Forms/UFormItem.lfm

    r295 r296  
    2828    Left = 220
    2929    Height = 32
    30     Top = 257
     30    Top = 260
    3131    Width = 94
    3232    Anchors = [akLeft]
  • trunk/Forms/UFormItem.pas

    r291 r296  
    8989  Fields: TItemFields;
    9090  I: Integer;
     91  J: Integer;
    9192  Control: TControl;
    9293begin
     
    99100    else if DataType = dtColor then TColorBox(Control).Selected := Item.GetValueColor(Index)
    100101    else if DataType = dtBoolean then TCheckBox(Control).Checked := Item.GetValueBoolean(Index)
    101     else raise Exception.Create('Unsupported type ' + IntToStr(Integer(DataType)));
     102    else if DataType = dtEnumeration then begin
     103      TComboBox(Control).Items.BeginUpdate;
     104      try
     105        TComboBox(Control).Items.Clear;
     106        for J := 0 to EnumStates.Count - 1 do
     107          TComboBox(Control).Items.Add(EnumStates[J]);
     108        TComboBox(Control).ItemIndex := Integer(Item.GetValueEnumeration(Index));
     109      finally
     110        TComboBox(Control).Items.EndUpdate;
     111      end;
     112    end
     113    else raise Exception.Create(Format(SUnsupportedDataType, [DataTypeStr[DataType]]));
    102114  end;
    103115  Fields.Free;
     
    118130    else if DataType = dtColor then Item.SetValueColor(Index, TColorBox(Control).Selected)
    119131    else if DataType = dtBoolean then Item.SetValueBoolean(Index, TCheckBox(Control).Checked)
    120     else raise Exception.Create('Unsupported type ' + IntToStr(Integer(DataType)));
     132    else if DataType = dtEnumeration then Item.SetValueEnumeration(Index, TUndefinedEnum(TComboBox(Control).ItemIndex))
     133    else raise Exception.Create(Format(SUnsupportedDataType, [DataTypeStr[DataType]]));
    121134  end;
    122135  Fields.Free;
     
    145158      NewControl := TSpinEdit.Create(nil);
    146159      NewControl.Width := 100;
     160      TSpinEdit(NewControl).MaxValue := High(Integer);
    147161    end else
    148162    if DataType = dtString then begin
     
    154168      NewControl.Width := 200;
    155169    end else
     170    if DataType = dtEnumeration then begin
     171      NewControl := TComboBox.Create(nil);
     172      NewControl.Width := 200;
     173      TComboBox(NewControl).Style := csDropDownList;
     174    end else
    156175    if DataType = dtBoolean then begin
    157176      NewControl := TCheckBox.Create(nil);
    158     end else raise Exception.Create('Unsupported type ' + IntToStr(Integer(DataType)));
     177    end else
     178      raise Exception.Create(Format(SUnsupportedDataType, [DataTypeStr[DataType]]));
    159179    NewControl.Left := 150;
    160180    NewControl.Top := Y;
  • trunk/Languages/xtactics.cs.po

    r295 r296  
    962962msgstr "Budovy"
    963963
     964#: ubuilding.scity
     965msgid "City"
     966msgstr "Město"
     967
    964968#: ubuilding.scost
    965969msgctxt "ubuilding.scost"
    966970msgid "Cost"
    967971msgstr "Cena"
     972
     973#: ubuilding.snone
     974msgctxt "ubuilding.snone"
     975msgid "None"
     976msgstr "Žádný"
    968977
    969978#: ubuilding.sspecialtype
     
    12881297msgstr "Ne"
    12891298
     1299#: uitemlist.sunsupporteddatatype
     1300msgid "Unsupported field value data type %s"
     1301msgstr "Nepodporovaný datový typ hodnoty pole %s"
     1302
    12901303#: uitemlist.syes
    12911304msgid "Yes"
  • trunk/Languages/xtactics.po

    r295 r296  
    947947msgstr ""
    948948
     949#: ubuilding.scity
     950msgid "City"
     951msgstr ""
     952
    949953#: ubuilding.scost
    950954msgctxt "ubuilding.scost"
    951955msgid "Cost"
     956msgstr ""
     957
     958#: ubuilding.snone
     959msgctxt "ubuilding.snone"
     960msgid "None"
    952961msgstr ""
    953962
     
    12651274msgstr ""
    12661275
     1276#: uitemlist.sunsupporteddatatype
     1277msgid "Unsupported field value data type %s"
     1278msgstr ""
     1279
    12671280#: uitemlist.syes
    12681281msgid "Yes"
  • trunk/UBuilding.pas

    r294 r296  
    5252  SCost = 'Cost';
    5353  SSpecialType = 'Special type';
     54  SNone = 'None';
     55  SCity = 'City';
    5456
    5557
     
    8385
    8486class function TBuildingKind.GetFields: TItemFields;
     87var
     88  Field: TItemField;
    8589begin
    8690  Result := inherited;
    8791  Result.AddField(2, 'Cost', SCost, dtInteger);
    88   Result.AddField(3, 'SpecialType', SSpecialType, dtInteger);
     92  Field := Result.AddField(3, 'SpecialType', SSpecialType, dtEnumeration);
     93  Field.EnumStates.Add(SNone);
     94  Field.EnumStates.Add(SCity);
    8995end;
    9096
     
    94100  else if Index = 2 then Integer(Value) := Cost
    95101  else if Index = 3 then TBuildingSpecialType(Value) := SpecialType
    96   else raise Exception.Create('Unsupported value index ' + IntToStr(Index));
     102  else inherited;
    97103end;
    98104
     
    102108  else if Index = 2 then Cost := Integer(Value)
    103109  else if Index = 3 then SpecialType := TBuildingSpecialType(Value)
    104   else raise Exception.Create('Unsupported value index ' + IntToStr(Index));
     110  else inherited;
    105111end;
    106112
  • 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);
  • trunk/UNation.pas

    r290 r296  
    66
    77uses
    8   Classes, SysUtils, DOM, UXMLUtils, Graphics, UItemList;
     8  Classes, SysUtils, Graphics, UItemList;
    99
    1010type
     
    4949  if Index = 1 then string(Value) := Name
    5050  else if Index = 2 then TColor(Value) := Color
    51   else raise Exception.Create('Unsupported value index ' + IntToStr(Index));
     51  else inherited;
    5252end;
    5353
     
    5656  if Index = 1 then Name := string(Value)
    5757  else if Index = 2 then Color := TColor(Value)
    58   else raise Exception.Create('Unsupported value index ' + IntToStr(Index));
     58  else inherited;
    5959end;
    6060
  • trunk/UUnit.pas

    r291 r296  
    115115  else if Index = 6 then Integer(Value) := PowerDefense
    116116  else if Index = 7 then Integer(Value) := ViewRange
    117   else raise Exception.Create('Unsupported value index ' + IntToStr(Index));
     117  else inherited;
    118118end;
    119119
     
    127127  else if Index = 6 then PowerDefense := Integer(Value)
    128128  else if Index = 7 then ViewRange := Integer(Value)
    129   else raise Exception.Create('Unsupported value index ' + IntToStr(Index));
     129  else inherited;
    130130end;
    131131
Note: See TracChangeset for help on using the changeset viewer.