طرح سوالاتی که در ایجاد پلاگین برای ام ام بی با آنها روبرو شده اید و کدهای آموزشی

Free Man

کاربر متخصص مولتی مدیا بیلدر
با سلام ،

لطفا از پرسش های بی مورد خودداری فرمایید.

با تشکر.
 

splinter cell

Well-Known Member
ببخشید من کجاش باید بگم 1 رو سلام بده ؟
میشه یه نفر نمونه ام ام بی و دلفی رو بده ؟؟ اینطور برام بهتر جا میفته

دوست عزیز بنظر میرسه صرفاً استفاده از روش آزمایش و خطا (ما بهش میگیم انگولک کردن کدها) بدون اگاهی از زبانهای برنام نویسی مناسب برای یادگیری نوشتن پلاگین نیست.
اگر یک کم تسلط بیشتری بر دلفی و زبان برنامه نویسی اون پیدا کنید بهتر خواهید تونست در این امر موفق بشید و برای چنین سئوالهایی پست نخواهید زد.واین تاپیک مفید بیهوده شلوغ نمیشه.
موفق باشید
 

Free Man

کاربر متخصص مولتی مدیا بیلدر
با سلام ،

اخیرا در بعضی از ویروس اسکن ها پلاگین های ساخته شده ی دوستان

به صورت Malware ظاهر می شود که دلیل آن آلوده شدن نرم افزار دلفی آنها می باشد.

که علت این آلودگی ، اجرای پروژهایی می باشد که از SysConst در خود استفاده کرده باشند.

(البته SysConst دستکاری شده )

برای آنکه تشخیص دهید SysConst تغییر کرده یا خیر ، آن را با یک ویراستار متن باز نموده و

به دنبال CreateFile در آن بگردید ، اگر چنین عبارتی در آن موجود بود ، یعنی سیستم شما نیز آلوده شده.

جهت برطرف نمودن این مشکل کافیست که :

1- Borland\Delphi7\Lib\sysconst.dcu این فایل را حذف کنید.

2- Borland\Delphi7\Lib\sysconst.bak این فایل را در همین پوشه Copy و Pase کنید

و نام و فرمت فایل کپی شده را به sysconst.dcu تغییر دهید .


روش دوم : می توانید فایل پیوست شده ی زیر را درBorland\Delphi7\Lib این مسیر Replace نمایید.

لینک sysconst.dcu اصلی : اینجا ( دلفی 7 )



موفق باشید.
 

پیوست ها

  • sysconst.zip
    3.9 کیلوبایت · بازدیدها: 31

Free Man

کاربر متخصص مولتی مدیا بیلدر
با سلام ،

این هم یک نمونه سورس کد ،

که در آن کار با اشیا را آشنا می شوید.

(زبان سورس کد = دلفی)


لینک دانلود : اینجا


attachment.php

 

پیوست ها

  • Plugin&Form-Delphi.zip
    319 کیلوبایت · بازدیدها: 109
  • demo.png
    demo.png
    19.5 کیلوبایت · بازدیدها: 82
آخرین ویرایش:

Free Man

کاربر متخصص مولتی مدیا بیلدر
splinter cell گفت:
با سلام به دوست و استاد ارجمند Free Man عزیز

امروز وقتی پیدا شد و بکمک اون نمونه مثالی که برای ایجاد پلاگین با فرم گذاشته بودین یک پلاگین با شیی Combobox برای خودم درست کردم و الان هم دارم امکاناتش رو بیشتر میکنم(البته به جهت مشق و تمرین پلاگین نویسی). در حین انجام کار در بیلدر دیدم در فرمان insert اگر مقدار ایندکس رو بیشتر از تعداد کل آیتمهای کمبوباکس قرار بدم (ComboBox1.Items.Count) و دستور رو اجرا کنم برنامه کرش میکنه و بسته میشه. این مورد رو با پلاگین شما UO هم امتحان کردم و همین عمل اتفاق می افتاد. خواستم به اطلاعتون برسونم که اگر خواستید در نسخه های بعدی این باگ رو برطرف کنید.(البته اگر بشه اسمش رو باگ گذاشت؟)
من توی پلاگین خودم برای رفعش از این کد استفاده کردم. لطفاً یه نگاه بندازید و راه بهتر و حرفه ای تر اون رو بیان کنید.
با سپاس

