ورود

View Full Version : سوال: چطور مانع فعال شدن منوی مرتبط با BorderIcons هنگام فشار Alt بشیم؟



mbshareat
شنبه 05 آبان 1403, 10:55 صبح
سلام بر دوستان<br>امیدوارم سالم و سر حال باشید<br>من در برنامه خودم که کار متنی انجام میده از کلیدهای ترکیبی زیادی استفاده می کنم مثلا Alt+Down . وقتی کلید Alt رو فشار میدیم منوی نواز عنوان پنجره فعال میشه. البته باید کلید پایین رو فشار بدیم که این منو نمایش داده بشه.<br>محیط متنی که دارم یک لیست باکس هست که تبدیل به ویرایشگر شده.فرض کنید چنین کدی داریم:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=vk_Down then
ShowMessage('Key Down !');
end;

وقتی کلید جهت پایین رو میزنیم یک پیغام میده. اما اگر کلید Alt رو قبلش زده باشیم، وقتی که کلید جهت پایین رو بزنیم، منوی نوار عنوان پنجره باز میشه.من میخوام کلا این منو رو در برنامه نبینم.Form.KeyPreview رو True کردم و این کد رو نوشتم اما فایده نداشت:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If (Shift=[ssAlt]) and (Key=0) then
Shift:=[];
end;

اگر بخوام گزینه های BorderIcons رو غیر فعال کنم هم وار عنوان بدون دکمه بستن و مینیمایز میشه.<br>برای رفع بوق زدن چنین کدی دارم اما دیگه بیشتر بلد نیستم:
procedure TFileBrowserForm.WMMenuChar(var MessageRec: TWMMenuChar);
begin
inherited;
MessageRec.Result := MakeLong(0, 1);
end;

اگر دوستان نظری دارند بگند. میشه گفت برام مهمه.

mbshareat
یک شنبه 06 آبان 1403, 12:50 عصر
به یه جاهای عجیبی رسیدم!
میشه این کد رو استفاه کرد که آیتمهای منوی سیستم پنجره رو حذف کرد اما دکمه های سمت راست عنوان پنجره هم از کار میفته و منو هم حذف نمیشه و فقط خالی میشه:
procedure TForm1.DeleteSystemMenu;var
SystemMenu: HMenu;
begin
SystemMenu := GetSystemMenu(Handle, False);
DeleteMenu(SystemMenu, SC_Minimize, MF_BYCOMMAND);
DeleteMenu(SystemMenu, SC_Move, MF_BYCOMMAND);
DeleteMenu(SystemMenu, SC_Maximize, MF_BYCOMMAND);
DeleteMenu(SystemMenu, SC_Size, MF_BYCOMMAND);
DeleteMenu(SystemMenu, SC_Close, MF_BYCOMMAND);
DeleteMenu(SystemMenu, SC_Restore, MF_BYCOMMAND);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DeleteSystemMenu;
end;

اما این کد هم میشه لستفاده کرد که عددش رو از ShowMessage به دست آوردم و نمیدونم آیا ثابت هست یا نه و ظاهرا کار رو انجام میده:

Procedure WMSyscommand(Var msg: TWmSysCommand); message WM_SYSCOMMAND;
..
Procedure TForm1.WMSyscommand(Var msg: TWmSysCommand);
Begin
If Ord(msg.cmdtype)=61696 then//Alt Pressed!
Exit;
inherited;
End;

اگر کسی اطلاعات بیشتری داره لطفا بهم بگه(این عدد در برنامه ام کار می کنه اما نمی دونم آیا همیشه همینه؟).
دیگه داشتم به ترسیم بیت مپ روی نوار عنوان فکر می کردم!

یوسف زالی
سه شنبه 08 آبان 1403, 01:06 صبح
سلام. من در این مواقع نوار بالا رو خودم بعنوان یک پنل در مسترفرم می سازم و فرم رو نان می کنم.

mbshareat
چهارشنبه 09 آبان 1403, 11:41 صبح
روش جالبیه که کد نویسی و افزودن ایمیج هم برای تغییر مکان و مینیمایز و بستن میخواد ولی قلابی بون نوار عنوان از تیز بودن گوشه ها و بدون لبه بودن فرم معلوم میشه.مستر فرم چیه؟ منظورتون پنجره اصلی برنامه هست یا پنجره ای که چند پنجره داخلی داره؟

