PDA

View Full Version : مقاله : بررسی متدها، توابع و خصوصیتهای TStrings



Mahmood_M
یک شنبه 25 شهریور 1386, 03:13 صبح
به نام خدا ...

در این مقاله قصد داریم درباره کلاس TStrings بحث کنیم ...

مواردی که در این مثاله بررسی می شوند عبارتند از متدها و خصوصیات این کلاس ...

البته به علت زیادی متدها و خصوصیات ، به صورت موردی و کاربردی آنها را بررسی میکنیم ...

TStrings چیست ؟
TStrings کلاسی است برای نگهداری مجموعه ای از رشته ها همراه با Index و شماره مخصوص هر رشته که امکان ویرایش و دسترسی آسان آنها را فراهم میکند ،‌ علاوه بر این میتوان در یک TStrings ، یک Object وابسته به یک رشته را نیز ثبت کرد و از آن استفاده نمود ...

ثبت اطلاعات در یک TStrings :
برای ثبت اطلاعات در یک کلاس TStrings ابتدا باید آن را Create کرده و سپس از متدهایی مثل Add‌ ، AddObject و ... استفاده نماییم ...

Create کردن یک TStrings :
با استفاده از متد Create میتوانیم یک TStrings ایجاد نماییم :

var
Strings : TStrings;
begin
Strings := TStrings.Create;
end;

اگر نیاز داریم که تنها یک رشته را در یک TStrings ثبت نماییم ، میتوانیم از دستور Add استفاده نماییم :

var
Strings : TStrings;
S : String;
begin
S := 'String';
Strings := TStrings.Create;
Strings.Add(S);
end;
دستور Add در کد بالا مقدار متغیر S را در Strings که یک مقدار TStrings است ثبت می نماید ...

گاهی اوقات نیاز داریم که تعدادی Object ( مثل TabSheet های یک PageControl ) را در یک TStrings ثبت نماییم ، بدین منظور باید از دستور AddObject استفاده نماییم :
البته توجه کنید که یک متغیر از نوع TStrings نمی تواند یک Object را در خود نگاه دارد ( در زمان اجرا خطای AbStract نمایش داده خواهد شد )
باید Object در آیتمهای یک شی دیگر که از نوع TStrings است قرار گیرد ، برای مثال می توانید در آیتم های یک ListBox و یا یک ComboBox آبجکت مورد نظر را Add کنید ...
برای مثال :

ListBox1.Items.AddObject('MyTabSheet', PageControl1.Pages[0]);
پس از ثبت این Object میتوانید برای مثال به صورت زیر از آن استفاده نمایید :

PageControl1.ActivePage := TTabSheet(ListBox1.Items.Objects[1]);
کد بالا صفحه فعال PageControl را برابر با TabSheet موجود در لیست ( که در کد مشخص شده ) قرار می دهد ...

دستور دیگری که برای ثبت اطلاعات در TStrings استفاده می شود ، دستور AddStrings است که یک مقدار TStrings را به لیست رشته ها اضافه خواهد کرد ...

مثال :

var
Strings : TStringList;
S : String;
begin
S := 'String';
Strings := TStringList.Create;
Strings.Add(S);
ListBox1.Items.AddStrings(Strings);
end;

کد بالا ، رشته های موجود در Strings ( که همان S است ) را در ListBox1 قرار خواهد داد ...

دستور دیگری که برای اضافه کردن اطلاعات به یک TStrings به کار میرود ، دستور Append است ، این دستور یک مقدار String را به آخر لیست رشته ها در TStrings قرار می دهد ...

مثال :

var
S : TStrings;
begin
S := TStrings.Create;
S.Append('Hello');
end;

راه دیگر برای اضافه کردن یک رشته به TStrings استفاده از متد Insert است ...
این متد 2 پارامتر دارد ، 1. Index که شماره Index رشته ای که اضافه می شود را تعیین میکند و 2. S که مقدار رشته ای که باید اضافه شود را دربر می گیرد ..

مثال :

var
S : TStrings;
begin
S := TStrings.Create;
S.Insert(0, 'Hello');
end;

کد بالا رشته Hello را به عنوان اولین مقدار در لیست قرار می دهد ( به عنوان آیتمی که Index صفر دارد )

کلاس TStrings همچنین توابع دیگری به نام های LoadFromFile و LoadFromStream دارد که امکان وارد کردن رشته ها از یک فایل متنی و از Stream را میدهد ...
این دستورات یک پارامتر دارند که نام فایل و نام Stream را دربر می گیرد ...

مثال:


var
S : TStrings;
begin
S := TStrings.Create;
S.LoadFromFile(FileName);
S.LoadFromStream(Stream);
end;