کد:
procedure insertToComb; cdecl;
   var
   TotalItems,userIndexItem : integer;
  begin
   TotalItems:=MainForm.ComboBox1.Items.Count ;
    userIndexItem:=NumInput;
      if userIndexItem <= TotalItems then
  MainForm.ComboBox1.Items.Insert(NumInput,TextInput)
  else
        MessageBox(0,'please input a less index','ItemIndex is Too Big',0);
  end;

سلام دوست عزیز ،

این راه شما بهترین راه است ، برای زمانی که ما بدانیم خطا از کجا ایجاد می شود ،

و با کنترل دقیق ورودی ها از بروز آن خطا جلوگیری کنیم.

اما اگر ما یکسری کد داریم که احتمال می رود از جاهای مختلف آن خطا بوجود آید می توانیم از روشی نسبتا حرفه ای استفاده نماییم

بنام Error Detecting و Error Correcting:
try و except
کد:
try
 begin
  ..
  ..
  ..
  TextOutput:='Done';
 end
except
  TextOutput:='Error';
end;

در کد بالا ، شما باید کدهای خود را بجای نقطه ها قرار دهید.

کد بالا به این صورت عمل می کند که اگر در محدوده ی try ، از begin تا end خطایی رخ دهد ، آن را هندل کرده

و در نتیجه برنامه کرش نمی شود ، اگر خطا رخ دهد کدهای درون except اجرا خواهند شد و اگر خطایی رخ ندهد

این قسمت (except) اجرا نخواهد شد.


ممنون از اطلاع دادن تان در مورد باگ ، در نسخه های آینده ی Lite حتما رفع می شود ، و در نسخه های تجاری نیز چنین چیزی

وجود ندارد.

موفق باشید.
 

Free Man

کاربر متخصص مولتی مدیا بیلدر
در مورد کدی هم که نوشتید ، بهتر است تا حد امکان از تعریف بی مورد متغیرها بپرهیزیم.

کد:
procedure insertToComb; cdecl;
  begin   
  if NumInput <= MainForm.ComboBox1.Items.Count then
  MainForm.ComboBox1.Items.Insert(NumInput,TextInput)
  else
        MessageBox(0,'please input a less index','ItemIndex is Too Big',0);
  end;
 

splinter cell

Well-Known Member
حقیقتش کدها رو به همون شکل شما نوشته بودم ولی برای اینکه یک کم واضح تر بگم چیکار کردم اون تعاریف متغیرها رو بیان کردم.بازم از راهنمایی شما تشکر میکنم. البته با چند تا سئوال اساسی دیگه باز هم مزاحم خواهم شد بزودی
 

splinter cell

Well-Known Member
با سلام به محسن عزیز.
یکی دو تا سئوال داشتم که تا بحال نتونستم خودم مرتفعش کنم و گفتم مطرح کنم و نظر شما رو بدونم.
1- یک شیی کامبوباکس روی فرم داریم و میخوام وقتی دستور show plugin رو میدم فرم تغییر اندازه پیدا کنه و دقیقاً به همون اندازه کامبو بشه. یا وقتی سایز فونت کامبو باکس رو کوچک و بزرگ میکنه فرم هم تغییر اندازه بده. من از این دستور استفاده کردم
کد:
MainForm.ComboBox1.Font.Size:=NumInput;
   h := CreateRectRgn(0,0,MainForm.ComboBox1.Width ,MainForm.ComboBox1.Height);
 SetWindowRgn(MainForm.Handle ,h,true);

ولی یک مشکل پیش میاد و اونم اگر کاربر وقتی توی بیلدر شیی پلاگین رو اضافه میکنه عرض کادر اون رو کوچک بگیره وقتی دستور اجرا میشه یک مقدار از کامبوباکس میفته زیر صفحه و ناجور در میاد. لطفاً بگین روش اصولیش چطوریه ؟و کدش به چه شکل باید نوشته بشه؟

