نمایش و ویرایش فیلدهای Memo در DBGrid
با سلام خدمت برنامه نویسان محترم

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

سوال : چگونه می توان متن مربوط به فیلدی که از نوع Memo است را در DBGrid نشان داد و ویرایش کرد؟

در حالت عادی چنین کاری صورت نمی گیرد اما غیر ممکن هم نیست! برای دستیابی به این هدف مراحل زیر را دنبال کنید:

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

Text ( 12 ) 
Name

Text ( 12 ) 
Fam

Memo 
Address


و نیز برنامه ما متشکل از یک فرم Form1 یک adoTable1 یک DataSource1 و یک DBGrid1 می باشد که پس از نتظیم رشته اتصال ( AdoTabel1.ConnectionString ) بر روی آن جدول دابل کلیک کرده و تمام فیلدهای آنرا اضافه کردیم.

گام اول: نمایش فیلد در DBGrid

روی Tabel یا Queryمورد نظر دابل کلیک کرده و سپس فیلد مورد نظر را که از نوع Memo است را انتخاب کنید اکنون به قسمت Event ها رفته و مقابل رویداد OnGetText دابل کلیک کنید و سپس کد زیر را وارد کنید

procedure TForm1.ADOTable1AddressGetText(Sender: TField; var Text: string;

  DisplayText: Boolean);

begin

  Text := Copy( ADOTable1Address.AsString,1,50 )

end;

به همین سادگی حال برنامه را اجرا کنید و از نتیجه لذت ببرید. اما اگر سعی کنید که اطلاعات را ویرایش کنید با پیغام خطا مواجه خواهید شد پس ویرایش نکنید و به جای آن گام دوم را بخوانید...

گام دوم ویرایش فیلد

برای اینکار کمی بیشتر بایستی کار کنیم، جهت ویرایش اینگونه فیلدها نمی توان درون DBGrid این کار را انجام داد پس یک فرم کوچک و جمع و جور برای این منظور ایجاد می کینم، لطفا یک فرم جدید به برنامه اضافه کنید و بعد بر روی آن فرم یک شئ Memo قرار دهید و خصوصیت Align آن را بر روی alClient تنظیم کنید تا به اندازه کل فرم بسط پیدا کند.

خُب تا اینجا کافیست حال به فرم اصلی که حاوی DBGrid هست برگشته و DBGrid1 را انتخاب کنید و سپس در مقابل رویداد KeyDown دابل کلیک کرده و کد زیر را بنویسید:

procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;

  Shift: TShiftState);

begin

  If key = VK_RETURN then begin

  if DBGrid1.SelectedField = ADOTable1Address then

  with Form2 do

  begin

  Memo1.Text := ADOTable1Address.AsString;

  Form2.ShowModal;

  ADOTable1.Edit;

  ADOTable1Address.AsString := Memo1.Text;

  end;

  end;

end;

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

بیشتر بدانیم:

در گام اول رویداد OnGetTextبه کار رفته است. این رویداد زمانی اتفاق می افتاد که جدول می خواهد اطلاعات مربوط به رکوردها را دریافت کند و فیلد مربوطه متن خود را بدست آورد. خب این بهترین فرصتی است که ما می توانیم برای نمایش متن تصمیم بگیریم و آنرا به متن دیگری تغییر بدهیم که برای انجام این کار بایستی متن جدید را به متغیر Text بدهیم برای مثال اگر ما این مقدار را تایپ کنیم Text := 'FaraNet'; در آنصورت تا همیشه مقدار FaraNet را به کنترلها می فرستد و فقط این عبارت را خواهیم دید اما این عبارت فقط جنبه صوری دارد و بر محتوای اصلی فیلد اثری ندارد، خب در این تمرین ما با استفاده از تابع Copy از فیلد اصلی به مقدار 50 کاراکتر برداشتیم و به متغیر Text واگذار کردیم تا آنرا نمایش دهد شما می توانید مقدار 50 را کم یا زیاد کنید.

در گام دوم می دانید که رویداد OnKeyDown موقعی اتفاق می افتاد که دکمه ای از روی صفحه کلید فشرده شود در این هنگام کد آن توسط متغیر Key قابل دسترسی هست، خب چون ما تصمیم داشتیم که ویرایش را با کلیک اینتر فعال کنیم برای همین در شرط از مقدار VK_RETURN تعریف شده در دلفی که بیانگر کلید Enter و معال کد 13 می باشد استفاده کردیم البته می توانستیم از کد 13 نیز استفاده کنیم و اما شرط دوم بسیار مهم است چون ما در این شرط بررسی کردیم که اگر فیلد فعال همان فیلد مورد نظرمان است در آن صورت Form2 که مربوط به ویرایش است را فراخوانی کند در غیر اینصورت چنانچه ما از این شرط استفاده نمی کردیم در آنصورت با فشردن اینتر بر روی هر فیلدی در DBGrid فرم مربوط به ویرایش فیلد آدرس ظاهر می شد و این مطلب برای مشتری ناخوشایند می باشد.در ادامه مراحل هم که مشاده می فرمائید مقدار فعلی فیلد را ابتدا به شئ Memo مربط به فرم دوم ارسال کردیم و بعد آن فرم را ظاهر کردیم تا پس اطلاعات ویرایش شوند و بعد از بستن فرم دوم حتما قرار دادن جدول در حالت ویرایش الزامی می باشد تا مقدار جدید را بپذیرد در غیر اینصورت با خطای عدم درج و ویرایش مواجه می شدیم....

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