حذف اطلاعات :

برای حذف اطلاعات از یک TStrings چندین راه وجود دارد که بررسی میکنیم

استفاده از متد Delete :
این متد یک رشته ( آیتم ) را از لیست حذف می نماید ، این متد یک پامتر دارد که باید Index مربوط به آیتمی که قصد حذف کردن آن را دارید را در آن وارد نمایید :


var
S : TStrings;
begin
S := TStrings.Create;
S.Delete(0);
end;

استفاده از متد Clear :
این متد کل رشته ها ( آیتمهای ) موجود در TStrings را حذف خواهد کرد ...


var
S : TStrings;
begin
S := TStrings.Create;
S.Clear;
end;

-----------------------------------

سایر متدها و توابع پرکاربرد :

متد Exchange :
این متد مقدار ( یا جایگاه ) دو آیتم را با هم عوض میکند ، این متد 2 پارامتر دارد با نامهای Index1 و Index2 ، بعد از اجرای این متد جای Index1 با Index2 عوض خواهد شد ...
برای مثال فرض کنیم در یک TStrings‌، یک آیتم با Index صفر داریم و یک آیتم دیگر با Index یک که مقدار رشته اولی برای با " Hello " و دومی برابر با " Bye " است ، پس اجرای این متد با Index های صفر و یک ، مقدار Index برای رشته " Hello " برابر با 1 و مقدار Index برای رشته " Bye " صفر خواهد بود :

S.Exchange(0, 1);

تابع Equals :
این تابع مقادیر TStrings فعلی را با مقادیر یک TStrings دیگر که به عنوان پارامتر دریافت می کند مقایسه میکند و در صورت همسان بودن ، مقدار True و در غیر این صورت مقدار False را برمی گرداند :


S.Equals(Strings : TStrings);

متد Move :
این متد یک رشته را از یک Index به یک Index دیگر منتقل میکند ، به عنوان مثال فرض کنیم که یک TStrings با 4 رشته ( آیتم ) داریم ، اگر بخواهیم مثلا آیتم سوم را از جای خود به آیتم اول ببریم باید به صورت زیر از متد Move استفاده نماییم :


var
S : TStrings;
begin
S := TStrings.Create;
S.Move(2, 0);
end;

توابع IndexOf و IndexOfObject :

به وسیله این توابع می توانید Index یک رشته و یا یک Object را بدست آورید ،‌ این توابع هر کدام یک پارامتر دارند ، تابع IndexOf پارامتری از نوع String دارد که رشته را گرفته و Index آن را به عنوان خروجی برگشت میدهد و تابع IndexOfObject هم پارامتری از نوع TObject دارد که Object مورد نظر را به عنوان ورودی دریافت کرده و شماره Index آن را به عنوان خروجی برگشت میدهد ...


S.IndexOf('Hello');
S.IndexOfObject(PageControl1.Pages[0]);

خاصیت Strings :
با استفاده از این خاصیت می توانید یک رشته از TStrings را با دادن Index آن استخراج کنید :

MyStr := S.Strings[0];

خاصیت Capacity :
این خاصیت از نوع Integer بوده و به وسیله آن میتوانید محدودیت تعداد رشته ( آیتم ) هایی که می توان در TStrings مورد نظر ثبت کرد را مشخص نمایید ...
مثلا اگر این خصوصیت بر روی 6 تنظیم شده باشد ، TStrings مورد نظر تنها 6 آیتم دریافت خواهد کرد ...

خاصیت Count :
این خاصیت از نوع Integer بوده و تعداد آیتمهای موجود در TStrings را به ما می دهد ...

------------------

این مقاله هم به پایان رسید ، این نکته رو هم ذکر کنم که این مقاله کامل کامل نبود یعنی در این مقاله کل توابع و متد ها و خصوصیتهای کلاس TStrings بررسی نشد ، کلاس TStrings چندین خاصیت و تابع داره که کاربردهای خاص دارند و به صورت معمول استفاده نمی شن ، از این جمله میشه به خصوصیت CommaText اشاره کرد ، با استفاده از این Property می توان رشته های درون TStrings را به صورت ( SDF ) یا System Data Format داشت

همچنین در این مقاله از توضیح برخی توابع مانند InsertObject که عملکردی شبیه تابع Insert دارند اجتناب شد ... ( توضیح تمام متدها و توابع و خصوصیتهای کلاس TStrings از حوصله این مقاله و کلا یک مقاله خارج است )

می توانید برای کسب اطلاعات بیشتر و کامل از Help دلفی کمک بگیرید ...

امیدوارم مفید بوده باشه ...

