delphi4arab منتديات دلفي للعرب
استخدام ال VCL Style مع مكتبات ال Dll - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : دروس دلفي للمبتدئين (https://delphi4arab.net/forum/forumdisplay.php?fid=13)
+--- الموضوع : استخدام ال VCL Style مع مكتبات ال Dll (/showthread.php?tid=4880)



استخدام ال VCL Style مع مكتبات ال Dll - SMP3 - 15-01-2013

السلام عليكم و رحمة الله
لقد تساؤل أحد الأعضاء حول طريقة استخدام ال 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" 
احفظ الملف بصيغة RC
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" 
سينتج ملف رسورس بالامتداد res
قم بارفاق الرسورس في ال 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)


استخدام ال VCL Style مع مكتبات ال Dll - SMP3 - 16-01-2013

تعديل على الاجراء ShowMyDllForm
اجعله هكذا :
PHP كود :
procedure ShowMyDllForm(ParentInstance:THandle;ResStyleName,StyleName:String;ParentStyle:Boolean);stdcall;external 'DllDlg.dll' name 'ShowMyDllForm' ; 



استخدام ال VCL Style مع مكتبات ال Dll - ALmuhhnad - 16-01-2013

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

حصلت معي مشكلة تظهر لدي رسالة محتواها
كود :
Unable to load style 'RUBYGRAPHITE'

بعد ان عملت التالي :

كود :
unit UnitMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.ImgList, Vcl.Imaging.pngimage, Vcl.ExtDlgs, Vcl.Themes, Vcl.Styles; ... ... ... ... var Main: TMain; implementation {$R *.dfm} {$R VLCSTYLE.res} procedure TMain.FormCreate(Sender: TObject); begin TStyleManager.LoadFromResource(HInstance,'RubyGraphite','VCLSTYLE'); TStyleManager.SetStyle('RubyGraphite'); end;

الكود الخاص بالنافذة التي أريـ د تطبيق الستايل عليها
... تأكدت ان Resource المكتبة يحتوي على الستايل

يتضح لي ان المشكلة في عدم مقدرته على تحميل الستايل ... لكن لا اعلم ما السبب ؟


استخدام ال VCL Style مع مكتبات ال Dll - ALmuhhnad - 17-01-2013

السلام عليكم ورحمة الله وبركاتة
بعد ان اعدت تطبيق الدرس اكثر من مره استطعت حل المشكلة ... رغم اني إلى الآن لم اعرف اين كانت مشكلتي @@"
بارك الله فيك وزادك علماً وحققك لك مبتغاك
شكراً لك استاذ smp3 مره آخرى


استخدام ال VCL Style مع مكتبات ال Dll - SMP3 - 17-01-2013

almuhhnad كتب :رغم اني إلى الآن لم اعرف اين كانت مشكلتي
هذه هي المشكلة :
أنت قمت بارفاق ال {$R VLCSTYLE.res} يعني قمت بتسجيل الستايل .. أوكي
وقمت أيضا بوضع :
PHP كود :
procedure TMain.FormCreate(Sender: TObject);
begin
  TStyleManager
.LoadFromResource(HInstance,'RubyGraphite','VCLSTYLE');
  
TStyleManager.SetStyle('RubyGraphite');
end; 
المشكلة أن الستايل مسجل مسبقا لذلك لن تحتاج الى استخدام الدالة LoadFromResource فهي بدورها تقوم بتسجيل الستايل ..> و هنا تحدث المشكلة
الحال هو عدم مناداتها :
PHP كود :
procedure TMain.FormCreate(Sender: TObject);
begin

  TStyleManager
.SetStyle('RubyGraphite');
end; 

إقتباس :يجدر الذكر ان اسم الستايل ليس اسم الرسورس .. انتبه لهدا