یوسف زالی
چهارشنبه 09 آبان 1403, 14:35 عصر
مستر فرم یعنی یه فرم پایه می سازی همه کاراشو می کنی، بقیه فرم ها رو از اون ارث بری میکنی و دیفالت همه فرمهات شکل اونی هستن که درست کرده بودی. همون کارها رو هم می کنن.
من برای یکی از پروژه هام که 200 300 تا فرم داشت همین کارو کردم، 3 مدل فرم پایه ساختم که مثلا مدیریت شورت کات ها، لیست منوها، مدیریت راست کلیک ها، باز شدن بصورت ماکزیمایز، وسط چین بودن اشیا، ست کردن خصوصیات روی اشیا برای همه فرم ها و این چیزا رو انداخته بودم توشون، بقیه فرم ها رو فقط می ساختم و دیفالت همه شون همون طوری بودن. مثل ساخت کامپوننت هست. ولی در سطح فرم.
یک بار باهاش کار کنی دیگه به خودت میگی چرا از اول اینطوری نمی رفتم جلو :لبخند:

mbshareat
یک شنبه 13 آبان 1403, 11:50 صبح
ممنونم. ما هنوز اونقدر با کلاس نشدیم. من در برنامه هام از روشهایی که برنامه نویسی استفاده نمی کنه استفاده می کنم ولی اگر فقط قلم پیشفرض تاهوما میشد با اندازه خاص خوب بود.
یه برنامه دارم که برای برنامه های کوچیک ازش کپی میگیرم و تغییر میدم. شامل لیبک و تیک و دکمه هست و توابع و پروسیجر های خاص داره. نمی دونم ربطی به مستر فرم داره یا نه؟(اون توابع و پروسیجرها از ظاهر فرم برام مهمتره):
156265
البته کپی کردم برنامه و تغییر نامش هم خیلی سخت نیست.

یوسف زالی
یک شنبه 13 آبان 1403, 14:39 عصر
بله می شود

دلفــي
پنج شنبه 20 دی 1403, 12:33 عصر
سلام بر دوستان<br>امیدوارم سالم و سر حال باشید<br>من در برنامه خودم که کار متنی انجام میده از کلیدهای ترکیبی زیادی استفاده می کنم مثلا Alt+Down . وقتی کلید Alt رو فشار میدیم منوی نواز عنوان پنجره فعال میشه. البته باید کلید پایین رو فشار بدیم که این منو نمایش داده بشه.<br>محیط متنی که دارم یک لیست باکس هست که تبدیل به ویرایشگر شده.فرض کنید چنین کدی داریم:
procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=vk_Down then
ShowMessage('Key Down !');
end;

وقتی کلید جهت پایین رو میزنیم یک پیغام میده. اما اگر کلید Alt رو قبلش زده باشیم، وقتی که کلید جهت پایین رو بزنیم، منوی نوار عنوان پنجره باز میشه.من میخوام کلا این منو رو در برنامه نبینم.Form.KeyPreview رو True کردم و این کد رو نوشتم اما فایده نداشت:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If (Shift=[ssAlt]) and (Key=0) then
Shift:=[];
end;

اگر بخوام گزینه های BorderIcons رو غیر فعال کنم هم وار عنوان بدون دکمه بستن و مینیمایز میشه.<br>برای رفع بوق زدن چنین کدی دارم اما دیگه بیشتر بلد نیستم:
procedure TFileBrowserForm.WMMenuChar(var MessageRec: TWMMenuChar);
begin
inherited;
MessageRec.Result := MakeLong(0, 1);
end;

اگر دوستان نظری دارند بگند. میشه گفت برام مهمه.

با کد زیر میتونی منو رو غیرفعال کنی:

SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) and not WS_SYSMENU);


با این کد هم می تونی مواردی رو که میخوای دوباره ایجاد کنی:

SetWindowPos(Form.Handle, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_NOREDRAW);

mbshareat
جمعه 21 دی 1403, 23:21 عصر
من نمیخوام دکمه ها از سمت راست بالا حذف بشند