موفق و پیروز باشید ...

hp1361
یک شنبه 25 شهریور 1386, 14:40 عصر
Pdf این مقاله رو از لینک زیر دریافت کنید
http://www.savefile.com/files/1059967

Mahmood_M
یک شنبه 25 شهریور 1386, 20:50 عصر
PDF کدوم مقاله ؟ خودتون PDF اش کردید ؟
ممنون ...

ghabil
دوشنبه 26 شهریور 1386, 01:04 صبح
با اجازه آقا محمود من هم دوتا امکان خیلی خوب استرینگ لیست رو که معمولا ازش استفاده نمیشه رو معرفی کنم :
این اولی رو قبلا توضیح دادم ولی دوباره هم میزارمش :(قبلا با Item های ComboBox مثال زده بودم دیگه عوضش نکردم ، ولی برا هر StringListی قابل استفادست)


اصولا توی هر استرینگ لیستی میشه همراه هر Stringی که اضافه میکنیم یک آبجکت هم اضافه کنیم ، حالا شما میتونید یک کلاس با هر تعداد که میخواهید پراپرتی از هر تایپی تعریف کنید و کنار اون بزنید یعنی اینجوری :


TTestObject = class
public
IntField : Integer;
StringField: String
end;

procedure TForm1.FormCreate(Sender: TObject);
var
ATO: TTestObject;
begin
ATO:= TTestObject.Create;
ATo.IntField := 3;
ATO.StringField := 'Test';
ComboBox1.AddItem('A Test Line' , ATO);
//....
ShowMessage((ComboBox1.Items.Objects[0] as TTestObject).StringField);


اما یک کلک باحال که اختراع یکی از دوستان هست (من ندیدم جای دیگه ای ازش استفاده کنند) و اتفاقا خیلی کاربردیه یعنی تقریبا پیش نمیاد تو کاری ازش استفاده نکنم :
اون آبجکتی که Add میکنیم درواقع پوینتر آبجکت اصلی در حافظه هست ، یعنی در واقع یک عدد هست ! پس میشه راحت جای اون Object یک Integer نگه داشت :


ComboBox1.AddItem('Test', TObject(85));
یا
ComboBox1.items.Add('Test');
ComboBox1.Items.Objects[0] := Tobject(85);
//...
ShowMessage(IntToStr(Integer(ComboBox1.Items.Objec ts[0])))


اینطوری میتونید استرینگ لیستتون رو تبدیل کنید به یک لیستی که کنار هر آیتمی یک مقدار کلید هم نگه میداره ، نمیتونم بگم چقدر این امکان کاربردی و بدردبخوره .

امکان دوم ، امکان Sort کردن استرینگ لیست هست که خب خودش کلی امکانات جانبی داره مثل اینکه میتونید تعیین کنید چطوری Sort کنه و روش مقایسه رو تعیین کنید و ....

اما میخوام الان یک امکان کاربردیش رو هم بگم :
بعضی وقتها پیش میاد که یک سری (تعداد زیاد) استرینگ دارید و میخواهید به تناوب توی این استرینگها جستجو کنید و باهاشون کار کنید ؛ اگر این استرینگها رو توی یک استرینگ لیست بریزید و بعد این لیست رو سورت کنید ، از این ببعد استرینگ لیست برای پیدا کردن هر کدوم از این رشته ها از روش QuickSort که روش پیشفرضش هست استفاده میکنه ، و اونوقت در حد واقعا قابل توجهی کار یافتن رشته ها سریعتر میشه.(این درست مثل این میمونه که یک فیلد دیتابیسی رو ایندکس کرده باشید)

vcldeveloper
دوشنبه 26 شهریور 1386, 01:50 صبح
اما یک کلک باحال که اختراع یکی از دوستان هست (من ندیدم جای دیگه ای ازش استفاده کنند) و اتفاقا خیلی کاربردیه یعنی تقریبا پیش نمیاد تو کاری ازش استفاده نکنم
اینکه دیگه قدیمی شده، اوستا :چشمک:

این لیست رو سورت کنید ، از این ببعد استرینگ لیست برای پیدا کردن هر کدوم از این رشته ها از روش QuickSort که روش پیشفرضش هست استفاده میکنه
ولی مرسی، تا به حال دقت نکرده بودم که TStringList الگوریتم جستجوی خودش را بر اساس Sort بودن آیتم ها تغییر میده و از الگوریتم بهینه تری استفاده میکنه.

ghabil
دوشنبه 26 شهریور 1386, 16:16 عصر
اینکه دیگه قدیمی شده، اوستا :چشمک:


خب این رفیقمون هم قدیما اینو اختراع کرده بود :چشمک: