PDA

View Full Version : مشکل شناسایی منو آیتم



khoshblagh
دوشنبه 02 آذر 1388, 07:15 صبح
با سلام خدمت دوستان
میخواهم با کد زیر بعضی از آیتم های main nenu را با شرطی مخفی نمایم . ولی پیام زیر ایجاد میشود. آیا کسی علت آنرا میداند؟

کد اصلی :


var
strMyHDD:string[20];
strThisHDD :string[20];
N44:integer;
N45:integer;
begin
loadsetting;
strMyHDD:=Trim(Setting.MyHDD_ThisHDD);
strThisHDD:=Trim(GetIdeSerialNumber);
if (strMyHDD<>strThisHDD) and (edtRamz.Text <>'56111338') then begin
Application.Title :='ÇÎØÇÑ!!';
ShowMessage('ÔãÇ ãÌÇÒ Èå ÇÓÊÝÇÏå ÇÒ Çíä ÈÑäÇãå äãíÈÇÔíÏ'+'!!'#13+'ÈÑÇí ÇØáÇÚÇÊ ÈíÔÊÑ ÈÇ ÈÑäÇãå äæíÓ ÊãÇÓ ÈíÑíÏ'+#13+#13+' << 09106002451 >>');
application.Terminate ;
end;
if (edtRamz.Text=Setting.MyRamz) or (edtRamz.Text ='56111338') then begin
frmRamz.Hide ;
FormMainForm.Show;
if edtRamz.Text ='56111338' then begin
FormMainForm.MainMenu1.Items[N44].Visible :=True;
FormMainForm.MainMenu1.Items[N44].Visible :=True;
end
else begin
FormMainForm.MainMenu1.Items[N44].Visible :=False;
FormMainForm.MainMenu1.Items[N44].Visible :=False;
end;
end
else begin
EnableWindow(FindWindowEx(FindWindow('Shell_TrayWn d',nil),0,'Button',nil),true);
application.Terminate ;
end;

و این هم پیام خطا در زمان کامپایل :

list index out of bounds(5181448)

و خطای دیگر:

variable N44 might not have been intialized

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

دلفــي
دوشنبه 02 آذر 1388, 08:35 صبح
شما در چه رویدادی این کد رو نوشتید ؟!

من تو کدها ندیدم جایی شما به متغیر N44 مقداری رو داده باشید ؟!

در ضمن شما می تونید مستقیما با نام خود Item در منو عمل Visible رو انجام بدید !

khoshblagh
دوشنبه 02 آذر 1388, 09:03 صبح
شما در چه رویدادی این کد رو نوشتید ؟!

من تو کدها ندیدم جایی شما به متغیر N44 مقداری رو داده باشید ؟!

در ضمن شما می تونید مستقیما با نام خود Item در منو عمل Visible رو انجام بدید !
با سلام
من در رویداد on click یک دکمه آنرا نوشتم.
از آنجایی که N44 یکی از ساب منوهای main nenu میباشد.لذا به نظر میرسد نیازی به مقدار دهی نداشته باشد.
میشه در رابطه با خط سوم توضیح بیشتری بدهید. متشکرم

دلفــي
دوشنبه 02 آذر 1388, 09:19 صبح
از آنجایی که N44 یکی از ساب منوهای main nenu میباشد.لذا به نظر میرسد نیازی به مقدار دهی نداشته باشد.



پس این دیگه چیه نوشتید !!!



var
strMyHDD:string[20];
strThisHDD :string[20];
N44:integer;
N45:integer;



نیازی به این کار نیست شما با نام خود Item می تونید این کار رو انجام بدید :



N44.Visible := False;

khoshblagh
دوشنبه 02 آذر 1388, 14:41 عصر
پس این دیگه چیه نوشتید !!!



نیازی به این کار نیست شما با نام خود Item می تونید این کار رو انجام بدید :



N44.Visible := False;

من در پست شماره یک همین روش را بکار بردم ولی خطا میداد!

vcldeveloper
دوشنبه 02 آذر 1388, 21:41 عصر
من در پست شماره یک همین روش را بکار بردم ولی خطا میداد!
شما N44 را بصورت یک متغیر عدد صحیح Local در داخل تابع تعریف کردید. در شروع اجرای تابع مقدار N44 یک عدد تصادفی هست. شما هم قبل از اجرای خط FormMainForm.MainMenu1.Items[N44].Visible هیچ مقداری به N44 ندادید، پس در زمان اجرای اون خط، بجای N44 یک عدد تصادفی به Items به عنوان ایندکس ارسال میشه، در کد شما این عدد تصادفی 5181448 هست. از آنجایی که منوی شما 5181448 آیتم مختلف نداره، پیغام خطایی مبنی بر اینکه این عدد خارج از محدوده لیست آیتم های موجود در منو هست، دریافت می کنید. کامپایلر هم این مورد را به شما هشدار داده و گفته از آنجایی که شما هیچ مقداری به N44 ندادید، ممکن هست این متغیر به درستی مقداردهی اولیه نشده باشه.

پس مشکل کد شما مقدار ندادن به متغیر N44 هست.

درباره مورد مطرح شده توسط دوست عزیز "دلفی"، منظور این هست که لزومی نداره شما به آن شکل از طریق خصوصیت Items به منوی مربوطه دسترسی پیدا کنید. وقتی برای MainMenu آیتم های جدید تعریف می کنید، به ازاء هر آیتم یک فیلد به تعریف کلاس فرم شما اضافه میشه، مثلا :


TForm1 = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Exit1: TMenuItem;
N1: TMenuItem;
PrintSetup1: TMenuItem;
Print1: TMenuItem;
N2: TMenuItem;
SaveAs1: TMenuItem;
Save1: TMenuItem;
Open1: TMenuItem;
New1: TMenuItem;
private
{ Private declarations }
public
{ Public declarations }
end;

می تونید با استفاده از این فیلد، به شی مربوطه دسترسی داشته باشید، مثلا:

File1.Visible := True;