PDA

View Full Version : مدیریت فعال یا غیر فعال بودن منوها یا دکمه ها



MOJTABAATEFEH
سه شنبه 30 آذر 1389, 06:52 صبح
سلام دوستان عزیز


برای اعمال سطح دسترسی در برنامه از این روش استفاده کردم که یک فیلد رو به عنوان Tag (که برای هر آیتم یا چند آیتم منحصر به فرد است)و یکی به عنوان نام آیتم منو یا دکمه در نظر گرفتم و فیلد دیگری جهت وضعیت فعال یا غیر فعال بودن آیتم و یک فیلد هم نام کاربر موقع وارد شدن کاربر این جدول بر اساس نام کاربر فیلتر میشه حالا می خوام این جدول پیمایش بشه و آیتم منو یا دکمه مربوط به هر رکورد با توجه به فیلد Tag یا نام (کدام بهتر است؟) و بر اساس فیلدی که فعال یا غیر فعال بودن رو مشخص میکنه تغییر وضعیت بده حالا چطور کامپوننت های (آیتم های منو ، دکمه ها و ......) برنامه رو تشخیص بدم و اعمال کنم
استفاده از Tag رو در صورتی که مشکلی پیش نیاورد ترجیح میدهم چون چند آیتم یا دکمه را میشه همزمان تغییر وضعیت داد

با تشکر

Felony
سه شنبه 30 آذر 1389, 07:52 صبح
کل کنترل های روی فرم رو پیمایش کن و ببین کدوم تگش با تگ مورد نظرت برابر هست و بعد عملیات مورد نظر رو روش انجام بده ، مثلا :

procedure SetEnable(Tag: Integer; Enabled: Boolean);
var
i: Integer;
T: TComponent;
begin
for i:= 0 to Form1.ComponentCount -1 do
begin
T:= Form1.Components[i];
if T is TControl then
if T.Tag= Tag then
TControl(T).Enabled:= Enabled;
end;
end;

استفاده :

SetEnable(3, False);
کد بالا کنترل هایی که تگ 3 دارن رو غیر فعال میکنه .

MOJTABAATEFEH
سه شنبه 30 آذر 1389, 12:49 عصر
کل کنترل های روی فرم رو پیمایش کن و ببین کدوم تگش با تگ مورد نظرت برابر هست و بعد عملیات مورد نظر رو روش انجام بده ، مثلا :

procedure SetEnable(Tag: Integer; Enabled: Boolean);
var
i: Integer;
T: TComponent;
begin
for i:= 0 to Form1.ComponentCount -1 do
begin
T:= Form1.Components[i];
if T is TControl then
if T.Tag= Tag then
TControl(T).Enabled:= Enabled;
end;
end;استفاده :

SetEnable(3, False);کد بالا کنترل هایی که تگ 3 دارن رو غیر فعال میکنه .

ممنون دوست عزیز کد شما برای کنترل هایی مثل Button , Edit, ...... به خوبی کار میکنه برای آیتم های منو باید چکار کرد روی آیتم های منو جواب نداد

با تشکر

Felony
سه شنبه 30 آذر 1389, 14:02 عصر
ممنون دوست عزیز کد شما برای کنترل هایی مثل Button , Edit, ...... به خوبی کار میکنه برای آیتم های منو باید چکار کرد روی آیتم های منو جواب نداد
خوب باید هم اونطور باشه ، آیتم های Menu از کلاس TMenuItem مشتق میشن و این کلاس هم از TComponent به ارث برده شده ، تو اون کد بالا هم شرط چک میکنه که کامپوننت از کلاس TControl باشه و وقتی به یه آیتم منو میرسه شرط نقض میشه و عملیات انجام نمیشه ، کد رو باید به صورت زیر تغییر بدید :


procedure SetEnable(Tag: Integer; Enabled: Boolean);
var
i: Integer;
T: TComponent;
begin
for i:= 0 to Form1.ComponentCount -1 do
begin
T:= Form1.Components[i];
if T is TComponent then
if T.Tag= Tag then
if T is TMenuItem then
TMenuItem(T).Enabled:= Enabled
else
TControl(T).Enabled:= Enabled;
end;
end;

@ TComponent یک کلاس پایه هست و متد Enabled برای تعریف نشده و پیاده سازی اون به عهده کلاس فرزند گذاشته شده ولی TControl این متد رو داره ، پس نمیتونید مثل TControl مستقیم متد Enabled شیئی که از TComponent مشتق شده رو صدا بزنید و باید اول اون رو به شئ مورد نظر TypeCast کنید و بعد متد Enabledش رو صدا بزنید ، مثل کد بالا .

