PDA

View Full Version : سوال: پیغام خطای Cannot assign a TFont to a TFont



H.Yousefi
یک شنبه 25 تیر 1391, 01:05 صبح
با سلام خدمت دوستان.
من یک main form دارم که در آن می توانم از طریق کلاس هر کامپوننتی را از فرمهای دیگر فراخوانی کرده ایجاد کنم. مثلا با استفاده از کلاس Tbutton می توانم یک دکمه را در فرم اصلی ایجاد کنم. ولی وقتی می خواهم همین همل را از داخل DLL انجام دهم پیغام خطای زیر نمایش داده می شود:
پیغام خطای Cannot assign a TFont to a TFont
مشکل از چیست. لطفا مرا راهنمایی کنید؟
در اکثر سایتهای خارجکی دیدم که نوشتند: مشکل از خود دلفی است که نمی تواند این کار را انجام دهد. برای همین از روش Package کردن استفاده کنید. اگر اینطوریست لطف کنید توضیح بدهید.
در ضمن من از RAD Studio XE2 استفاده می کنم.

SAASTN
یک شنبه 25 تیر 1391, 08:48 صبح
احتمالا Font رو از Exe به DLL پاس میدین یا بلعکس، مشکل اینه که این دوتا از مدیر حافظه های جداگانه ای استفاده می کنن.
اینو یه بررسی بکن:http://barnamenevis.org/showthread.php?309318-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D9%87-%D8%B1%D9%88%D8%B4-%D9%85%D8%A7%DA%98%D9%88%D9%84%DB%8C&p=1359132#post1359132

H.Yousefi
یک شنبه 25 تیر 1391, 09:25 صبح
متاسفانه با خوندن مطلب ارسالیت متوجه نشدم که چیکار باید بکنم.

SAASTN
یک شنبه 25 تیر 1391, 09:43 صبح
آقا مشکل اینجاست که عملگرهای as و is بین دوتا مدیرحافظه متفاوت درست کار نمی کنن. این خطایی هم که شما داری توی روال Assign اتفاق میافته، چون اون تو با is چک میشه که نوع کلاس ورودی خروجی یکی باشه، و چون is درست کار نمی کنه، خطا اتفاق میافته.
حالا برا حلش یا باید کاری کنی که Assign اجرا نشه، (که اینم بستگی به برنامت داره، یعنی ممکنه نتونی همچین کاری کنی)، یا باید از مدیر حافظه مشترک استفاده کنی، یعنی ShareMem یا SimpleShareMem رو هم تو exe هم تو dll به عنوان اولین uses معرفی کنی(که من تو برنامه همون تاپیک سعی کردم ولی موفق نشدم)، یا اینکه کلا DLL رو بیخیال بشی بری سراغ BPL.
اینا ماحصل مطالب اون تاپیک بود!

H.Yousefi
یک شنبه 25 تیر 1391, 14:27 عصر
سلام.
خیلی زحمتت دادم.
ولی باز بعد از انجام دستوراتتون مشکلم حل نشد. با BPL هم کار نکرده ام. میشه یادم بدید. یا راهنماییم کنید. ممنون می شم. راستی سورس فایلی که ایجاد کرده ام رو می ذارم تا شاید متوجه مشکل بشوید.

library DLLTest;

uses
ShareMem ,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
Vcl.ExtCtrls,
AdvToolBar,
AdvToolBarStylers,
AdvGlowButton;

type
TMyClass = class
private
{ Private declarations }
procedure AdvGlowButton1(Sender: TObject);
public
{ Public declarations }
end;

{$R *.res}

procedure CreateDLLNewPage(AppComponent: TAdvToolBarPager;
AppHandle: HWND); stdcall;

var
AdvToolBar1: TAdvToolBar;
AdvGlowButton1: TAdvGlowButton;
aStyler: TAdvToolBarOfficeStyler;

nPageIndex: Integer;
MyClass: TMyClass;

begin
Application.Handle := AppHandle;

// AdvToolBarOfficeStyler1
aStyler := TAdvToolBarOfficeStyler.Create(Application.MainFor m);
with aStyler do
begin
// AdvToolBarOfficeStyler1
Name := 'AdvToolBarOfficeStyler1';
Style := bsOffice2010Blue;
end;

// TestPage
if assigned(AppComponent) then
with AppComponent do
begin
Parent := AppComponent.Parent;
nPageIndex := AddAdvPage('TestPage');
with AdvPages[nPageIndex] do
begin
Name := 'TestPage';
end;

