
نوشته شده توسط
شاهین عشایری
سلام
همه شما با دستور With آشنایی دارید.
به کد زیر توجه کنید:
with Memo1 do
begin
With Lines do
begin
Add('Line 1');
Add('Line 2');
end;
end;
کد بالا یک معادل جالب هم دارد که شاید افراد بسیاری کمی از آن اطلاع داشته باشند. جالب است بدانید که کد زیر دقیقاً معادل کد بالا است:
with Memo1, Lines do
begin
Add('Line 1');
Add('Line 2');
end;
منبع:
http://www.nickhodges.com/post/How-N...tatements.aspx
مثالی که ذکر کردید جالب نیست ، خوب به جای اون کد :
with Memo1.Lines do
begin
Add('Line 1');
Add('Line 2');
end;
اون نوع استفاده از with برای اشیاء مختلف کاربردی هست ، مثلا :
var
StrList: TStringList;
I: Integer;
begin
StrList := TStringList.Create;
try
with ListBox1, StrList do
begin
Add('Item 1 in string list');
Add('Item 2 in string list');
Add('Item 3 in string list');
for I := 0 to Count - 1 do
Items.Add(Strings[I]);
end;
finally
StrList.Free;
end;
end;
البته به عنوان مثال و گرنه با Assign میشه راحت این مورد رو پیاده کرد .
از این شیوه در پروژه های بزرگ استفاده نکنید ، کد رو خیلی پیچیده میکنه و به نوشتن کدهای کثیف کمک شایانی میکنه و کار دیباگ کد رو بسیار پیچیده میکنه .
در ضمن اگر اشیاء انتخاب شده دارای متدهای یکسانی باشند متد شئ آخر در لیست With در نظر گرفته میشه ، مثلا تو همون کد بالا هم کلاس TStringList دارای متد Count هست هم کلاس TListBox ، همون کد بالا اگر به صورت زیر نوشته بشه دیگه کار نمیکنه :
var
StrList: TStringList;
I: Integer;
begin
StrList := TStringList.Create;
try
with StrList, ListBox1 do
begin
Add('Item 1 in string list');
Add('Item 2 in string list');
Add('Item 3 in string list');
for I := 0 to Count - 1 do
Items.Add(Strings[I]);
end;
finally
StrList.Free;
end;
end;
چون شئ ListBox1 به عنوان شئ دوم ( آخری ) به With ارجاع داده شده و ListBox1 حاوی هیچ آیتمی نیست و اصلا وارد حلقه نمیشه .
موفق باشید .