MOJTABAATEFEH
سه شنبه 30 آذر 1389, 15:20 عصر
خوب باید هم اونطور باشه ، آیتم های Menu از کلاس TMenuItem مشتق میشن و این کلاس هم از TComponent به ارث برده شده ، تو اون کد بالا هم شرط چک میکنه که کامپوننت از کلاس TControl باشه و وقتی به یه آیتم منو میرسه شرط نقض میشه و عملیات انجام نمیشه ، کد رو باید به صورت زیر تغییر بدید :


procedure SetEnable(Tag: Integer; Enabled: Boolean);
var
i: Integer;
T: TComponent;
begin
for i:= 0 to Form1.ComponentCount -1 do
begin
T:= Form1.Components[i];
if T is TComponent then
if T.Tag= Tag then
if T is TMenuItem then
TMenuItem(T).Enabled:= Enabled
else
TControl(T).Enabled:= Enabled;
end;
end;@ TComponent یک کلاس پایه هست و متد Enabled برای تعریف نشده و پیاده سازی اون به عهده کلاس فرزند گذاشته شده ولی TControl این متد رو داره ، پس نمیتونید مثل TControl مستقیم متد Enabled شیئی که از TComponent مشتق شده رو صدا بزنید و باید اول اون رو به شئ مورد نظر TypeCast کنید و بعد متد Enabledش رو صدا بزنید ، مثل کد بالا .

ممنون بابت پاسختون درست شد یه مشکل دیگه هست الان متوجه شدم در فرمم از شئی استفاده کردم (ویژوال هست) و از نوع کامپوننت نیست و از کلاس دیگه ای مشتق شده و اون هم از کلاس دیگه ای که در نهایت دیدم به کلاس TObject رسید باهاش دست و پنجه نرم کردم اما جواب نگرفتم برای اینجور مواردی باید چکار کرد؟ (نام سربرگ شئی در دلفی Design eXperience هست که منویی شبیه xp درست میکنه)

با تشکر

Felony
سه شنبه 30 آذر 1389, 15:28 عصر
ممنون بابت پاسختون درست شد یه مشکل دیگه هست الان متوجه شدم در فرمم از شئی استفاده کردم (ویژوال هست) و از نوع کامپوننت نیست و از کلاس دیگه ای مشتق شده و اون هم از کلاس دیگه ای که در نهایت دیدم به کلاس TObject رسید باهاش دست و پنجه نرم کردم اما جواب نگرفتم برای اینجور مواردی باید چکار کرد؟
چه شیئی استفاده کردی ؟
تمام کامپوننت ها در آخر از TComponent مشتق میشن ، اون TObject هم کلاس پایه تمام کلاس ها تو دلفی هست و همه کلاس ها در آخر به اون ختم میشن .

MOJTABAATEFEH
سه شنبه 30 آذر 1389, 15:45 عصر
دوست عزیز پست قبل رو ببینید کامل کردم موقع استفاده از این شئی 3تا یونیت به پروژه اضافه میشه dxWinXPBar, dxCore, dxContainer که آیتم A, B ,...... مشخص شده در شکل در آیتم ادیتور dxWinXPBar تولید میشن و خود dxWinXPBar در نهایت از TComponent مشتق شده ولی آیتم های اون همونجوری گفتم جایی از TComponent مشتق نشدند

با تشکر

Felony
سه شنبه 30 آذر 1389, 17:52 عصر
من اون کامپوننت رو ندارم ، روش کلی کار رو گفتم باید عملیات Type Casting رو برای شئ مورد نظر انجام بدید ، اگر نمیتونید کد رو تغییر بدید به ترتیب درخت ثوارثی که آیتم ها ازش به ارث برده شدن رو بنویسید تا ببینیم چی میشه .

Felony
سه شنبه 30 آذر 1389, 20:20 عصر
procedure SetEnable(Tag: Integer; Enabled: Boolean);
var
i : Integer;
T: TComponent;
begin
for i:= 0 to Form1.ComponentCount -1 do
begin
T:= Form1.Components[i];
if T is TComponent then
if T.Tag= Tag then
if T is TMenuItem then
TMenuItem(T).Enabled:= Enabled
else
TControl(T).Enabled:= Enabled;
end;
for i:= 0 to Form1.dxWinXPBar1.Items.Count -1 do
if Form1.dxWinXPBar1.Items[i].Tag= Tag then
Form1.dxWinXPBar1.Items[i].Enabled:= Enabled;
end;

MOJTABAATEFEH
سه شنبه 30 آذر 1389, 20:28 عصر
procedure SetEnable(Tag: Integer; Enabled: Boolean);
var
i, j: Integer;
T: TComponent;
begin
for i:= 0 to Form1.ComponentCount -1 do
begin
T:= Form1.Components[i];
if T is TComponent then
if T.Tag= Tag then
if T is TMenuItem then
TMenuItem(T).Enabled:= Enabled
else
TControl(T).Enabled:= Enabled;
end;
for j:= 0 to Form1.dxWinXPBar1.Items.Count -1 do
if Form1.dxWinXPBar1.Items[j].Tag= Tag then
Form1.dxWinXPBar1.Items[j].Enabled:= Enabled;
end;