2- چطوری میشه از داخل پلاگین به بیلدر دستور داد ؟
مثلا توی رویداد Onclick شیی لیست باکس پلاگین بنویسیم که با انتخاب هر گزینه لیست باکس یک اسکریپت مثلاً به نام Event در بیلدر اجرا بشه؟ چون این مورد جزء خروجی های unit PluginInterface نیست و یا من متوجه نشدم.

با تشکر
 

Free Man

کاربر متخصص مولتی مدیا بیلدر
با سلام ،

در PluginInterface این کد را اضافه کنید
کد:
procedure RunScript(Script: string; EnableSyntaxChecker: boolean=false);
begin
if EnableSyntaxChecker=false then
SendMessage(hMMBWindow, WM_RUNSCRIPT, 0, LPARAM(Script));
if EnableSyntaxChecker=true then
SendMessage(hMMBWindow, WM_RUNSCRIPT, 1, LPARAM(Script));
end;

و به طور مثال ، جهت اجرای اسکریپت Event در MMB می نویسیم :

کد:
RunScript('RunScript("Event")');

در مورد سوال اول هم باید بگم که شی پلاگین در MMB است و ما به راحتی نمی توانیم آن را تغییر انداره دهیم.

برای این کار می توانید ارتفاع و عرض جدید را با استفاده از دستور بالا برای یک اسکریپت در MMB ارسال نمایید

و سپس در آن اسگریپت شی پلاگین را تغییر اندازه دهید.
 

Free Man

کاربر متخصص مولتی مدیا بیلدر
Wm_runscript یک عدد ثابت می باشد که باید این مقدار به آن داده شود.

Wm_runscript=$008c7
 

splinter cell

Well-Known Member
ممنون از توضیحاتی که دادین.
من کد اولی رو توی PluginInterface اضافه کردم.البته ارور میداد که باید نوع متغیر WM_RUNSCRIPT رو تعریف کنید که من اونو از نوع کاردینال گرفتم . حالا متوجه نشدم که این کد
کد:
RunScript('RunScript("Event")');
رو کجا باید اضافه کنم؟ چون وقتی توی رویداد on select کامبوباکس اضافه کردم باز ارور میداد و RunScript رو نمیشناخت و.....
اگه میشه یک کم بیشتر توضیح بدین .

و بفرمایید این پارامترهای دستور sendMessage چه کاری انجام میدن؟ چون توی راهنمای دلفی چیز خاصی گیرم نیومد.

سئوال دومم هم ظاهرا وابسته به یادگیری روش اول برای فرستادن دستور به بیلدر هست که هنوز موفق نشدم انجامش بدم.

اما اگر پلاگین g_combobox رو ببینید متوجه میشید که اندازه کادر شیی پلاگین در بیلدر رو هر اندازه ای بگیرید مثلا حتی 10 در 10 پیکسل بازهم وقتی پلاگین نمایش داده میشه سایزش خود بخود به اندازه پیشفرض در میاد.و ضمن اینکه صفحه سیاه فرم که زیر کامبوباکس هست هم با تغییر اندازه فونت کامبوباکس و بزرگ و کوچگ شدن اون خودش رو به همون اندازه در میاره و دیده نمیشه.
 

Free Man

کاربر متخصص مولتی مدیا بیلدر
بعد از تعریف واحدها در PluginInterface
کد:
uses   Windows,PluginForm,SysUtils, ...

این کد باید نوشته شود:
کد:
procedure RunScript(Script: string; EnableSyntaxChecker:boolean=false);


و این یک استاندارد و قرارداد در برنامه نویسی می باشد.
 
آخرین ویرایش:

splinter cell

Well-Known Member
با سلامی دوباره.
من با استفاده از پارامتر Hint برای کامبوباکسم امکان نمایش hint رو بر قرار کردم.ولی مشکلی که بوجود میاد همونطور که میتونید در شکلی که گذاشتم ببینید این هست که وقتی مکان نما میره روی کامبو و hint نمایش داده میشه ،وقتی محو میشه سایه ای از همون کادر زرد رنگ hint به صفحه میچسبه و هر چقدر اینکار رو تکرار بشه بازهم این سایه ها در صفحه میمونند. و تا خود MMB رو نبندم اینها هستند و حتی اگر برنامه دیگه ای هم باز بشه روی صفحه اون هم ظاهر میشن. انگار به دسکتاپ پین شده اند.
ممنون میشم اگر تجربه ای اینچنین داشتید ،بگین علتش چیه؟ ممنون
 