// AdvToolBar1
AdvToolBar1 := TAdvToolBar.Create(Application.MainForm);
with AdvToolBar1 do
begin
// AdvToolBar1
Name := 'AdvToolBar1';
Parent := AdvPages[nPageIndex];
Left := 3;
Top := 3;
Width := 120;
Height := 85;
AllowFloating := True;
AutoSize := True;
Caption := 'Untitled';
CaptionFont.Charset := DEFAULT_CHARSET;
CaptionFont.Color := clWindowText;
CaptionFont.Height := -11;
CaptionFont.Name := 'Tahoma';
CaptionFont.Style := [];
CaptionPosition := cpBottom;
CaptionAlignment := taCenter;
CompactImageIndex := -1;
ShowCaption := True;
ShowRightHandle := False;
TextAutoOptionMenu := 'Add or Remove Buttons';
TextOptionMenu := 'Options';
ToolBarStyler := aStyler;
ParentOptionPicture := True;
ToolBarIndex := 0;
end;

// AdvGlowButton1
AdvGlowButton1 := TAdvGlowButton.Create(Application.MainForm);
with AdvGlowButton1 do
begin
// AdvGlowButton1
Name := 'AdvGlowButton1';
Parent := AdvToolBar1;
Left := 2;
Top := 2;
Width := 106;
Height := 40;
AutoSize := True;
Caption := 'Test Button';
FocusType := ftHot;
NotesFont.Charset := DEFAULT_CHARSET;
NotesFont.Color := clWindowText;
NotesFont.Height := -11;
NotesFont.Name := 'Tahoma';
NotesFont.Style := [];
Picture.LoadFromFile('Adim.png');
Transparent := True;
TabOrder := 0;

MyClass := TMyClass.Create;
OnClick := MyClass.AdvGlowButton1;
end;
end;
end;

exports
CreateDLLNewPage;

{ myClass }

procedure TMyClass.AdvGlowButton1(Sender: TObject);
begin
ShowMessage('Hello From DLL');
end;

begin

end.

SAASTN
یک شنبه 25 تیر 1391, 22:31 عصر
من یه مثال ساده درست کردم که توش فقط یه فرم رو برای DLL پاس می کنه و DLL توی اون فرم یه Button ایجاد میکنه. دقیقا با همون خطایی که شما گفتی برخورد کردم. بازم سعی کردم که از ShareMem و SimpleShareMem استفاده کنم ولی خطا برطرف نشد. اخر سر رفتم توی Project\Options\Packages و Build with Runtim Packages رو تیک زدم. حتی بدون use کردن ShareMem هم مشکل حل شد! حالا مطمئن نیستم که برای اجرا شدن برنامه روی سیستم مقصد باید bpl خاصی کنار برنامه باشه یا نه.
ضمنا توی edit زیر اون چک توی تنظیمات فقط vcl;rtl باشه کافیه. و این تنظیمات هم توی exe و هم توی dll باید اعمال بشه. بعدشم build هر دو!
برای ایجاد BPL هم:http://barnamenevis.org/showthread.php?260077-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%81%D8%A7%DB%8C%D9%84%D9%87%D8%A7%DB%8C-BPL-%D9%88-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%A2%D9%86%D9%87%D8%A7
در هر صورت پروژم رو هم میذارم که اگه لازم شد بررسیش کنی.

H.Yousefi
دوشنبه 26 تیر 1391, 03:03 صبح
سلام.
شرمنده زحمتتون دادم.
من فایل پیوست رو نگاه کردم. اما وقتی یه پروسیجر به خاصیت OnClick همین دکمه تعریف شده اضافه می کنم باز هم پیغام خطای جدید رو می بینم.
procedure BtnClicked(Sender: TObject);

SAASTN
دوشنبه 26 تیر 1391, 08:45 صبح
اختیار داری
من خطا ندارم! دوباره مثال رو میذارم.
متن خطا چیه؟ کی اتفاق میافته؟ موقع ست کردن OnClick یا کلیک کردن باتن؟

H.Yousefi
دوشنبه 26 تیر 1391, 12:14 عصر
سلام.
مشکل حل شد. اشتباها بعد از صدا زدن DLL از دستور FreeLibrary(LDLLHandle); استفاده می کردم. باعث می شد رویداد صفحه کلید کار نکنه. حذفش کردم حل شد.
از زحمتی که کشیدی ممنونم.