![]() |
|
استئصال وعلاج مرض وراثي - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3) +--- قسم : مصادر دلفي مفتوحة تعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=14) +--- الموضوع : استئصال وعلاج مرض وراثي (/showthread.php?tid=12450) |
RE: استئصال وعلاج مرض وراثي - Delphi4Us - 18-11-2023 إقتباس :الحزمة تحتوي على وحدة UCrtlsFix غير موجودة و تمنع تثبيت المكونات حذفت الملف وكنت اجرب به ونسيت ان احذف اسم الوحدة من المشروع بالنسبة الى الضبط الجيد وبالمنتصف يمكن ذلك بازالة الرقم 3 بعد حرف H كود : Canvas.MoveTo(ARect.Left + 2, ARect.Top + H - 3 );الاخ Ndagor وضعه عند التجربة وبازالته يمكن وضع النص بالمنتصف تماما ويجب ازالة الرقم 3 حتى من اجراء اعادة رسم العناوين ايضا ![]() اما عند الدخول بوضع التعديل فلا يمكن استخدام نفس اسلوب الرسم لان ما يحدث هو ان المكون TDBGrid في Delphi يستخدم المكون TEdit عند تحرير الخلايا. عندما ينقر المستخدم مرتين على خلية في TDBGrid، يتم إنشاء كائن TEdit جديد ووضعه فوق الخلية. يمكن للمستخدم بعد ذلك إدخال أو تعديل قيمة الخلية باستخدام TEdit. تماما مثلما نستخدم المكون TcompoBox او CheckBox والمكون Tedit طبعا هو القديم وليس الذي عدلناه والحل هو استخدام المكون الجديد للتعديل . على العموم الخطوة القادمة سنرى في هذا . RE: استئصال وعلاج مرض وراثي - Ndagor - 18-11-2023 اذا اردت ان تشتغل بسرعة ينبغي تفادي تثبيت المكونات في كل مرة تقوم بتحديثات دع هذه العملية عندما يصبح المكون جاهز... الفكرة بسيطة ..بدل اعطاء المكون الجديد اسم اخر يجب الاحتفاظ بنفس الاسم اي 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 مستقل هذا يحتاج الى ظبط ايضا RE: استئصال وعلاج مرض وراثي - Delphi4Us - 19-11-2023 إقتباس :اذا اردت ان تشتغل بسرعة ينبغي تفادي تثبيت المكونات في كل مرة تقوم بتحديثات دع هذه العملية عندما يصبح المكون جاهز انا انشئ مشروع المكونات ومشروع التجربة بمشروع واحد واعدل واعمل ترجمة واشغل والتثبيت يتم مرة واحدة فقط إقتباس :ثم ضع اسم الوحدة unit التي تحتويه اي NewDBGrid في اخر ال uses هذا الامر عرفته بالصدفة وانا استخدم مكونات BussnisSkin حين كان يحدث تعارض بين المكونات القياسية ومكونات هذا المنتج ولحل المشكلة انقل الوحدة لتلك الشركة الى اخر الـ Uses فيتم اعتماد اخر وحدة في الترتيب ولكن ان استخدم نفس اسم المكون الأصلي هذه لم تخطر ببالي . إقتباس :بالنسبة لل TEdit لاحظت انت حذفت inherited خطاء نتج عن التجارب المتعددة من تغيير الكود ربما ولم انتبه إقتباس :انشاء TEdit بخاصية multilines قد يصبح يقبل النص متعدد الاسطر و يقبل الضغط على ال entry لانشاء سطر جديد ربما مكون Memo يفي بالغرض لاجل ذلك مع اضافة خاصية اخفاء واظهار اشرطة الانزلاق إقتباس :اظن انه ابقاء DefaultRowHeight بنفس الاسم الاصلي و هي ليس نفس ال property هذا تظليل و هي لا تقوم بنفس العمل تفكيري لاضافتها واول ما بدأت هو لانني استخدمها في مكونات اخرى وموجودة خاصية بنفس الاسم للتحكم في ارتفاع الصفوف إقتباس : كما قلت كل عمود يمكن ان يستعمل font مستقل هذا يحتاج الى ظبط ايضا اعتقد اننا لم نتدخل في اي شئ اخر عدا تغيير اماكن تموضع النص ولهذا جربت تغيير كل عمود بخط مختلف ويعمل بشكل جيد . اعدت بعدها تعديل المشروع وجعلته بنفس اسم المكونات الرئيسية وقلت ربما هذا سيحل مشكلة عدم جعل النص بالوسط في حالة التعديل لان الوحدة Edit المعدلة ايضا جعلتها في نهاية الـ Uses ولكن لم يفلح الامر . فاذا كان المكون DBgrid سوف يأخذ افتراضيا الوحدة التي عدلناها فالمفترض ان يأخد الوحدة TEdit التي عدلناها ايضا واستخدامها كـ Editor بداخله ولكن لم تنجح الفكرة وقلت ربما لان المكون AutoSize له افتراضيا هي True لذلك اضفت السطر التالي في حدث الانشاء كود : AutoSize:=false;لان لدينا الامر التالي في حدث اعادة التموضع كود : if AutoSize then Exit;وايضا لم تفلح العملية . توقفت للحظة بعد ان رأيت ان مانفعله لا يؤدي المطلوب وبدأت افكر في حل أخر فانشاء مكونات جديدة لن يقدم شئ وستبقى المكونات الوارثة كلها فيها نفس المشكلة الا بحال تحديث المكونات الأصلية بحيث عند اعادة ترجمة مكونات مثلا StyleControls ترث التعديل الجديد ولهذا قمت بتعديل الوحدة الموجودة بالمسار كود : C:\Program Files (x86)\Embarcadero\Studio\22.0\source\vcl\Vcl.StdCtrls.pasولكن التغييرات لا تعمل فوضعت نقطة توقف وتأكد ان البيئة تقوم فعلا بقراءة التغييرات على الوحدة الرئيسية ومع ذلك لا تعمل مع ملاحظة انني كثير ما اعدل وحدات لمكونات اخرى وتعمل بشكل عادي الا هذه الوحدات الخاصة بالدلفي وقلت ربما ان ملفات DCU مختلفة عن ملفاتها الاصلية ووجدة حزمة بنفس المجلد وبالاسم كود : stdvcl40.dprojفتحتها في الدلفي وفيها كل الوحدات بما فيها الوحدة المطلوبة وقمت باعادة ترجمتها وشغلت مشروع التجربة ولكن التغييرات نفس الشئ لا تعمل. التعديل يجب ان يكون بالوحدات الأصلية في الدلفي RE: استئصال وعلاج مرض وراثي - Ndagor - 19-11-2023 يمكن كتابة الكود بالنسبة ل TEdit لتفادي مشاكل البلاتفورم على النحو التالي كود : // Perform(EM_SETRECT, 0, Longint(@R));
SendStructMessage(Handle, EM_SETRECT, 0, R);بالنسبة ل DBGrid يمكن تعديل تموضع edit تحرير المعطيات و ذلك من خلال اعتراض الرسائل الداخلية دون الحاجة الي تغيير في الوحدة الاصلية. اظف الكود التالي الي TNewDBGrid اضف ايضا الوحدة Winapi.Messages الى uses كود : TNewDBGrid = class(Vcl.DBGrids.TDBGrid)
private
FDefaultRowHeight:Integer;
protected
OldProc: TWndMethod;
procedure MsgProc(var Msg: TMessage);
function CreateEditor: TInplaceEdit; override;
.......
function TNewDBGrid.CreateEditor: TInplaceEdit;
begin
Result := inherited;
OldProc := Result.WindowProc;
Result.WindowProc := MsgProc;
end;
type fontAccess = class(TControl);
procedure TNewDBGrid.MsgProc(var Msg: TMessage);
var
R: TRect;
H, dlt:integer;
begin
if Msg.Msg = EM_SETRECTNP then
begin
R := PRect(Msg.LParam)^;
H := GetFontHeight(fontAccess(InplaceEditor).Font) * 120 div 100;
if R.Height > H then
begin
dlt := (R.Height - H) div 2;
R.Top := R.Top + dlt;
R.Height := H;
Msg.LParam := LPARAM(@R);
end;
end;
OldProc(Msg);
end;RE: استئصال وعلاج مرض وراثي - Delphi4Us - 22-11-2023 تاخرت يومبن وهذا لانني جربت الطريقة الاخيرة ونقلت كل الملفات واعدت ترجمتها ولكن لسؤ الحظ هناك متغيرات ومؤشرات خارج الحزمة وبملفات مشركة لكل نسخ دلفي تغيرت ولهذا توقفت كل نسخ دلفي التي عندي والحل كان عمل فورمات للجهاز . على العموم حتى فكرة تعديل الملفات الأصلية تبين انها غير مفيدة فكنا نرجوا ان تفلح مع كل المكونات الاخرى التي ننصبها ولكن تبين مثل ان حزمة Stylecontrol لا ترث من الملفات الاصلية فمثلا المكون ScDbGrid لا يرث من DbGrid او حتى من DbCustomDbGrid وانما من ScDbGrid ولهذا استخدمت ايضا نفس الاسلوب وجعلت للمكونات وحدات خاصة بها واسميت الحزمة D4AStanderedCVL ويكفي ان تضيف الوحدة D4aDBgrid الى المشروع وبعدها اي مكونات ترث من DbGrid يتم تطبيق التغييرات عليها سوف ارفع المشروع عندما تتاح الفرصة RE: استئصال وعلاج مرض وراثي - Ndagor - 22-11-2023 إقتباس :تاخرت يومبن وهذا لانني جربت الطريقة الاخيرة ونقلت كل الملفات واعدت ترجمتها ولكن لسؤ الحظ هناك متغيرات ومؤشرات خارج الحزمة وبملفات مشركة لكل نسخ دلفي تغيرت ولهذا توقفت كل نسخ دلفي التي عندي معذرة ان كان ماقترحته هو ما ادى الي هذه الكارثة ..اعادة تثبيت النظام هو اسوأ سيناريو لكل شخص خاصة اعادة تثبيت كل البرامج و المشاكل التي قد ترافقها . منذ البداية لم اكن متحمس للفكرة و لقد حذفت تلك الرسالة .. و لا يوجد من سيتحمس لفكرة العبث في الوددات الاصلية و خاصة انها مدرجة في المكتبات الاصلية و المثبة و سيحصل تضارب .. انما هذه العملية يمكن اجراؤها للتقصي و البحث عن المشكل ..حتى و ان تمت بنجاح هذا لايضم انها ستعمل بشكل جيد لان تعليمات الانشاء غير معروفة و هذا يسبب اخطاء عشوائية .. حتى و ان اخذنا هذا بعين الاعتبار هذه العملية يمكن ان تكون على مستوى المشروع حيث يتم انشاء الوحدات الجديدة في مجلد debug المشروع و تبقى الوحدات الاصلية سليمة ... عادة عند تصحيح خطا في الوحدات الاصلية الاجراء الشائع هو عمل patch للتحويل الى الخوارزميات الجديدة و هذا يتطلب معرفة بالاسومبلي . RE: استئصال وعلاج مرض وراثي - Delphi4Us - 24-11-2023 إقتباس :معذرة ان كان ماقترحته هو ما ادى الي هذه الكارثة بل السبب انني لم التزم بنقل الملفات المطلوبة فقط ونقلت كل الملفات واعدت ترجمتها معا إقتباس :اعادة تثبيت النظام هو اسوأ سيناريو لكل شخص خاصة اعادة تثبيت كل البرامج و المشاكل التي قد ترافقها لم اقم بعمل تنصيب للنظام او فورمات منذ ربما عشر سنين حيث احتفظ فقط بنسخة من البارتيشن فيها الامور الاساسية فقط ولاعادة النظام احتاج فقط الى حوالي خمس دقائق باسواء الاحوال هناك مشكلة لم افهمها لازلت احاول معرفة سبب المشكلة وهي ان المكون CompoBox لا يتم عرض عناصره بشكل طبيعي مع انني لم اتدخل بعد في وحدته . ويبدو انني سوف اتوقف لفترة حتى اصلح شاشة التلفاز عندي فالتدقيق في شاشة الكمبيوتر للبحث بين العديد من المتغيرات والاجراءات مرهق جدا مع هذه الشاشة ، فالبحث والتتبع والتدقيق يضع جهد مضاعف على العين وسوف ارفع المشروع الليلة ان شاء الله حتى نكمله فيما بعد RE: استئصال وعلاج مرض وراثي - DAMOCLES - 24-11-2023 السلام عليكم و رحمة الله - فكرة التعديل على الملفات الأصلية تحتاج ارسال الباتش للشركة و اقناعهم (مع الكم الكبير من الــ feedback الذي يصلهم) قام من فبل احد الأشخاص بعمل ممتاز و في الأخير نشر ما توصل اليه على موقعه الخاص https://www.idefixpack.de/blog/ و لم تأبه الشركة لما انجزه. - انشاء مكونات معدلة باسم المنتدى مثلا على موقع github سوف يعطيها نفس طويل و امكانية حياة و تطيور (تركها هنا سوف تموت لا محال تحت لقب مجهول) - التجربة تكون على انظمة Virtual Machines لتفادي ضياع اي جهد، و لا تكون على اجهزة حقيقية. نجربته مع VCL سوف تفيدكم ان شاء الله في كيفية اعادة البناء للملفات الأصلية... https://www.idefixpack.de/blog/bugfix-units/vclfixpack-10 RE: استئصال وعلاج مرض وراثي - Delphi4Us - 24-11-2023 إقتباس :و لم تأبه الشركة لما انجزه هذه هي المشكلة هذه الشركة لم افهم توجهها ولا تفكيرها لو كانت لديها مكتبة موحدة فيها كل شئ مثل الـ FreamWork.net فما الذي سيجعل اي شخص يفكر ولو مجرد التفكير في استخدام غير الدلفي ، الان كل شئ مبعثر هنا وهناك مكونات لشركة ما للتعامل مع الشبكات والانترنت ولشركة اخرى للتعامل مع النظام ولشركة اخرى مكونات للواجهات و ... الخ المشكلة لديها بداية جيدة وكثير من المكتبات المبرمجة سابقا فقط تحتاج الى تطوير وتحتاج الى اضافة المزيد ولا تحتاج الى انشاء مكونات ومكتبات مخصصة وكاملة وانما نسخة قياسية كما في الـ FreamWork.net ليتبقى التخصص والمزيد من التفصيل والتغليف للشركات التي تريد ان تبرمج شي ما وتطوره . والمشكلة ان المكتبات والمكونات الموجودة بالدلفي الان ولانها قديمة كل المكونات للشركات الاخرى فيها مشاكل ولن تجد شركة تعالج كل المشاكل والنقص . على سبيل المثال StyleControl ادوات فقط تعرض المكونات القياسية بمظهر السكين لا غير لم يتكبدوا بدل مزيد من الوقت لمعالجة المشاكل التي بالادوات حتى مكونات AlphaSkin و DevExpress و BussnisSkin و TMS كلها عالجت مشاكل وتركت مشاكل وتجد شئ تم علاجه عند هذا وتم تركه عند الاخر . ليست مشاكل محاذاة او ارتفاع خلايا ومكونات او خصائص مفقودة فقط وانما احيانا ارتعاش في الشاشة ورسم خاطئ لبعض الحواف و ...الخ هذه الاشياء شبه معدومة في الـ FreamWork.net ولا تجدها ابدا . والسبب هو ان قلب هذه المكونات مبني بشكل غير صحيح او لم يتم تطويره وتحديثه إقتباس :انشاء مكونات معدلة باسم المنتدى مثلا على موقع github سوف يعطيها نفس طويل و امكانية حياة و تطوير اعتقد لاجل هذا تحتاج الى بداية جيدة تغري الاخرين للمشاركة على العموم لسنا في عجلة من امرنا واول خطوة تبداء من هنا اخدت بعض الوحدات اللازمة للمشروع الاب وايضا استوردت حتى الجد للحاجة مستقبلا لاي تطوير كما تفعل مكونات StyleControl وايضا BussnisSkin ربما المكونات الوحيدة التي لها وحدة واحدة فقط هي AlphaSkin حيث Dbgrid الخاصة بهم مثلا ترث مباشرة من Dbgrid الخاصة بي VCL . على العموم هذه الطريقة ستفيد بامور كثيرة فمثلا لسنا في حاجة الى انشاء الخاصية DefulteRowHegth فقط قمت باخراجها المنطقة المحمية الى منطقة النشر في الوحدة من المستوى الثاني اي اب الوحدة Dbgrid وهي TcoustumDBgrid اعتقد ان كان الاسم صحيح ، فهناك الكثير من الخصائص المحمية التي يمكن نقلها الى منطقة النشر اذا احتجنا لها فالوحدات حتى الان هي كود : D4AVcl.StdCtrls,D4aVcl.DBGrids, d4aVcl.Maskوالوحدة الاخيرة ايضا مهمة لاجل احداث اي تطوير او تعديل وسنتفق على شئ وهو كما فعلت انا وكما افعل دائما اي مكان يحدث فيه تغيير يتم قبل التغيير وضع السطر كود : // hereتعليق ليسهل ايجاد ماتم تغييره بالبحث ويتم ترك السطر البرمجي الاصلى ووضعه في تعليق فمثلا كما هنا كود : // here added
procedure UpdateClientRect();كلمة Here لاستخدامها في البحث وكلمة Added للاشارة الى ان هذا الاجراء لم يمكن موجود وتمت اضافته RE: استئصال وعلاج مرض وراثي - DAMOCLES - 24-11-2023 ـ Standred ؟ هذه التسمية غير صحيحة... D4AComponents تسمية اكثر احترافية... PHP كود : RegisterComponents('Samples', [TComponent1]); دفع دلفي لانشاء تبويب جديد باسم D4AComponents افضل بكثير بوضع المكونات في تبويب Samples اداة ExamDiff تسهل بشكر كبير فهم ما تم تعديلة، اضافته او تعديله... لا يمكننا الاستغناء عنها في انجاز المشروع بحرفية...
|