15-01-2013, 08:30 PM
السلام عليكم و رحمة الله
لقد تساؤل أحد الأعضاء حول طريقة استخدام ال VCL Style في مكتبات ال Dll
لذلك أحببت طرح هدا الموضوع ..
السؤال بصراحة قد لفت انتباهي ... فالسؤال مهم
لمادا مهم ؟
يمكن استعمال ال dll ك Plugin لأي تطبيق .. خصوصا وان احتوت على Forms , فمن الجيد أن يكون لنفس ال Plugin ستايل التطبيق أو ستايل محدد !!
هناك طريقتين لاستخدام ال VCL Style داخل مكتبات ال dll
بالنسبة للتطبيقات التنفيذية exe يمكن عمل ذلك مباشرة بدون استخدام هاتين الطريقتين من خلال
Project ثم Options ثم Application ثم Appearance ثم تحديد الستايل , لكن بالنسبة لمكتبات ال Dll فلا يوجد خيار Appearance لتحديد الستايل .
أولا و قبل أن نبدأ أنشئ مشروعين :
الأول عبارة عن مشروع لل Dll يحتوي على فورم
الثاني مشروع تنفيذي exe سيلعب دور الحاضن Host لل Dll
الطريقة الأولى : استخدام الستايل من ال Dll :
افتح المفكرة من أجل انشاء ملف rc
مثال :
احفظ الملف بصيغة RC
الآن افتح ال cmd و توجه الى Embarcadero\RAD Studio\10.0\bin
الآن من خلال ال cmd شغل BRCC32 لانشاء الرسورسسينتج ملف رسورس بالامتداد res
قم بارفاق الرسورس في ال dll
ثم
يجدر الذكر ان اسم الستايل ليس اسم الرسورس .. انتبه لهدا
-------------------------------------------------------------
الطريقة الثانية : عن طريق استخدام الستايل الخاص بالتطبيق الذي يستخدم ال dll
يكفي تمرير مقبض الرسورس الخاص بالتطبيق و اسم الستايل + اسم الستايل في الرسورس
مكتبة ال Dll تكون بهدا الشكل :
لاستخدامها في التطبيق
يجب التحقق من كون الستايل مسجل أو لا عن طريق الدالة IsStyleRegistered ان كان غير مسجل فنقوم بتحميله من الرسورس وتسجيله عن طريق الدالة LoadFromResource أما ادا كان مسجل فليس هناك داعي لتستجيله (والا سيحدث خطأ)
لا تنسى بنقل ال Dll الى مجلد التطبيق (أين يتواجد الملف التنفيذي .exe)
لقد تساؤل أحد الأعضاء حول طريقة استخدام ال VCL Style في مكتبات ال Dll
لذلك أحببت طرح هدا الموضوع ..
السؤال بصراحة قد لفت انتباهي ... فالسؤال مهم
لمادا مهم ؟
يمكن استعمال ال dll ك Plugin لأي تطبيق .. خصوصا وان احتوت على Forms , فمن الجيد أن يكون لنفس ال Plugin ستايل التطبيق أو ستايل محدد !!
هناك طريقتين لاستخدام ال VCL Style داخل مكتبات ال dll
بالنسبة للتطبيقات التنفيذية exe يمكن عمل ذلك مباشرة بدون استخدام هاتين الطريقتين من خلال
Project ثم Options ثم Application ثم Appearance ثم تحديد الستايل , لكن بالنسبة لمكتبات ال Dll فلا يوجد خيار Appearance لتحديد الستايل .
أولا و قبل أن نبدأ أنشئ مشروعين :
الأول عبارة عن مشروع لل Dll يحتوي على فورم
الثاني مشروع تنفيذي exe سيلعب دور الحاضن Host لل Dll
الطريقة الأولى : استخدام الستايل من ال Dll :
افتح المفكرة من أجل انشاء ملف rc
PHP كود :
ResourceName ResourceType "Full Resource Path"
PHP كود :
Auric VCLSTYLE "C:\Program Files\Embarcadero\RAD Studio\10.0\Redist\styles\vcl\Auric.vsf"
PHP كود :
Auric.RC
الآن افتح ال cmd و توجه الى Embarcadero\RAD Studio\10.0\bin
كود :
cd C:\Program Files\Embarcadero\RAD Studio\10.0\binالآن من خلال ال cmd شغل BRCC32 لانشاء الرسورس
PHP كود :
BRCC32 "Auric.RC"
قم بارفاق الرسورس في ال dll
ثم
PHP كود :
{$R Auric.res}
procedure TdllForm.FormCreate(Sender: TObject);
var s:TStyleManager ;
begin
s:=TStyleManager.Create ;
s.SetStyle('Auric');
end;
-------------------------------------------------------------
الطريقة الثانية : عن طريق استخدام الستايل الخاص بالتطبيق الذي يستخدم ال dll
يكفي تمرير مقبض الرسورس الخاص بالتطبيق و اسم الستايل + اسم الستايل في الرسورس
مكتبة ال Dll تكون بهدا الشكل :
PHP كود :
library DllDlg;
uses
System.SysUtils,
System.Classes,
Vcl.Themes,
Vcl.Styles,
DllFrmUnit in 'DllFrmUnit.pas' {dllForm};
{$R *.res}
{$R Auric.res}
type TStyleManagerHelper = class helper for TStyleManager
class function IsStyleRegistered (StyleName:String):Boolean;
end;
{ TStyleManagerHelper }
class function TStyleManagerHelper.IsStyleRegistered(StyleName: String): Boolean;
VAR sName:String;
begin
Result:=False;
for sName in StyleNames do // read each StyleName in StyleNames array
if StyleName =sName then begin
Result:=True; // Style is registered .
Break;
end else
Result:=False; // Style is not registered .
end;
procedure ApplyStyle(Instance:THandle;ResStyleName,StyleName:string);
begin
if not TStyleManager.IsStyleRegistered ( StyleName)then
TStyleManager.LoadFromResource(Instance,ResStyleName,'VCLSTYLE');
TStyleManager.SetStyle(StyleName);
end;
procedure ShowMyDllForm(ParentInstance:THandle;ResStyleName,StyleName:String;ParentStyle:Boolean);stdcall;
begin
dllForm :=TdllForm.Create(nil);
if ParentStyle then
ApplyStyle(ParentInstance,ResStyleName,StyleName)else
TStyleManager.SetStyle('Auric');
dllForm.Show;
end;
exports ShowMyDllForm;
begin
end.
PHP كود :
procedure ShowMyDllForm(ParentInstance:THandle;ResStyleName,StyleName:String;ParentStyle:Boolean);stdcall;external 'C:\Users\Mahdi\Desktop\DllFormTest\Win32\Debug\DllDlg.dll' name 'ShowMyDllForm' ;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMyDllForm(HInstance,'AQUAGRAPHITE','Aqua Graphite',Self.CheckBox1.Checked );
end;
يجب التحقق من كون الستايل مسجل أو لا عن طريق الدالة IsStyleRegistered ان كان غير مسجل فنقوم بتحميله من الرسورس وتسجيله عن طريق الدالة LoadFromResource أما ادا كان مسجل فليس هناك داعي لتستجيله (والا سيحدث خطأ)
لا تنسى بنقل ال Dll الى مجلد التطبيق (أين يتواجد الملف التنفيذي .exe)