پیوست ها

  • Question.jpg
    Question.jpg
    3.6 کیلوبایت · بازدیدها: 11

Free Man

کاربر متخصص مولتی مدیا بیلدر
با سلام ،

دوست عزیز ، کافیست که Style شی ComboBox را csOwnerDrawFixed و یا csOwnerDrawVariable انتخاب نمایید.

البته با این روش نیز به طور 100% مشکل رفع نخواهد شد اما بسیار کمتر می شود.

موفق باشید.
 

splinter cell

Well-Known Member
تشکر از جوابی که دادین.متاسفانه من موقع نوشتن پست بالا بجایComboBoxEX فقط نوشتم کامبوباکس(آخه دلفی هر دو رو توی یک دسته قلمداد کرده توی راهنمای خودش). و توی این مدل کامبو هم اون گزینه ها توی استایلش نیست.
ظاهراً باید بی خیال این خاصیت بشم. الان که پلاگین g_combobox رو امتحان کردم دیدم اون هم همین مشکل رو داره!
امکان داره مربوط به سیستم عامل باشه ؟؟؟
 

Free Man

کاربر متخصص مولتی مدیا بیلدر
خیر از سیستم عامل نیست ،

بحث در مورد علت این موضوع زیاد است ، اما به صورت مختصر:

Hint یک شی می باشد که مانند هر شی دیگر به Parent خود متصل است .

در مورد موضوع (پلاگین و MMB) ، ما با دو Parent سروکار داریم : Form در پلاگین و پنجره ی MMB

زمانی که موس را روی ComboBox می بریم در محدوده ی پلاگین هستیم و (Plugin Form) صاحب Hint می باشد

و زمانی که موس را از محدوده ی ComboBox خارج می کنیم در واقع از محدوده ی صاحب Hint خارج می شویم.

و Plugin Form پس از خارج شدن موس از محدوده ی ComboBox دستور پاکسازی می دهد (البته این دستور را برای

Form خود می دهد) و در نتیجه تمامی آثار Hint پاک می شود ، اما مشکل اینجاست که Hint در پنجره ی MMB ظاهر

شده ، و آثار آن به طور کامل پاک نمی شود ، پس برای آنکه این موضوع برطرف شود ، کافیست که عرض

شی پلاگین را در MMB بیش از عرض ComboBox بگیریم.


attachment.php
 

پیوست ها

  • 33.png
    33.png
    777 بایت · بازدیدها: 81

K@M@L

Well-Known Member
سلام

من میخوام یه کامپوننت رو به صورت پلاگین در بیارم.

برای این کار از مثالهای موجود در همین مبحث استفاده کردم ، برای اضافه کردن این کامپوننت که یه Progressbar هست ابتدا ListBox و تمام پارامترهای آن رو حذف کردم حالا وقتی که Progressbar رو اضافه میکنم و میخوام آن رو بسازم مدام اخطار بهم میده ، اخطارش هم این هست که فرم رو نمیشناسه در حالی که من هیچ تغییری در فرم ایجاد نکردم
این Progressbar چندتا uses داره که به پلاگین اضافه کردم ، حالا مشکل کار از کجاست که نمیتونه فرم رو بشناسه ؟ :cry:

یه چیزه دیگه وقتی که از Progressbar خود دلفی استفاده میکنم ، پلاگین ساخته میشه...:shock:
 

Free Man

کاربر متخصص مولتی مدیا بیلدر
با سلام ،

همان طور که از Progressbar دلفی استفاده می کنید از آن کامپوننت هم استفاده نمایید.

اگر قصد دارید RunTime شی درست کنید باید بیشتر از این برنامه نویسی شی گرا کار کنید.

اما اگر در زمان طراحی کامپوننت را در فرم قرار می دهید نباید خطایی مشاهده کنید مگر اینکه کامپوننت

مورد نظر دارای کمبودی باشد.

موفق باشید.
 

جدیدترین ارسال ها

بالا