PDA

View Full Version : استفاده ازکلیدهای تابعی



amirkazem
دوشنبه 10 خرداد 1395, 17:55 عصر
باسلام
میخواهیم توی برنامه (توی فرمها)ازکلیدهای فانکشنال (f1,f2,f3,...) استفاده کنیم. مثلاً روی یک دکمه کپشن f2رابنویسیم که اگرکاربرکلیدf2را فشارداد، مثلاض تغییرات ذخیره بشن.یا مثلاض f3برای جستجو درفرمها و...
دوستان لطفاً راهنمایی بفرمایید.

Mahmood_M
دوشنبه 10 خرداد 1395, 20:54 عصر
راه ساده ش اینه که برای هر دکمه یک Action ایجاد کنید ( کامپوننت ActionList ) و به اون Action کلید میانبر دلخواه رو نسبت بدید
راه دیگه اینه که خاصیت KeyPreview مربوط به فرم رو True کنید و در رویداد OnKeyPress مربوط به فرم، کلید فشرده شده رو چک کنید و متناسب با اون عملیات مورد نظر رو انجام بدید
اگر قصد دارید کلیدها رو در سطح کل برنامه بررسی کنید، از کامپوننت TApplicationEvent استفاده کنید و در رویداد OnMessage این کامپوننت کلید ها رو چک کنید و عملیات مورد نظر رو انجام بدید
مثال :


procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if Msg.message = WM_KEYDOWN then
begin
case Msg.wParam of
VK_F1 : ...;
VK_F2 : ...;
VK_F3 : ...;
...
end;
end;
end;

یوسف زالی
سه شنبه 11 خرداد 1395, 01:07 صبح
یکی دیگه از راهها که دست شما رو برای تغییر موردی هم باز می گذاره استفاده از MasterForm هست.

amirkazem
چهارشنبه 12 خرداد 1395, 00:59 صبح
سلام، ضمن تشکرمجددازمدیران خوب بخش،
منظورازاینکه کلیدهای تابعی هم پوشانی نباشند این هست که درسرتاسر (تمامی فرمها) مثلاً کلید(f3) کار سرچ رو انجام بده.البته این برداشت من هست.

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

یوسف زالی
چهارشنبه 12 خرداد 1395, 01:55 صبح
یک راهش همون استفاده از ApplicationEvent هست البته روی فرم اصلی تون یا هر فرمی که از اول پروژه تا آخر اون حاضر باشه، مهم نیست نمایش داده می شه یا نه. مثلا روی دیتاماژول هم می تونید بگذارید.
راه بهتر استفاده از سیستم مسترفرم هست که همه فرم هاتون رو از یکی از فرم های پروژه مشتق کنید و در فرم والد رویداد ها رو کنترل کنید. به این ترتیب می تونید بعضی از فرم ها رو استثنا کنید یا رفتارش رو در قبال کلید مورد نظر تغییر بدید یا کلا آف کنید.

amirkazem
شنبه 15 خرداد 1395, 23:59 عصر
باسلام،
کدزیررابرای کلید(f1)درنظرگرفته ام ولی به درستی کارنمی کنه.دراصل بایدبره وآخرین رکوردراپیداکنه ویکی بهش اضافه کنه و(Adotable)رو (Insert)کنه ولی فقط آخرین رکورد رانمایش میده.
البته همین کدرابرای رویداد(On Click)همین باتن نوشته ام که به درستی آخرین رکوردرا میگیره ویکی بهش اضافه میکنه وجدول را(insert)میکنه. ممنون میشم اگه راهنمایی بفرمایید!



procedure TForm5.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);


//insert Record
var a:integer;
begin
if Msg.message = WM_KEYDOWN then
begin
case msg.wParam of
VK_F1:


begin
ADOTable1.Active :=true;
if ADOTable1.isempty then
ADOTable1.fieldbyname('code').asinteger := 1
else
begin
ADOTable1.last;
a := ADOTable1.fieldbyname('code').asinteger;
ADOTable1.insert;
ADOTable1.fieldbyname('code').asinteger := a + 1;

یوسف زالی
یک شنبه 16 خرداد 1395, 09:25 صبح
کدتون ایراد داره.
بعد از چک خالی بودن هنوز در مود اینسرت نرفتید دارید فیلد رو مقدار می دید.
از طرفی مطمئنید که پست رو هم گذاشتید؟
اگر بله، کد کامل رو بگذار بررسی کنم.

amirkazem
دوشنبه 17 خرداد 1395, 17:22 عصر
کدمربوط به (On Click) باتن:


