View Full Version : مخفی کردن تمام کنترل های از نوع Combo Box موجود روی فرم
Win_RT
دوشنبه 05 تیر 1391, 09:20 صبح
سلام،چجوری می تونم اینکارو بکنم؟
mohsen24000
دوشنبه 05 تیر 1391, 10:47 صبح
بایستی داخل یک حلقه تمامی کامپوننتهای فرم رو که از نوع کومبو باکس هستند رو پیدا کرده و مشخصه visible اونها رو false کنید.
Win_RT
دوشنبه 05 تیر 1391, 10:53 صبح
بایستی داخل یک حلقه تمامی کامپوننتهای فرم رو که از نوع کومبو باکس هستند رو پیدا کرده و مشخصه visible اونها رو false کنید.
اینو خودم می دونستم.چجوری پیدا کنم؟
mohsen24000
دوشنبه 05 تیر 1391, 11:04 صبح
var i : Integer;
begin
for I := 0 to Form1.ComponentCount - 1 do
if Form1.Components[i] is TComboBox then (Form1.Components[i] as TComboBox).Visible:=False;
end;
me.enik
دوشنبه 05 تیر 1391, 11:41 صبح
سلام.
اگر خواستی بتونی به صورت دستی و بدون کد نویسی این کار رو انجام بدی, توی قسمت properties اون شی که داری, خصوصیت visible ( یکی مونده به آخرین خصوصیت احتمالا !! ), رو به false تغییر بدی.
Felony
دوشنبه 05 تیر 1391, 18:54 عصر
var i : Integer;
begin
for I := 0 to Form1.ComponentCount - 1 do
if Form1.Components[i] is TComboBox then (Form1.Components[i] as TComboBox).Visible:=False;
end;
وقتی از عملگر is استفاده میکنید و کلاس مشتق شده شئ جاری رو بررسی میکنید دیگه نیازی به as cast نیست ؛ as cast درخت ثوارث رو بررسی میکنه ببینه شئ مورد از کلاسی که قصد typecast کردن شئ به اون رو دارید هست یا نه ، اگر نبود یک Exception تولید میکنه ولی وقتی با is وراثت یک شئ از یک کلاس رو بررسی میکنید نیازی به as cast نیست و یک تبدیل hard cast کافی هست ، با تبدیل hard cast به کامپایلر اطمینان میدید که شیئی که قصد تبدیلش رو دارید از کلاس مورد نظر هست و کامپایلر دیگه درخت ثوارث رو بررسی نمیکنه ، در حقیقت با عملگر is یک تبدیل نا امن ( hard cast ) رو به تبدیل امن تبدیل کردید ، بنابراین کد شما اگر به صورت زیر نوشته بشه خیلی بهینه تره :
var i : Integer;
begin
for I := 0 to Form1.ComponentCount - 1 do
if Form1.Components[i] is TComboBox then TComboBox(Form1.Components[i]).Visible:=False;
end;
Ananas
دوشنبه 05 تیر 1391, 23:40 عصر
سلام علیکم.
اینطوری هم بد نیست:
var
I : Integer;
begin
for I := 0 to Self.ControlCount - 1 do
if Self.Controls[i] is TComboBox then
Self.Controls[i].Visible := False;
end;
joooje
چهارشنبه 07 تیر 1391, 08:22 صبح
سلام به دوستان
من یه سوال دارم در مورد این کدهاییی که اینجا دوستان گذاشتند
من میخوام خودم موضوع رو بهتر درک کنم:
اگر بخوام شرط اینکه کلاس خاصی رو مخفی یا ادیت کنم از بین ببرم میتونم تو کد Ananas (http://barnamenevis.org/member.php?233990-Ananas) این تغییر رو بدم:
var
I : Integer;
begin
for I := 0 to Self.ControlCount - 1 do
Self.Controls[i].Visible := False;
end;
ولی چرا الان برای Self.Controls[i] تمام امکانات رو ندارم، مثلا نمیتونم رنگ براش تعریف کنم یا txt و عنوان و ... ؟؟؟؟
و تو کد آقا ماهان این تغییر رو لحاظ کنم:
var i : Integer;
begin
for I := 0 to Form1.ComponentCount - 1 do
TComboBox(Form1.Components[i]).Visible:=False;
end;
چرا الان با وجود TComboBox تغییرات رو همه اشیا اعمال میشه؟؟؟ آیا TComboBox درست هست یا باید چیزی جایگزینش کنم؟
با توجه به اینکه این کد تمام امکانات رو مثل تغییر رنگ و عنوان و ... رو برای اشیا میزاره
واینکه اگر بخوام این تغییرات برای تمام اشیا تو کل فرمها اعمال بشه آیا باید برای تک تک فرمها این کار رو جدا بکنم؟ یا مثلا با تغییر تو کد میشه درستش کرد مثل زیر که برای تنها فرمها انجامش میده (تغییر Form1 به Application)
for I := 0 to Application.ComponentCount - 1 do begin
و دقیقا تفاوت این روش برای دستور دادن به یک شی با find component چی هست؟
ممنون میشم راهنمایی کنید
Felony
چهارشنبه 07 تیر 1391, 10:08 صبح
ولی چرا الان برای Self.Controls[i] تمام امکانات رو ندارم، مثلا نمیتونم رنگ براش تعریف کنم یا txt و عنوان و ... ؟؟؟؟
چون از Controls استفاده کرده ؛ Controls هم آرایه ای از نوع داده ای TControl هست ؛ TControl هم کلاس پایه اشیاء Visual در دلفی ، تمامی اشیاء Visual دارای خواص و متدهای یکسانی نیستند ، مثلا یک دکمه خصیصه Caption داره ولی یک Edit نه و در عوض خصیصه Text داره ؛ درست ؟
حالا شما توقع داری دلفی از کجا بفهمه به چه شیئی میخوای دسترسی داشته باشی و متدها و خواص اون رو برات لیست کنه ؟ از کجا بدونه Control جاری که تو آرایه داری بهش اشاره میکنی چی هست ؟ از مدوم کلاس مشتق شده ؟
چرا الان با وجود TComboBox تغییرات رو همه اشیا اعمال میشه؟؟؟ آیا TComboBox درست هست یا باید چیزی جایگزینش کنم؟
چون خصیصه Visible رو مقدار دهی کردی ، خصیصه Visible تو کلاس TControl تعریف شده و کلاس TControl هم کلاس پایه TComboBox ؛ با توجه به توضیحاتی که در مورد سوال قبلیتون دادم پس تمام اشیاء Visual فرم از TControl مشتق میشن ، پس همشون خصیصه Visible دارن ، شما برداشتی با اون کد تمام اشیاء روی فرم رو به TComboBox تبدیل کردی و به متد Visible شون مقدار دادی ، کامپایلر هم چون متد Visible رو پیدا میکنه ( در کلاس پدر تعریف شده ) پیغام خطایی نمیده و تبدیل رو انجام میده ، اگر اون قسمت بررسی شئ ( is ) رو بر نمیداشتی کد فقط روی اشیائی که TComboBox مشتق شدن عمل میکرد ؛ حالا کدت رو به صورت زیر تغییر بده :
var
i: Integer;
begin
for i := 0 to Form1.ComponentCount - 1 do
TComboBox(Form1.Components[i]).Text := 'Test';
end;
خوب ؟! AV صادر میشه چون همه کنترل های روی فرم متد Text ندارن و شما داری به زور اون ها رو تبدیل به TComboBox میکنی و میخوای خصیصه Text رو ازشون بخونی در صورتی که نه در کلاس اون شئ که باعث بروز AV شده نه در کلاس پدرش متد Text تعریف نشده !
واینکه اگر بخوام این تغییرات برای تمام اشیا تو کل فرمها اعمال بشه آیا باید برای تک تک فرمها این کار رو جدا بکنم؟ یا مثلا با تغییر تو کد میشه درستش کرد مثل زیر که برای تنها فرمها انجامش میده (تغییر Form1 به Application)
میشه همچین چیزی ، یعنی به ازای هر فرم باید کنترل هاش رو بررسی و تغییرات رو اعمال کنی ( دلفی نداشتم تو Notepad نوشتم ولی نباید مشکلی داشته باشه ) :
var
FormCount, ComCount: Integer;
begin
for FormCount := 0 to Application.ComponentCount - 1 do
if Application.Components[FormCount] is TForm then
begin
for ComCount := 0 to TForm(Application.Components[FormCount]).ComponentCount - 1 do
if TForm(Application.Components[FormCount]).Components[ComCount] is TComboBox then
TComboBox((Application.Components[FormCount]).Components[ComCount]).Text:= 'Test';
end;
end;
و دقیقا تفاوت این روش برای دستور دادن به یک شی با find component چی هست؟
FindComponent نام یک کنترل رو میگیره و در صورت صحت نام و وجود کامپوننت اون رو به عنوان یک شئ TComponent به شما تحویل میده ولی تو روش بالا شما اسمی از کنترلی نبردید و با بررسی یکسری خصیصه به این نتیجه رسیدی که کنترل جاری کامپوننت مورد نظرت هست یا نه .
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.