PDA

View Full Version : سوال: دسترسی به فیلدهای سطر جاری dbgrid



NewLife2008
دوشنبه 27 آبان 1387, 11:49 صبح
با سلام
یه تاپیک زدم حذفش کردم چون راهی برای حل این مسله ارائه شده بود که درست هم بود اما باز هم مشکل من حل نمیشه باهاش.
من میخوام اطلاعات سطر جاری در DBGRID رو در edit هایی بریزم. چند راه حل ارائه شده:
1- در رویدادهای oncellclick و onkeyup کدهای مربوطه نوشته بشه که مشکلی که با این راه دارم اینه که اگه یه سطر توسط دستوری مثل locate انتخاب بشه اونوقت دیگه edit ها خالی خواهند ماند.
2. در رویداد afterscroll مربوط به adodataset کدهای مربوطه رو قرار بدیم که راه بسیار خوبیه ولی از اونجایی که ما معمولا تمام اشیایی که برای اتصال به بانک لازم داریم رو در datamodule قرار می دیم و فرم من نیز فرم اصلی برنامه نیست ، دسترسی به اشیای فرم در datamodule امکانپذیر نیست(یعنی اکسپشن میده)
ضمنا بنابه دلایلی نمیتونم از dbedit استفاده کنم.

تنها راهی که به ذهن من رسیده ، اینه که adodataset رو در فرم مربوط به خودش بذارم که در اون صورت مشکل حل میشه اما کار چندان جالبی نیست چون همه اشیا مربوط به اتصال بانک در datamodule هستند بجز این دیتا ست!!!!
اساتید محترم، آیا راه دیگه ای برای حل این مشکل وجود داره؟

yalameh
دوشنبه 27 آبان 1387, 12:32 عصر
یه راهش اینه که یه تابعی بنویسی که فیلدهای سطر جاری دی بی گرید را داخل ادیت باکسهای مختلف بریزه و هرجائی که احتمال میدی رکوردها عوض می شند اون تابع را فراخوانی کنی . مثل LOCATE , ONCELLCLICK و ... آخه تعداد این موارد محدوده .

NewLife2008
دوشنبه 27 آبان 1387, 13:48 عصر
دوست عزیز بسیار ممنونم.
واقعا بعضی اوقات اینقدر ذهن آدم درگیر میشه و مسله رو برای خودش بزرگ می کنه که از چنین راه حل ساده ای غافل می شه.
چند اشتباه کوچیک در برنامه داشتم که با یادآوری جنابعالی مشکل برطرف شد.

maisam57
دوشنبه 27 آبان 1387, 13:51 عصر
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
try
Edit1.Text:=Table1.FieldValues['firstname']
except
end;
end;

NewLife2008
دوشنبه 27 آبان 1387, 21:32 عصر
با حرکت اسکرول عمودی دی بی گرید یه سطری انتخاب میشه. حالا در چه رویدادی باید کد رو نوشت؟ در واقع وقتی داریم دی بی گرید رو با اسکرول بار پیمایش میکنیم ، چطور و در چه رویدادی عمل خود رو انجام بدیم؟؟

merced
دوشنبه 27 آبان 1387, 21:47 عصر
2. در رویداد afterscroll مربوط به adodataset کدهای مربوطه رو قرار بدیم که راه بسیار خوبیه ولی از اونجایی که ما معمولا تمام اشیایی که برای اتصال به بانک لازم داریم رو در datamodule قرار می دیم و فرم من نیز فرم اصلی برنامه نیست ، دسترسی به اشیای فرم در datamodule امکانپذیر نیست(یعنی اکسپشن میده)
ضمنا بنابه دلایلی نمیتونم از dbedit استفاده کنم.



شما بايد DataModule رو قبل از همه فرمها Create کني . توي poroject-> View Source‌مي توني ترتيب لود شدن فرم ها رو عوض کني

SYNDROME
سه شنبه 28 آبان 1387, 06:31 صبح
2. در رویداد afterscroll مربوط به adodataset کدهای مربوطه رو قرار بدیم که راه بسیار خوبیه ولی از اونجایی که ما معمولا تمام اشیایی که برای اتصال به بانک لازم داریم رو در datamodule قرار می دیم و فرم من نیز فرم اصلی برنامه نیست ، دسترسی به اشیای فرم در datamodule امکانپذیر نیست(یعنی اکسپشن میده)

بهترین راه حل همین است.(AfterScroll)
حالا فقط باید بر روی آن درست مدیریت را اعمال کنی تا در مواقعی که فرمتان Create نشده و . . . عمل مقدار دهی انجام نشود چون Error می دهد.
موفق باشید

mafazel
سه شنبه 28 آبان 1387, 07:14 صبح
با سلام خدمت دوستان
پاسخ همه دوستان درسته ولی من از یه زاویه دیگه نگاه می کنم


من میخوام اطلاعات سطر جاری در DBGRID رو در edit هایی بریزم.