procedure TForm5.BitBtn1Click(Sender: TObject);
var a:integer;
begin
ADOTable1.Active :=true;
if ADOTable1.isempty then
ADOTable1.fieldbyname('code').asinteger := 1
else
begin
ADOTable1.last;
a := ADOTable1.fieldbyname('code').asinteger;
ADOTable1.insert;
ADOTable1.fieldbyname('code').asinteger := a + 1;


BitBtn2.Enabled :=true;
DBEdit1.Enabled :=true;
DBEdit1.ReadOnly :=false;




DBEdit2.Enabled :=true;
DBEdit2.SetFocus ;
DBEdit3.Enabled :=true;
DBEdit4.Enabled :=true;
DBEdit5.Enabled :=true;
DBEdit6.Enabled :=true;
DBEdit7.Enabled :=true;
DBEdit8.Enabled :=true;
DBEdit9.Enabled :=true;
DBEdit10.Enabled :=true;


DBEdit2.ReadOnly :=false;
DBEdit3.ReadOnly :=false;
DBEdit4.ReadOnly :=false;
DBEdit5.ReadOnly :=false;
DBEdit6.ReadOnly :=false;
DBEdit7.ReadOnly :=false;
DBEdit8.ReadOnly :=false;
DBEdit9.ReadOnly :=false;
DBEdit10.ReadOnly :=false;


end;
end;





کدمربوط به کلید(F1)




procedure TForm5.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);


//insert Record
var a:integer;
begin
if Msg.message = WM_KEYDOWN then
begin
case msg.wParam of
VK_F1:


begin
ADOTable1.Active :=true;
ADOTable1.Insert;
if ADOTable1.isempty then
ADOTable1.fieldbyname('code').asinteger := 1
else
begin
ADOTable1.last;
a := ADOTable1.fieldbyname('code').asinteger;
ADOTable1.insert;
ADOTable1.fieldbyname('code').asinteger := a + 1;


BitBtn2.Enabled :=true;
DBEdit1.Enabled :=true;
DBEdit1.ReadOnly :=false;


DBEdit2.Enabled :=true;
DBEdit2.SetFocus ;
DBEdit3.Enabled :=true;
DBEdit4.Enabled :=true;
DBEdit5.Enabled :=true;
DBEdit6.Enabled :=true;
DBEdit7.Enabled :=true;
DBEdit8.Enabled :=true;
DBEdit9.Enabled :=true;
DBEdit10.Enabled :=true;


DBEdit2.ReadOnly :=false;
DBEdit3.ReadOnly :=false;
DBEdit4.ReadOnly :=false;
DBEdit5.ReadOnly :=false;
DBEdit6.ReadOnly :=false;
DBEdit7.ReadOnly :=false;
DBEdit8.ReadOnly :=false;
DBEdit9.ReadOnly :=false;
DBEdit10.ReadOnly :=false;






البته الان متوجه شدم، بااینکه 4مشتری توی جدول دارم، وبایدکدجدیدرااز5شروع کنه حتی باکلیک باتن هم میره وکدجدیدرا(3)نشون میده.

یوسف زالی
دوشنبه 17 خرداد 1395, 18:43 عصر
خروجی شما سورت شده؟
وقتی که اشکال پیش میاد در گرید مربوطه روی چه ردیفی قرار دارید؟ مثلا روی ردیف 4 هستید ولی به جای 5 عدد 3 پیشنهاد می شه؟

Mahmood_M
دوشنبه 17 خرداد 1395, 21:07 عصر
این مشکل به استفاده از Button یا کلیدهای F مربوط نمیشه
...
در کد اولی که قرار دادید، اگر جدول خالی باشه، چیزی درج نمیشه، چون بعد از شرط isEmpty جدول به حالت Insert نرفته، باید قبل از مقدار دهی به فیلد، جدول رو به حالت Insert یا Edit ببرید
در کد دوم، Insert رو بالای شرط قرار دادید، اگر شرط برقرار نباشه یعنی جدول خالی نباشه، دوباره به مد Insert میره و یا در حالتی که در Insert هست، دستور Last اجرا میشه، Insert باید درون شرط isEmpty قرار بگیره
مورد دیگه اینکه در کدهای بالا عمل Post انجام نمیشه
نکته مهم اینکه باید جدول رو بر اساس فیلد Code مرتب سازی صعودی کنید تا فیلد آخر بیشترین مقدار Code رو داشته باشه، مثال :

ADOTable1.IndexFieldNames = 'Code ASC'