xml
L مي تواند دقيقا همچون يك Table براي شما عمل نمايد. در واقع شما مي توانيد با استفاده از XML اطلاعات خودتان را در قالب يك جدول ذخيره كنيد.
براي اين كار مي توانيد از كمپوننت ClientDataSet استفاده كنيد. (اين كمپوننت را مي توانيد در تب DataAccess بيابيد). در واقع اين كمپوننت يك In-Memory Table است. يعني اطلاعات خود را در حافظه نگهداري مي كند و به همين علت نيز فوق العاده سريع است.
نگاهي به كد زير بيانداريد و با Load كردن يك XML و درست كردن آن آشنا شويد:
ClientDataSet1.FileName := ExtractFilePath(
Application.ExeName) +
'test.xml';
if FileExists(ClientDataSet1.FileName) then
ClientDataSet1.Open
else
begin
//AddFieldDef version
with ClientDataSet1.FieldDefs do
begin
Clear;
with AddFieldDef do
begin
Name := 'ID';
DataType := ftAutoInc;
end; //with AddFieldDef do
with AddFieldDef do
begin
Name := 'First Name';
DataType := ftString;
Size := 20;
end; //with AddFieldDef do
with AddFieldDef do
begin
Name := 'Last Name';
DataType := ftString;
Size := 20;
end; //with AddFieldDef do
end; //with ClientDataSet1.FieldDefs
ClientDataSet1.CreateDataSet;
end; //else
همان طور كه در اين كد مشاهده مي كنيد در ابتدا سعي شده است كه فايل test.xml را كه در شاخه خود برنامه قرار دارد Load كنيم و در صورتي كه اين فايل پيدا نشد. آنگاه مي توان به سادگي (همان طور كه مي بينيد) اين فايل را از ابتدا تعريف كرد. فيلدهاي مورد نظر و مشخصات مورد نياز خود را وارد كنيم و همچنين در صورتي كه نياز بود با استفاده از IndexDefs يك يا چند Index جديد ساخت.
به چند نكته راجع به اين كد توجه كنيد:
1- با استفاده از متد FieldDefs.AddFieldDef مربوط به ClientDataSet مي توانيد يك فيلد جديد درست كنيد.
2- براي ساخت Index نيز مي توانيد از متد IndexDefs.AddIndexDef مربوط به ClientDataSet استفاده كرد.
2- هر فيلد مي توانيد شامل انواع زير باشد:
type TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd);
بنابراين شما به جاي ftString و يا ftAutoInc مي توانيد از هر كدام از اين ثابت ها استفاده كنيد.
همان طور كه مستحضريد به راحتي مي توانيد در XML حتي از BLOB هم استفاده كرده و در آن صدا يا تصوير ذخيره كنيد.
3- از متد CreateDataSet پس از ساخت فيلدهاي مورد نظرتون استفاده كنيد تا اين تغييرات تثبيت بشود.
4- يك ClientDataSet را مي توانيد به سادگي به يك كمپوننت DataSource وصل كنيد. پس از آن مي توانيد از هر كمپوننت Data-Aware مثل DBGrid براي Browse يا ويرايش اطلاعات استفاده كنيد.
5- با استفاده از Filter و Filtered مي توانيد به سادگي اطلاعات رو ----- كنيد و به علاوه به سادگي مي توانيد از Locate و FindKey و FindNearest براي جستجو در Tableتون استفاده كنيد.
6- در ClientDataSet هم مي توانيد از Lookupها و فيلدهاي محاسباتي استفاده كنيد. همچنين مي توانيد دو نوع فيلد ديگه به اسم InternalCalc و Aggregate رو هم استفاده كنيد. راهنماي مربوط به InternalCalc و Aggregate دلفي رو در اين جا آورده ام:
InternalCalc:
Retrieves values calculated at runtime by a client dataset and stored with its data (instead of being dynamically calculated in an OnCalcFields event handler). InternalCalc is only available if you are working with a client dataset. Values calculated for an InternalCalc field are stored and retrieved as part of the client dataset’s data.
Aggregate:
Retrieves a value summarizing the data in a set of records from a client dataset.