بنظر من این کار اصلا کار درستی نیست چرا شما اطلاعات رو یکبار در DBGrid و توی همون فرم یکبار هم در Edit ها نشون میدید؟ این کار 2 تا عیب داره: یکی اینکه جای زیادی رو در صفحه الکی اشغال می کنه دوم اینکه برنامه شما رو کند می کنه. شاید این کار رو میکنید که لازم نباشه کاربر اسکرول افقی برای دیدن همه آیتمهای DBGrid انجام بده، اما حتما در خیلی از موارد کاربر لازم نداره اطلاعات همه رکوردها رو ببینه اما مجبوره OverLoad ش رو تحمل کنه.
بنابراین پیشنهاد میکنم یک دکمه مثلا با عنوان "جزئیات" بگذارید و با زدن اون یه فرم دیگه باز بشه و اطلاعات اون ردیف DBGrid رو توی اون فرم توی Edit ها بگذارید(توی OnCreate اون فرم Edit ها رو مقداردهی کنید و با دکمه تایید اطلاعات رو ذخیره و با دکمه انصراف تغییرات را لغو کنید) اینجوری دیگه مشکل اسکرول و Locate و ... رو ندارید. دابل کلیک DBGrid رو هم معادل زدن همین دکمه بگذارید
در مورد سوال دومتون هم فرم اصلی و فرم DataModule رو AutoCreate کنید ولی بقیه رو دستی Create و Free کنید.

NewLife2008
سه شنبه 28 آبان 1387, 07:50 صبح
با سلام و تشکر از همه دوستان

شما بايد DataModule رو قبل از همه فرمها Create کني . توي poroject-> View Source‌مي توني ترتيب لود شدن فرم ها رو عوض کني
دوست عزیز همین کارو انجام میدم (در واقع ترتیب اجرای فرمها همینطور هستش)، اما مشکل اینه که در Dtamodule ، اگر در رویداد afterscroll یک Adodataset بخوام به اجزای فرمم دسترسی داشته باشم چون هنوز اون فرم creat نشده نمی شه بهش دسترسی داشت و exeption میده. که جناب SyNDROME راهش رو فرمودند.

بهترین راه حل همین است.(AfterScroll)
حالا فقط باید بر روی آن درست مدیریت را اعمال کنی تا در مواقعی که فرمتان Create نشده و . . . عمل مقدار دهی انجام نشود چون Error می دهد
فقط نمیدونم این مدیریت به چه صورت هستش!!؟؟؟ اگه ممکنه در این مورد راهنمایی کنید.

بنظر من این کار اصلا کار درستی نیست چرا شما اطلاعات رو یکبار در DBGrid و توی همون فرم یکبار هم در Edit ها نشون میدید؟ این کار 2 تا عیب داره: یکی اینکه جای زیادی رو در صفحه الکی اشغال می کنه دوم اینکه برنامه شما رو کند می کنه. شاید این کار رو میکنید که لازم نباشه کاربر اسکرول افقی برای دیدن همه آیتمهای DBGrid انجام بده، اما حتما در خیلی از موارد کاربر لازم نداره اطلاعات همه رکوردها رو ببینه اما مجبوره OverLoad ش رو تحمل کنه.

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

در مورد سوال دومتون هم فرم اصلی و فرم DataModule رو AutoCreate کنید ولی بقیه رو دستی Create و Free کنید.
راستش نحوه Autocreat رو نمیدونم:خجالت:

mafazel
سه شنبه 28 آبان 1387, 08:29 صبح
سلام . در مورد Auto Createدوستان توضیح دادند ولی برای توضیح بیشتر یه تصویر میذارم.
از منوی Project -> Options تنظیمات مربوط به پروژه رو ببینید

merced
سه شنبه 28 آبان 1387, 11:25 صبح
دوست عزیز همین کارو انجام میدم (در واقع ترتیب اجرای فرمها همینطور هستش)، اما مشکل اینه که در Dtamodule ، اگر در رویداد afterscroll یک Adodataset بخوام به اجزای فرمم دسترسی داشته باشم چون هنوز اون فرم creat نشده نمی شه بهش دسترسی داشت و exeption میده. که جناب SyNDROME راهش رو فرمودند.

فقط نمیدونم این مدیریت به چه صورت هستش!!؟؟؟ اگه ممکنه در این مورد راهنمایی کنید.
:

به راحتي
توي afterscroll



if (form1 <> nil ) and (form1.visible) then
..........

SYNDROME
سه شنبه 28 آبان 1387, 13:49 عصر
فقط نمیدونم این مدیریت به چه صورت هستش!!؟؟؟ اگه ممکنه در این مورد راهنمایی کنید.

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

NewLife2008
سه شنبه 28 آبان 1387, 14:04 عصر
باتشکر فراوان از راهنماییهای ارزشمند دوستان ، مشکل حل شد.
من از این راه رفتم

به راحتي
توي afterscroll

کد:
if (form1 <> nil ) and (form1.visible) then ..........

mojtaba5938
چهارشنبه 29 آبان 1387, 11:47 صبح
سلام دوستان، برای خالی کردن محتویات dbgrid چه باید کرد؟
مثلا برای خالی کردن ادیت باکس این دستور رو می نویسیم: ;''=:edit1.text
برای dbgrid چی باید بنویسم؟

merced
چهارشنبه 29 آبان 1387, 16:48 عصر
DBGrid شما به يه Dataset متصل هست و براي خالي کردن DBGrid بايد ديتاست رو خالي کني.
مثلاً يا رکورد رو حذف کني و يا فيلد رو ويرايش کني


Table1.Edit ;
Table1.Feildsbyname('Fildname').asString := '' ;
Table1.Post ;


براي اينکه DBGrid به هيچي جا وصل نباشه


DBGrid1.Datasource := nil