PDA

View Full Version : سوال: پیمایش خانه های دی بی گرید(ِِDbgrid) با دکمه Enter



delphiprog3000
یک شنبه 18 اسفند 1392, 11:48 صبح
با سلام خدمت دوستان واساتید محترم.
بنده چندی پیش با یک مسئله برخوردم که:
1-یک فرم داریم که میخوایم اطلاعات توسط دی بی گرید وارد دیتابیس شود.و میخواهیم مستقیم وارد سلولهای دی بی گرید شویم.و از سطر اول و ستون اول شروع به وارد کردن اطلاعات کنیم و سپس با دکمه اینتر به سلول بعدی دی بی گرید شویم و باز اطلاعات وارد کنیم تا همین روند ادامه پیدا کند که به انتهای سلول دی بی گرید برسیم.و همینکه به آخرین سلول رسید متوجه شود و با زدن اینتر به سطر بعد در پایین برود.یعنی یک رکورد جدید ایجاد کند. (Append)
2-بنده برای پیمایش خانه خانه دی بی گرید قطعه کدی در رویداد onkeypress دی بی گرید نوشتم که عمل پیمایش خانه به خانه آن را انجام میدهد. که قطعه کد اینه :



if (key=#13) then
begin
SelectNext(ActiveControl,true,true);
end;


3- حالا مشکل بنده اینه که به آخر که میرسه نمیره رکورد بعد آیا باید بعد این کد کدی بنویسم من حتی این کد رو هم امتحان کردم:



if (key=#13) then
begin
SelectNext(ActiveControl,true,true);
if DBAdvGrid2.Fields[4].Tag=4 then
begin
rowcount:=DBAdvGrid2.RowCount+1;
colcount:=DBAdvGrid2.ColCount;
DBAdvGrid2.Enabled:=true;
DBAdvGrid2.Row:=rowcount;
DBAdvGrid2.Col:=colcount ;
end;


یعنی ببین رسیدی به آخرین سلول و شماره تگش هم 4 بعد برو ردیف بعد حتی این قطعه کد رو هم به انتهای این کد بالا اضافه کردم اما باز اونی که میخواستم نشد یعنی کده عمل نکرد که بفهمه به انتها سلول دی بی گرید رسیده



{ datamodule1.qry_tbl_customers.Active:=true;
datamodule1.qry_tbl_customers.Append;


در ضمن قطعه کد دکمه جدید هم اینه که اجازه میده ما دسترسی به دی بی گرید و سلولهاش پیدا کنیم و ورود اطلاعات رو انجام بدیم:


with DataModule1.qry_tbl_customers do
begin
DBAdvGrid2.Enabled:=true;
DBAdvGrid2.Row:=1;
DBAdvGrid2.Col:=2;
DBAdvGrid2.SetFocus;
Active:=true;
Append;
end;


حالا بنده لینک عکس از صفحه برنامه رو هم میزارم که ببینید منظور بنده چیه لطفا پیگیری انجام دهید با تشکر....
https://www.dropbox.com/s/1vd0reusz8l0q0p/4.JPG

delphiprog3000
یک شنبه 18 اسفند 1392, 13:46 عصر
با سلام ببنید منظور بنده اینه که مثل این لینکی که قرار میدم اطلاعات با زدن اینتر هر خونه به خونه جلو بره در دی بی گرید و در انتها بره سطر بعدی در پایین ایجاد کنه و باز بتوان اطلاعات را وارد کرد و با اینتر پیش رفت.لطفا این عکس را ببنید. با تشکر.....
https://www.dropbox.com/s/7eemnygtbwyb5nu/5.JPG

zman123456
یک شنبه 18 اسفند 1392, 14:11 عصر
سلام
چرخ ساخته شده رو از دوباره نمی سازن.تو همین سایت بگرد کدهای حرفه ای زیادی هست.من وقتشو ندارم پیدا کنم براتون.زحمتش با خودتون

delphiprog3000
یک شنبه 18 اسفند 1392, 21:04 عصر
سلام
چرخ ساخته شده رو از دوباره نمی سازن.تو همین سایت بگرد کدهای حرفه ای زیادی هست.من وقتشو ندارم پیدا کنم براتون.زحمتش با خودتون

با سلام دوست من بنده کاربر جدید نیستم که قوانین ندونم زیاد گشتم با این عنوان نبود.اگه بود تاپیک نمی ساختم.

لطفا اگه دوستان راهی میدونن مطرح کنن تا همه استفاده کنن.

یوسف زالی
یک شنبه 18 اسفند 1392, 21:55 عصر
سلام.
معمولا در دی بی گرید سطر و ستون رو اضافه نمی کنند، برعکس استرینگ گرید، برای این کار باید از دیتاست متصل به اون استفاده کنید.
مثلا برای اضافه کردن یک سطر کافیه که دیتاست مربوطه رو insert کنید. باقی ماجرا هم روشنه.
موفق باشید.

delphiprog3000
یک شنبه 18 اسفند 1392, 22:17 عصر
سلام.
معمولا در دی بی گرید سطر و ستون رو اضافه نمی کنند، برعکس استرینگ گرید، برای این کار باید از دیتاست متصل به اون استفاده کنید.
مثلا برای اضافه کردن یک سطر کافیه که دیتاست مربوطه رو insert کنید. باقی ماجرا هم روشنه.
موفق باشید.

با تشکر از پاسخ شما اما جواب سوال من نیست من توضیح دادم که بجای insert که از بالا به جدول اضافه میکنه من append کردم یعنی از پایین اضافه میکنه یک سطر به جدول دی بی گرید ما.

همونطور که توضیح دادم اینجور که میگید روشنه لطفا مثال بزنید. من توضیحات کامل دادم حتی نحوه پیمایش خانه به خانه رو هم گفتم فقط تنها گیر اینه که بفهمه به آخرین tag از فیلدهای دی بی گرید رسیده بره append کنه از طریق کانکشن دی بی گرید.
همونطور که میدونید فیلدهای دی بی گرید هر کدوم یه تگ داره. من به ترتیب به همه فیلدها تگ از 0 تا 3 رو دادم.و در قطعه کد دکمه جدید نوشتم که وارد دیبی گرید بشه از سطر اول ستون دوم و اون فطعه کد که در رویداد کی پرس دیبی گرید که میبره جلو با زدن دکمه اینتر تا به آخرین فیلد تا اینجا همه چی اوکی .اما اما اون آخر باید بفهمه که به آخرین فیلد رسیده و بره سطر بعد رو ایجاد کنه که بتونیم باز اطلاعات وارد کنیم.

این مورد رو دقیقا در یک برنامه ساخته شده به عینه دیدم که این روند انجام میشد. امیدوارم اینجا کسی اینکارو کرده باشه و متوجه بشه من چی میگم.
بنده واضح و کامل مثال زدم و مشکل رو توجیح کردم.امیدوارم دوستان و اساتید با کد راهنمایی کنن نه راهنمایی اجمالی که خودم هم اطلاع دارم. با تشکر....

یوسف زالی
یک شنبه 18 اسفند 1392, 22:49 عصر
ببینید، insert کردن بستگی به جایگاهش داره، استفاده از tag هم خوب نیست.
به هر جهت نمونه کد براتون می گذارم، فکر می کنم هم راحت تر باشه هم کار شما رو راه می ندازه.


procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_RETURN then
DBGrid1.Perform(WM_KEYDOWN, VK_TAB, 0)
end;

delphiprog3000
یک شنبه 18 اسفند 1392, 22:56 عصر
ببینید، insert کردن بستگی به جایگاهش داره، استفاده از tag هم خوب نیست.
به هر جهت نمونه کد براتون می گذارم، فکر می کنم هم راحت تر باشه هم کار شما رو راه می ندازه.


procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_RETURN then
DBGrid1.Perform(WM_KEYDOWN, VK_TAB, 0)
end;




با تشکر امیدوارم متوجه منظور من شده باشی عزیز.این کد با این توصیفاتی که کردم چکار برای ما انجام میتونه بده شبیه همون پیمایش اینو یه توضیح بدید.

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

ممنون

یوسف زالی
یک شنبه 18 اسفند 1392, 23:08 عصر
این قدر می گید "متوجه شدید" که آدم به خودش شک می کنه!
دوست گل من این کد رو تست کن متوجه می شی.
این کد با زدن دکمه اینتر به ستون بعدی می ره و در انتها هم یک ردیف ایجاد می کنه می پره توش

delphiprog3000
یک شنبه 18 اسفند 1392, 23:37 عصر
این قدر می گید "متوجه شدید" که آدم به خودش شک می کنه!
دوست گل من این کد رو تست کن متوجه می شی.
این کد با زدن دکمه اینتر به ستون بعدی می ره و در انتها هم یک ردیف ایجاد می کنه می پره توش

با سلام ممنون مدیر جان.چرا بهتون برخورد من که نگفتم خدای ناکرده نمیفهمید گفتم متوجه منظورم شدید چون همه چی رو کامل توضیح دادم.

دوست من این کد شما مطابق همون کدی که خودم تعریف کردم. اما میدونی چیه مشکل اینه رکورد جدید ایجاد نمیکنه بر میگرده به همون رکورد اولی خودش یعنی باید به قول شما یه رکورد جدید ایجاد کنه نمیکنه

مثل این کد عمل میکنه :

if (key=#13) then
begin
SelectNext(ActiveControl,true,true);
end;





مهندس جان من فردا باز یه کارایی میکنم ببینم میتونم راه حلی پیدا شه اما شما هم توفکر باشید فردا به نتیجه ای میرسونیمش با کمک هم

ازت ممنونم برادر و بقیه دوستانم.

یوسف زالی
دوشنبه 19 اسفند 1392, 00:00 صبح
من روی سیستم خودم با گرید استاندارد تست گرفتم اوکی بود.
البته باید ردیف جاری شما ردیف آخر باشه. اگر نه، یکم کار داره. شما ادامه بده نشد باز سمپل می دم.
موفق باشید.

delphiprog3000
دوشنبه 19 اسفند 1392, 08:20 صبح
با سلام سعی کردم.اما نشد.ببینید فیلد ردیف از نوع Calculated بود. اما باز برش گردوندم به همون Auto number اما بازم افتاده تو loop و رکورد جدید ایجاد نمیشه باز بر میگرده به اولین رکورد ایجاد شده.
لطفا کدی برای شناسایی به انتها رسیدن فیلدها ارسال کنید که خودش بره رکورد بعد رو ایجاد کنه

zman123456
دوشنبه 19 اسفند 1392, 11:25 صبح
من هیچ وقت به خاطر مسائل تکنیکی از ورود اطلاعات در گرید استفاده نکردم و فقط یکبار برای امتحان تست کردم.به خاطر همین الان چیز زیادی یادم نیست.ولی نوع کانکشن به دیتاستت رو چک کن.
منم هیچ کجا نگفتم شما عضو جدید هستید.من اینی که میگم تستی این کار رو کردم رو از همین سایت یاد گرفتم

delphiprog3000
دوشنبه 19 اسفند 1392, 11:51 صبح
من هیچ وقت به خاطر مسائل تکنیکی از ورود اطلاعات در گرید استفاده نکردم و فقط یکبار برای امتحان تست کردم.به خاطر همین الان چیز زیادی یادم نیست.ولی نوع کانکشن به دیتاستت رو چک کن. منم هیچ کجا نگفتم شما عضو جدید هستید.من اینی که میگم تستی این کار رو کردم رو از همین سایت یاد گرفتم با سلام بنده جسارت به شما نکردم دوست گرامی.شما همیشه لطف داری. میدونمم این کار اصولی نیست چون اکسس هم میتونه همینکارو بکنه.ونیازی به برنامه نویس نیست. اما این درخواست مشتریست که میخواد برای راحتی کار مشتریانش سریع اطلاعات در جدول وارد کنه و با اینتر بره جلو تا جدول به انتها برسه بعد از این بره رکورد بعد و سند بعدی زده بشه.ودر آخر ذخیره اطلاعات صورت بگیره. متاسفانه نمونه همین کار رو تو یکی از برنامه هاش داره و به این موضوع فوکوس کرده.حال اگر دوستان و اساتید راهی مد نظرشون هست مطرح کنن تا تست کنیم و هم بنده وسایرین بهره مند شویم. با تشکرات فراوان ار همه صاحب نظران.......

یوسف زالی
دوشنبه 19 اسفند 1392, 12:12 عصر
نکنه Option گرید شما dgEditing نداره؟
یا مثلا RowSelect هست؟
یک نمونه برنامه کوچیک بذارید بررسی کنم. همه چیز رو استاندارد بگیرید و از کامپوننت های اضافی درش نگذارید.

delphiprog3000
دوشنبه 19 اسفند 1392, 12:30 عصر
نکنه Option گرید شما dgEditing نداره؟ یا مثلا RowSelect هست؟ یک نمونه برنامه کوچیک بذارید بررسی کنم. همه چیز رو استاندارد بگیرید و از کامپوننت های اضافی درش نگذارید. با سلام خدمت استاد عزیزم عرض کنم که با dbadvgrid از سری کامپوننت tms کار میکنم. بله این option هارو داره goediting فعاله اما rowselect که اعمال میشه دیگه امکان goediting خنثی میشه و نمیشه دیتا وارد کرد. نظر شما چیه با گرید خود دلفی کار نمیکنم البته این موضوع ربطی به کامپوننت نباد داشته باشه.اگر شما tms رو دارید یک پروژه کوچیک ارسال کنم نمونه کد ببینید. البته روی دیبی گرید معمولی دلفی هم الان تست میکنم اما میدونم تقاوت نداره.

delphiprog3000
دوشنبه 19 اسفند 1392, 12:50 عصر
در ضمن با گرید معمولی دلفی هم تست کردم اول که امکانات این tms رو نداره بعد هم اون کد اولی خودم رو توی کی پرس تعریف کردم نفهمید داستان چیه. کد شمارو هم توی کی داونش کپی کردم و اینتر زدم ارور AV داد. متاسفانه کار ما لنگه.پس من کامپوننت tms رو آپ میکنم و نمونه ای هم از پروژه میزارم شما قبل باید tms رو کامپایل کنید کنید و فایلهاش رو در لایبرری دلفی اضافه کنید. البته نسخه من دلفی 2010 هست. اگه میفرمایید و همخونی داره ورژن شما قرار بدم اما خیلی عجیب بازم دنبالش هستم.اما بازم راهکاری دارید عرض نمایید با سپاس...

یوسف زالی
دوشنبه 19 اسفند 1392, 13:05 عصر
بیایید در خصوصی تیم ویوور بدید ریموت می شم می بینم.
البته نسخش رو هم بگید.
می تونید برام اس ام اس کنید، شماره من در پروفایل من هست.

delphiprog3000
دوشنبه 19 اسفند 1392, 20:54 عصر
بیایید در خصوصی تیم ویوور بدید ریموت می شم می بینم.
البته نسخش رو هم بگید.
می تونید برام اس ام اس کنید، شماره من در پروفایل من هست.

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

delphiprog3000
شنبه 24 اسفند 1392, 11:28 صبح
با سلام خوشبختانه با کمک جناب مهندس زالی مدیریت بخش مشکل حل شد.

این قطعه کد می بایست در onkeydown دی بی گرید نوشته شه تا پیمایش ما کامل شود.



case Key of
VK_RETURN:
begin
if DBAdvGrid2.Col = DBAdvGrid2.ColCount -1 then
Button2.OnClick(Sender)
else
Key := VK_TAB;
end;
// VK_ESCAPE: btn_cancel.OnClick(Sender);
end;




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

با تشکر از حمایت همه دوستان خصوصا مهندس زالی با اخلاق پهلوانانشون.

مشکل به کلی رفع گردید......