Question

If you work with php you can see the php have associative array (or array width string key) in programing lang. For example:

$server['hostname']  =  'localhost';
$server['database']  =  'test';
$server['username']  =  'root';
$server['password']  =  'password' ;    

// 2d array
$all['myserver']['hostname'] = 'localhost' ;

But can't find any default way to use associative array in delphi.

First I want find default way with out any output component or class . Second if really I cant find with internal way I force choose output classes only.

I use Delphi XE3 , many thanks for your help.

edit: I found one class here : http://www.delphipages.com/forum/showthread.php?t=26334 same as php , but any better way?

Was it helpful?

Solution 2

You can use tStrings and tStringList for this purpose, but 2d arrays are out of the scope of these components.

Usage;

var
  names  : TStrings;
begin
  ...
  names := TStringList.Create;
  ...
  ...
  names.values['ABC'] := 'VALUE of ABC' ;
  ...
  ...
end ;

OTHER TIPS

You can use TDictionary<string,string> from the Generics.Collections unit.

var
  Dict: TDictionary<string,string>;
  myValue: string;
....
Dict := TDictionary<string,string>.Create;
try
  Dict.Add('hostname', 'localhost');
  Dict.Add('database', 'test');
  //etc.
  myValue := Dict['hostname'];
finally
  Dict.Free;
end;

And so on and so on.

If you want a dictionary that contains a dictionary, you can do use TDictionary<string, TDictionary<string,string>>.

However, when you do that you'll need to take special care over the lifetime of the dictionary items that are contained in the outer dictionary. You can use TObjectDictionary<K,V> to help manage that for you. You'd create one of these objects like this:

TObjectDictionary<string, TDictionary<string,string>>.Create([doOwnsValues]);

This TObjectDictionary<k,V> operates the same was as a traditional TObjectList with OwnsObjects set to True.

I had solved the problem that simple way (example):

uses StrUtils;

...

const const_TypesChar : array [0..4] of String =
    (
      'I',
      'F',
      'D',
      'S',
      'B'
    );
const const_TypesStr : array [0..4] of String =
    (
      'Integer',
      'Float',
      'Datetime',
      'String',
      'Boolean'
    );

...

Value := const_TypesStr[ AnsiIndexStr('S', const_TypesChar) ];

// As an example, after execution of this code Value variable will have 'String' value.

//

Then in program we are using two arrays const_TypesChar and const_TypesStr as one associative array with AnsiIndexStr function.

The plus is that it's simple and that we don't need to change code in different places in program every time when we add elements to our arrays.

Look at ArrayS. You can use associative arrays which stores predefined type of data (integer, string, boolean, float), or any of them. For example, below I define an associative array of floats:

uses ArrayS;

var floats : IFltArray;

floats := CreateArray;
floats['first'] := 0.1;
floats['second'] := 0.2;
writeln( floats['second'] );

And so on.

Updated at 2020-03-15

Zipped source code

Ussage example in Russian

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top