واقعا دست گلت درد نکنه این همه وقت گذاشتی بالاخره درست شد :بوس:

این پیغام مربوط به چیه؟

vcldeveloper
چهارشنبه 01 دی 1389, 00:47 صبح
این پیغام مربوط به چیه؟
هر تاپیک مربوط به یک سوال هست.

در ضمن، در کد بالا، نباید T به TControl به اون شکل Type-cast میشد؛ چون تضمینی وجود نداره که اگر T یک TMenuItem نباشه، حتما TControl باشه، بلکه T میتونه یک TComponent باشه، در اون صورت، Type-cast شما غیر معتبر هست. همچنین، نیازی هم نبود که if T is TComponent نوشته بشه، چون معلوم هست که T از نوع TComponent هست.

هر کدی که اینجا می بینید رو Copy\Paste نکنید توی برنامه تون، سعی کنید بفهمید اون کد چیکار میکنه.

نکته آخر هم اینکه به جای Enable\Disable کردن این همه کنترل در کد، براشون Action تعریف کنید، و Action مربوطه را Enable\Disable کنید. فعال یا غیرفعال کردن Action متصل به کنترل های مختلف باعث میشه که اون کنترل ها هم به طور خودکار فعال یا غیرفعال بشند.

Felony
چهارشنبه 01 دی 1389, 05:39 صبح
در ضمن، در کد بالا، نباید T به TControl به اون شکل Type-cast میشد؛ چون تضمینی وجود نداره که اگر T یک TMenuItem نباشه، حتما TControl باشه، بلکه T میتونه یک TComponent باشه، در اون صورت، Type-cast شما غیر معتبر هست. همچنین، نیازی هم نبود که if T is TComponent نوشته بشه، چون معلوم هست که T از نوع TComponent هست.
بله ، من همون دیشب که پست زدم کد رو اصلاح کردم و قرار دادم ولی دیتابیس سایت دیشب مشکل داشت و پست رو ویرایش نکرد ، در هر صورت کد اصلاح شده رو اینجا قرار میدم :

procedure SetEnable(Tag: Integer; Enabled: Boolean);
var
i : Integer;
T: TComponent;
begin
for i:= 0 to Form1.ComponentCount -1 do
begin
T:= Form1.Components[i];
if T.Tag= Tag then
if T is TMenuItem then
TMenuItem(T).Enabled:= Enabled
else
if T is TControl then
TControl(T).Enabled:= Enabled;
end;
for i:= 0 to Form1.dxWinXPBar1.Items.Count -1 do
if Form1.dxWinXPBar1.Items[i].Tag= Tag then
Form1.dxWinXPBar1.Items[i].Enabled:= Enabled;
end;

MOJTABAATEFEH
پنج شنبه 02 دی 1389, 13:31 عصر
هر تاپیک مربوط به یک سوال هست.

در ضمن، در کد بالا، نباید T به TControl به اون شکل Type-cast میشد؛ چون تضمینی وجود نداره که اگر T یک TMenuItem نباشه، حتما TControl باشه، بلکه T میتونه یک TComponent باشه، در اون صورت، Type-cast شما غیر معتبر هست. همچنین، نیازی هم نبود که if T is TComponent نوشته بشه، چون معلوم هست که T از نوع TComponent هست.

هر کدی که اینجا می بینید رو Copy\Paste نکنید توی برنامه تون، سعی کنید بفهمید اون کد چیکار میکنه.

نکته آخر هم اینکه به جای Enable\Disable کردن این همه کنترل در کد، براشون Action تعریف کنید، و Action مربوطه را Enable\Disable کنید. فعال یا غیرفعال کردن Action متصل به کنترل های مختلف باعث میشه که اون کنترل ها هم به طور خودکار فعال یا غیرفعال بشند.

جناب کشاورز در صورت امکان لطفا توضیح بیشتری بدین (تذکر شما رو هم اعمال میکنم)

با تشکر

vcldeveloper
پنج شنبه 02 دی 1389, 16:30 عصر
در صورت امکان لطفا توضیح بیشتری بدین
چی رو بیشتر توضیح بدم؟

MOJTABAATEFEH
جمعه 03 دی 1389, 02:32 صبح
استفاده از Action تو این مورد چه مزیتی نسبت به روش قبلی داره؟

با تشکر

vcldeveloper
جمعه 03 دی 1389, 03:02 صبح
استفاده از Action تو این مورد چه مزیتی نسبت به روش قبلی داره؟
همون چیزی که در پست قبلی نوشتم؛ به جای اینکه برای هر تغییری چندین کنترل را فعال/غیر فعال کنید، فقط Action ایی که اون کنترل ها بهش متصل هستند را فعال/غیرفعال می کنید، و Action خودش به طور خودکار کنترل های متصل به خودش را فعال/غیرفعال میکنه.