الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إظهار الحقول من نوع TEXT داخل TBGrid في Lazarus

بدأه a.atalla في 3 مارس 2013 · 2 رد · 1,482 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

كنت  أعمل علي قاعدة بيانات SQLite3   تحتوي علي حقول  من نوع TEXT  وعندما أردت أن أعرض هذه الحقول في جدول علي الفورم  TBGrid  فوجئت بأن الحقول TEXT   لا تظهر بشكل صحيح ولكن يظهر مكانها (MEMO)  كما يظهر بالصورة

 

tbgrid.png

 

 

بعد قليل من البحث وجدت حلا رائعا في منتديات lazarus  وهو كود يقوم بالغاء الرسم التلقائي  للـ Fields ورسمها عن طريق الكود لإظهار البيانات النصية , لتطبيق هذا الحل  اتبع الخطوات التالية :

  • حدد الـ TBGrid ثم من object inspector  غير قيمة الخاصية  DefaultDrawing  من true إلي false .
  • انتقل إلي لسان events  في object inspector واختر الحدث onDrawColumnCell  , سينقلك إلي محرر الكود  أضف الكود التالي
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
    DataCol: Integer; Column: TColumn; State: TGridDrawState);
// Draw memo text instead of (Memo), draw other text as usual.
 
// Note: normally, grid DefaultDrawing property must be off to avoid duplicate drawing
// However, we need it on against bug 21496
// This will result in duplicate drawing but should work.
 
{
Basically copied the existing DefaultDrawColumnCell procedure
but tested for memo first. If no memo, pass on to default procedure.
Maybe slower, more complicated, but it allows for changes in the
core Lazarus DefaultDrawColumnCell procedure.
Thanks to User137 & ludob on the Lazarus forum
}
var
  //determine if we're going to override normal Lazarus draw routines
  OverrideDraw: boolean;
  OurDisplayString: string;
  CurrentField: TField;
  DataRow: Integer;
begin
  OverrideDraw:=false;
 
  // Make sure selected cells are highlighted
  if (gdSelected in State) then
  begin
    (Sender as TDBGrid).Canvas.Brush.Color := clHighlight;
  end
  else
  begin
    (Sender as TDBGrid).Canvas.Brush.Color := (Sender as TDBGrid).Color;
  end;
 
  // Draw background in any case - thanks to ludob on the forum:
  (Sender as TDBGrid).Canvas.FillRect(Rect);
 
  //Foreground
  try
    CurrentField := Column.Field;
    if CurrentField.DataType = ftMemo then
    begin
      OverrideDraw:=true;
    end;
  except
    on E: exception do
    begin
      // We might have an inactive datalink or whatever,
      // in that case, pass on our problems to the LCL
      OverrideDraw:=false;
    end;
  end;
 
  //Exception: fixed header should always be drawn like normal:
  // this never gets picked up as OnDrawColumnCell apparently only deals with data cells!!!
  if (gdFixed in State) then
  begin
    OverrideDraw:=false;
  end;
 
  if OverrideDraw=false then
  begin
    // Call normal procedure to handle drawing for us.
    (Sender as TDBGrid).DefaultDrawColumnCell(Rect,DataCol,Column,State);
  end
  else
  begin
    // Get to work displaying our memo contents
    // Basically shamelessly ripped from
    // DefaultDrawColumnCell
    OurDisplayString := '';
    if CurrentField<>nil then
    begin
      //DO display memo  OurDisplayString is string to be displayed
      try
        OurDisplayString := CurrentField.AsString; //DisplayText will only show (Memo)
      except
        // Ignore errors; use empty string as specified above
      end;
    end;
    //Actual foreground drawing, taken from Grids.DrawCellText coding:
    (Sender as TDBGrid).Canvas.TextRect(Rect,Rect.Left,Rect.Top, OurDisplayString);
  end;
  end;

اﻵن عند تشغيل التطبيق ستجد ان الحقول تظهر بشكل طبيعي

 

tbgrid1.png

 

 

يمكنك متابعة النقاش حول هذه المشكلة هنا

 

الموضوع علي مدونتي   هنا

#2

شكرا لك على الفائدة ويسرني كثيرا أن أرى أحد مستخدمي لازاريس

أحب أن ترى هذا الموضوع وتصوت عليه للفائدة العامة

ضع طلبك هنا لفتح فرع جديد ل lazarus

vVIfFr.gif

مدونتي



إذا رأيتموني غبت فأطلت الغياب فربما أكون قد انتقلت عن الدنيا إلى الآخرة

فما أحوجني إلى دعوة صالحة من أخ لي كريم

 

http://www.tvquran.com/

 

LoGeCom

أول برنامج عربي للمحاسبة والتجارة وإدراة المخازن يعمل على اللينكس والماك والويندوز 

#3

السلام عليكم...

 

عادةً ما نستعمل الإجراء OnDrawColumnCell لإظهار تأثيرات خاصة في الـ DBGrid مثل تلوين نص معين أو خلايا معينة حسب قيم محددة في الـ DataSet المرتبطة، أو حتى رسم صورة داخل الخلية... إلخ.

 

أما لإظهار محتويات حقل من النوع Text أو Memo فلا داعي لكل ذلك الكود! (الذي يستهلك جزءاً من موارد البرنامج، فلا ننس أن الإجراء OnDrawColumnCell يتم استدعاؤه لكل خلية تحتاج إلى إعادة رسم). و يكفي لذلك سطر واحد من الكود فقط (أنا أتحدث من جانب دلفي، و يبدو لي أن الأمر نفسه موجود في لازاروس بعد اطلاعي على الكود المشار إليه). بالإضافة إلى أن ميزة هذه الطريقة (سطر الكود المذكور أدناه) أنه غير مرتبط باسم حقل محدد و بالتالي يمكن ربط أكثر من حقل Memo واحد بنفس الكود، سواءً أثناء التصميم أو أثناء التشغيل.

 

* انقر نقراً مزدوجاً على الـ Dataset لإدراج الحقول (أنا أستعمل مكونات الـ ADO مثل ADOQuery أو ADOTable و الأمر نفسه ينطبق على مكونات BDE).

* حدد الحقل الذي من نوع Text أو Memo.

* في نافذة الخصائص بدل إلى مجموعة الأحداث (Events).

* انقر نقراً مزدوجاً أمام الحدث OnGetText لذلك الحقل.

* اكتب السطر التالي:

if Sender.IsNull then Text := '' else Text := Sender.AsString;

* انتهبنا. ذلك كل شيء !

 

*** و إذا كنا نتعامل مع الـ Datasets بشكل ديناميكي (لم نقم بإدراج الحقول أثناء التصميم) فإننا نقوم بتعريف إجراء من أجل الحدث OnGetText و نربطه بالحقل أثناء التشغيل (بالكود):

1. في القسم private أو public للـ Form نضع تصريح الإجراء. مثلاً:

procedure MemoFieldGetText(Sender: TField; var Text: string; DisplayText: Boolean);

2. في قسم الـ interface نكتب تعريف الإجراء و به السطر الذي ذكرناه سابقاً:

procedure TForm1.MemoFieldGetText(Sender: TField; var Text: string; DisplayText: Boolean);
begin
    if Sender.IsNull then Text := '' else Text := Sender.AsString;
end;

3. نربط الحقل المطلوب بالإجراء السابق بعد فتح الـ Dataset (حتى يتم تعريف الحقول):

    ADOQuery1.Open;
    ADOQuery1.FieldByName('memo_field_name').OnGetText := MemoFieldGetText;

حيث memo_field_name اسم الحقل في قاعدة البيانات.

 

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

مواضيع مشابهة