اذا اردت ان تشتغل بسرعة ينبغي تفادي تثبيت المكونات في كل مرة تقوم بتحديثات دع هذه العملية عندما يصبح المكون جاهز...
الفكرة بسيطة ..بدل اعطاء المكون الجديد اسم اخر يجب الاحتفاظ بنفس الاسم اي TDBGrid ثم ضع اسم الوحدة unit التي تحتويه اي NewDBGrid في اخر ال uses في ملف المشروع الذي تعمل عليه
في هذه الحالة سيتم استعمال المكون الجديد على كل DBGrid التي على الفورم
التحديثات تظهر عند تشغيل ..
لوحدة...
بالنسبة لل TEdit لاحظت انت حذفت inherited الذي كان في الدالة WMSize يجب ارجاعه لان هذه دالة message و تعمل نوعا ما مثل الدلة مورثة virtuel لهذا ينغي عدم نسيان inherited لاعادة ارسال الى ancestor الذي يتعامل مع هذه الرسالة ...
انشاء TEdit بخاصية multilines قد يصبح يقبل النص متعدد الاسطر و يقبل الضغط على ال entry لانشاء سطر جديد ...اذا يجب اخذ هذ الامور بعين الاعتبار لمعالجتها فيما بعد..
اظن انه ابقاء DefaultRowHeight بنفس الاسم الاصلي و هي ليس نفس ال property هذا تظليل و هي لا تقوم بنفس العمل لان DBGrid محتواه متعلق بقاعدة البيانات اي عدد الاسطر و ليس باي Data يحتويها مثل TStringGrid و الذي يمكن التحكم بارتفاع كل سطر على حدة
كما سبق و ان قلت الكود تجريبي و يحتاج الى مراجة و اختبار و كما قلت كل عمود يمكن ان يستعمل font مستقل هذا يحتاج الى ظبط ايضا
الفكرة بسيطة ..بدل اعطاء المكون الجديد اسم اخر يجب الاحتفاظ بنفس الاسم اي TDBGrid ثم ضع اسم الوحدة unit التي تحتويه اي NewDBGrid في اخر ال uses في ملف المشروع الذي تعمل عليه
في هذه الحالة سيتم استعمال المكون الجديد على كل DBGrid التي على الفورم
التحديثات تظهر عند تشغيل ..
كود :
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.StdCtrls, Data.Win.ADODB,
Vcl.ExtCtrls,
Vcl.Grids, Vcl.DBGrids, Vcl.DBCtrls, NewDBGrid;
typeلوحدة...
كود :
unit NewDBGrid;
interface
uses
System.SysUtils,Winapi.Windows, System.Classes,Graphics, Vcl.Controls, Vcl.Grids, Vcl.DBGrids;
type
TMyDBGrid = class(TDBGrid);
type
TDBGrid = class(Vcl.DBGrids.TDBGrid)
private
FDefaultRowHeight:Integer;
protected
procedure SetDefaultRowHeight(const Value: Integer);
procedure Paint; override;
procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
procedure DrawColumnCell(const Rect: TRect; DataCol: Integer;
Column: TColumn; State: TGridDrawState); override;
public
constructor Create(AOwner: TComponent); override;
published
property DefaultRowHeight: Integer read FDefaultRowHeight write SetDefaultRowHeight default 21;
end;
implementation
{ TNewDBGrid }
function GetFontHeight(AFont:TFont):integer;
var
DC: HDC;
oldFont: HFont;
Metrics: TTextMetric;
begin
DC := GetDC(0);
try
oldFont := SelectObject(DC, AFont.Handle);
GetTextMetrics(DC, Metrics);
SelectObject(DC, oldFont);
Result := Metrics.tmHeight;
finally
ReleaseDC(0, DC);
end;
end;
constructor TDBGrid.Create(AOwner: TComponent);
begin
inherited;
FDefaultRowHeight := 21;
TMyDBGrid(self).DefaultRowHeight := 21;
end;
procedure TDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;
AState: TGridDrawState);
var
H:integer;
begin
H := (DefaultRowHeight - Abs(GetFontHeight(Font))) div 2;
Canvas.MoveTo(ARect.Left + 2, ARect.Top + H -3);
SetTextAlign(Canvas.Handle, TA_UPDATECP);
inherited;
SetTextAlign(Canvas.Handle, TA_NOUPDATECP);
// DefaultDrawDataCell(ARect, Column.Field, State);
end;
procedure TDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer;
Column: TColumn; State: TGridDrawState);
var
H:integer;
begin
H := (DefaultRowHeight - Abs(GetFontHeight(Font))) div 2;
Canvas.MoveTo(Rect.Left + 2, Rect.Top + H - 3 );
SetTextAlign(Canvas.Handle, TA_UPDATECP);
inherited;
SetTextAlign(Canvas.Handle, TA_NOUPDATECP);
// DefaultDrawDataCell(Rect, Column.Field, State);
end;
procedure TDBGrid.Paint;
begin
inherited;
if TMyDBGrid(self).DefaultRowHeight <> FDefaultRowHeight then
TMyDBGrid(self).DefaultRowHeight := FDefaultRowHeight;
end;
procedure TDBGrid.SetDefaultRowHeight(const Value: Integer);
begin
if FDefaultRowHeight <> Value then begin
FDefaultRowHeight := Value;
TMyDBGrid(self).DefaultRowHeight := FDefaultRowHeight;
end;
end;
end.بالنسبة لل TEdit لاحظت انت حذفت inherited الذي كان في الدالة WMSize يجب ارجاعه لان هذه دالة message و تعمل نوعا ما مثل الدلة مورثة virtuel لهذا ينغي عدم نسيان inherited لاعادة ارسال الى ancestor الذي يتعامل مع هذه الرسالة ...
انشاء TEdit بخاصية multilines قد يصبح يقبل النص متعدد الاسطر و يقبل الضغط على ال entry لانشاء سطر جديد ...اذا يجب اخذ هذ الامور بعين الاعتبار لمعالجتها فيما بعد..
اظن انه ابقاء DefaultRowHeight بنفس الاسم الاصلي و هي ليس نفس ال property هذا تظليل و هي لا تقوم بنفس العمل لان DBGrid محتواه متعلق بقاعدة البيانات اي عدد الاسطر و ليس باي Data يحتويها مثل TStringGrid و الذي يمكن التحكم بارتفاع كل سطر على حدة
إقتباس :الاخ Ndagor وضعه عند التجربة وبازالته يمكن وضع النص بالمنتصف تماما ويجب ازالة الرقم 3 حتى من اجراء اعادة رسم العناوين ايضا
كما سبق و ان قلت الكود تجريبي و يحتاج الى مراجة و اختبار و كما قلت كل عمود يمكن ان يستعمل font مستقل هذا يحتاج الى ظبط ايضا


![[-]](https://delphi4arab.net/forum/D4A2020/collapse.png)