PDA

View Full Version : آرایه با اندیس رشته



30yavash
پنج شنبه 10 اردیبهشت 1388, 21:28 عصر
با سلام.
من می خام یه فایل xml رو بخونم.
فایل xml من یه چیزی توی این مایه هاست:


<?xml version="1.0" encoding="UTF-8" ?>
<database>
<settings>
<info lastupdate="6/2/1388" author="ali" title="Test" ... />
</settings>
<file>
...
</file>
</database>


مشکل من اینه که وقتی این فایل رو می خونم نمی دونم چه طور باید بخش setting رو توی ارایه بذارم.
چون نمی خام آرایم بر مبنای شماره باشه ، مثلا می خام به این صورت به فیلدها دسترسی داشته باشم:
Setting['author']:='ali';
Setting['title']:='Test';
و الی آخر

نکته:
مشکل من با خوندن xml نیست ، مشکلم با نوع خاصی از آرایست که گویا دلفی اون نوع رو ساپورت نمی کنه.(یا حداقل من نمی دونم.)

Delphi Coder
پنج شنبه 10 اردیبهشت 1388, 23:50 عصر
با یه کلاس کوچیک امکان پذیره:

unit PropertyContainer;

interface

uses
SysUtils, Classes;

type
TPropertyContainer = class(TObject)
private
{ Private declarations }
FPropertyList: TStringList;
FValueList: TStringList;
function GetPropertyValue(PropertyName: string): string;
procedure SetPropertyValue(PropertyName: string; const Value: string);
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create;
destructor Destroy; override;
procedure Add(PropertyName,Value: string);
property Item[PropertyName: string]: string read GetPropertyValue write SetPropertyValue; default;
end;

implementation

{ TPropertyContainer }

procedure TPropertyContainer.Add(PropertyName, Value: string);
begin
FPropertyList.Add(PropertyName);
FValueList.Add(Value);
end;

constructor TPropertyContainer.Create;
begin
FPropertyList := TStringList.Create;
FValueList := TStringList.Create;
end;

destructor TPropertyContainer.Destroy;
begin
FValueList.Free;
FPropertyList.Free;
inherited;
end;

function TPropertyContainer.GetPropertyValue(PropertyName: string): string;
begin
Result := FValueList.Strings[FPropertyList.indexOf(PropertyName)];
end;

procedure TPropertyContainer.SetPropertyValue(PropertyName: string;
const Value: string);
begin
if FPropertyList.IndexOf(PropertyName)=-1 then
begin
FPropertyList.Add(PropertyName);
FValueList.Add(Value);
end
else
FValueList.Strings[FPropertyList.indexOf(PropertyName)] := Value;
end;

end.برای تست می توانید اینجوری عمل کنید:
procedure TForm1.TestButtonClick(Sender: TObject);
var
PropertyContainer: TPropertyContainer;
begin
PropertyContainer := TPropertyContainer.Create;
PropertyContainer['name'] := 'ali';
PropertyContainer['family name'] := 'farjami';
Caption := PropertyContainer['name']+PropertyContainer['family name'];
PropertyContainer.Free;
end;

vcldeveloper
جمعه 11 اردیبهشت 1388, 09:19 صبح
لزومی به نوشتن اون کلاس نبود. کافی بود مقادیر را بصورت Name=Value در داخل یک TStringList ذخیره می کردید، آن وقت می توانستید از طریق خصوصیت Values مربوط به TStringList، به آنها دسترسی داشته باشید:


var
List : TStringList;
begin
List := TStringList.Create;
try
List.Add('author=ali');
//...
List.Values['author'] := 'Hassan';
ShowMessage(List.Values['author']);
finally
List.Free;
end;
end;