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

splinter cell

Well-Known Member
سلام!
توی بعضی از توابع احتیاج هست که چند تا مقدار توسط کاربر وارد بشه.مثلاً در تابع مسیج باکس برای خصوصیات caption و متن مسیج باکس و نوع مسیج باکس پلاگین احتیاج به دریافت این سه مقدار رو داره .
کد:
caption$='caption of Box'
msgText$='This is message text'
msgtype=2
PluginSet("PlugIn","msgtype")
PluginSet("PlugIn","caption$")
PluginSet("PlugIn","msgText$")
و بعد توی پلاگین این مقادیر اینطوری پر میشن

کد:
MessageBox(0,PChar(TextInput[1]),PChar(TextInput[2]),NumInput[1]);


حالا سئوالم اینه که چطور میشه کاری کرد که همه این ورودیها یکمرتبه به پلاگین ارسال بشن.یعنی یکبار از pluginSet استفاده کنیم.
مثل خیلی از پلاگینها مقادیر بکمک کارکتر | از هم جدا میشن و بعد ارسال میشن. ممنون میشم یه توضیح در این مورد بدین.
 

splinter cell

Well-Known Member
سلام!
توی بعضی از توابع احتیاج هست که چند تا مقدار توسط کاربر وارد بشه.مثلاً در تابع مسیج باکس برای خصوصیات caption و متن مسیج باکس و نوع مسیج باکس پلاگین احتیاج به دریافت این سه مقدار رو داره .
کد:
caption$='caption of Box'
msgText$='This is message text'
msgtype=2
PluginSet("PlugIn","msgtype")
PluginSet("PlugIn","caption$")
PluginSet("PlugIn","msgText$")
و بعد توی پلاگین این مقادیر اینطوری پر میشن

کد:
MessageBox(0,PChar(TextInput[1]),PChar(TextInput[2]),NumInput[1]);


حالا سئوالم اینه که چطور میشه کاری کرد که همه این ورودیها یکمرتبه به پلاگین ارسال بشن.یعنی یکبار از pluginSet استفاده کنیم.
مثل خیلی از پلاگینها مقادیر بکمک کارکتر | از هم جدا میشن و بعد ارسال میشن. ممنون میشم یه توضیح در این مورد بدین.و اینکه وقتی یک دکمه مسیج باکس فشرده شد چطور باید مقدار اون رو تشخیص داد و به بیلدر فرستاد؟(اگه سئوالاتم ابتدایی هست عذرخواهم!)
 
آخرین ویرایش:

Free Man

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


در این مثال شما می توانید 3 ورودی String با یک دستور وارد کنید :
کد:
  procedure WordGet; cdecl;
var
 i,n:integer;
 str :string;
 word: array [1..3] of string;
begin
  str:=TextInput[1];
   n:=1;
   word[1]:='';
   word[2]:='';
   word[3]:='';

 for i:=1 to length(str) do
    begin

  if (n<4) then
    begin
      if(str[i]='*') then
       begin
        inc(n);
       end;

    if(str[i]<>'*')then  // separator (flag identify)
     begin
       word[n]:=word[n]+str[i];
     end
  end;

 end;
end;

و پس از جدا سازی ، مقادیر در سه خانه از آرایه ی word قرار خواهند گرفت.
کاراکتر * جدا کننده میباشد.

تابع MessageBox یک مقدار عددی برمیگرداند که نتیجه ی انتخاب کاربر می باشد:
کد:
 NumOutput:= MessageBox(0,'Test','Word',1);

معادل عددی گزینه های خروجی از تابع MessageBox:
کد:
OK = 1
Cancel = 2
Abort = 3
Retry = 4
Ignor = 5
Yes = 6
No = 7
 
آخرین ویرایش:

splinter cell

Well-Known Member
سلام مجدد به Free Man عزیز!
به لطف راهنمایی های شما به یک نگرش تازه نسبت به مقوله پلاگین سازی برای بیلدر رسیدم و برای خودم چند تا پلاگین تمرینی، درباره کار با رشته ها و توابع ریاضی درست کرده بودم که با توضیح اخیر شما مبنی بر تلفیق پارامترهای ورودی با هم ،دوباره اونها رو بهینه سازی کردم.از این بابت از شما تشکر میکنم.
در حال حاضر سئوالم و البته درخواستم اینه که یک توضیح کلی پیرامون اینکه اگر بخوایم یکی ازVCL های استاندارد دلفی(مثل رادیوباتن یا چک باکس یا...) رو یعنوان پلاگین توی بیلدر استفاده کنیم باید چه طور عمل کنیم؟ یعنی احتیاج به وارد کردن فرمForm برای قرار دادن اون کامپوننت روی اون به پروژه هست؟ یا اینکه روش دیگه ای داره؟.با توجه به اینکه میدونم گرفتارید لذا تقاضای سمپل و سورس کد کردن زیاده خواهیه! و به یک توضیح قناعت میکنم.(مطمئناً توضیحات شما برای کسانی که بعداً این بحث رو دنبال کنند بسیار راه گشا خواهدبود)
یا حق!
 

Free Man

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

بله روش معمول برای افزودن آبجکت های موجود و استاندارد این است که ابتدا یک فرم (Form) به پروژه ی خود اضافه می کنید

و سپس اشیای مورد نظر را در آن قرار می دهید.

این کد را در قسمت Plugin وارد نمایید:
کد:
library Plugin;


uses
  SysUtils,
  Classes,
  PluginInterface,
  PluginFunctions,
  [B]PluginForm in 'PluginForm.pas' {MainForm};[/B]

{$R *.res}

begin

end.

باید به پروژه ی خود یک فرم اضافه کنید و آن را با نامی که روبروی واحد PluginForm

قرار دارد (PluginForm.pas) در مکان پروژه ذخیره نمایید ، این نام اخیاری می باشد.

MainForm نیز نام شی فرم می باشد.

در هر واحدی که قصد کد نویسی ای دارید که با فرم مرتبط می باشد ، باید نامد واحد فرم را (PluginForm)

در uses واحد نام برده قرار دهید.

البته روش های* دیگری هم وجود دارد که جهت کار با آنها باید وارد بحث تخصصی زبان های شی گرا شویم

که با موضوع انجمن و مبحث ما فاصله ی زیادی دارند.

*(استفاده از اشیا بعنوان پلاگین برای بیلدر)


موفق باشید.
 
آخرین ویرایش:

Silver PC

Well-Known Member
سلام به همه

چند تا سوال دارم

1 - چرا اس دی کا ها فارسی رو بر نمیگردونن ؟ کسی میتونه یکی با مثال بده که فارسی هم ساپورت کنه ؟

2 - من میخوام یه نفر یه نمونه بده که مثلا خودم بگم اگه طرف تو ام ام بی 1 رو وارد کرد بهش بگه سلام . کسی میتونه این طور چیزی برام بسازه ؟

دوستان خیلی برام مهمه
 

Free Man

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

اگر متغییر خروجی را String تعریف کنید مشکلی در ارسال کلمات فارسی به MMB پیش نخواهد آمد.
(TextOutput)

این هم یک SDK که از فارسی پشتیبانی می کند ، به همراه نمونه ای که با وارد کردن عدد یک

"سلام" را برگرداند.

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

پیوست ها

  • MMBPlugin, Delphi SourceCode Farsi Sample.zip
    51.5 کیلوبایت · بازدیدها: 74
آخرین ویرایش:

Free Man

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

UPX executable packer برنامه ای است که با آن می توانید فایل های EXE و DLL

خود را فشرده نمایید.

Alternate EXE Packer نرم افزاری رابط می باشد که با UPX و به روشی آسان فایل های

مورد نظرشما را فشرده می کند.

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

موفق باشید.
 

پیوست ها

  • EXEPacker.zip
    954 کیلوبایت · بازدیدها: 141

Silver PC

Well-Known Member
سلام
نمیدونم شاید خندتون بگیره ولی من هر چی تو سورس گشتم کلمه سلام رو ندیدم که مثلا بخوام تغییرش بدم
 

Free Man

کاربر متخصص مولتی مدیا بیلدر
این چند وقته نمی دونم چم شده ، هی قاطی می کنم !!! :-< :shock:

لینک دانلود اصلاح شده و سورس مرتبط در آن قرار دارد.
 

Silver PC

Well-Known Member
سلام
ببخشید این همه سوال می پرسم

حالا مثلا 1 بدیم سلام رو میگه

اگه بخواهیم بگیم اگر عددی بزرگتر از یک وارد شد بهمون بگه مثلا خداحافظ . باید چه کدی اضافه بشه ؟؟؟
 

Saman

مدیر انجمن مولتی مدیا بیلدر
دوست عزیز شما به جای پروسیجر farsi که این باشه :

کد:
///////////////////////////////////////////////////////////////
  procedure farsi; cdecl;

begin
   if NumInput[1]=1 then
    TextOutput:='سلام'
end;
///////////////////////////////////////////////////////////////

اینو بنویس و پلاگین رو کمپایل کن

کد:
///////////////////////////////////////////////////////////////
  procedure farsi; cdecl;

begin
   if NumInput[1]>1 then
    TextOutput:='خداحافظ'
end;
///////////////////////////////////////////////////////////////
 

Silver PC

Well-Known Member
سلام
خب این کد که محسن جان دادند عدد یک رو میگیره
حالا من اگه بخوام از 1 تا 200 بگیره باید چیکار کنم ؟ مثلا 2 بگه برو و الی آخر که هر کدوم جداگونه هستند
طبق راهنمایی های دوستان من باید تو همون پروسیجر فارسی کار رو ادامه بدم
میشه یه نفر نمونه بده ؟؟
مرسی
 

Silver Soft

کاربر متخصص مولتی مدیا بیلدر
برای این جور مقایسه ها ( تعداد بالا ) باید از دستور Case استفاده کنید ، دستور Case ساده شده ی if های تو در تو هست ، به این شکل :

کد:
procedure farsi; cdecl;
begin
   case [COLOR="Green"]NumInput[1] [/COLOR]of
      [COLOR="Red"]0[/COLOR]:TextOutput:='salam';
      [COLOR="#ff0000"]1[/COLOR]:TextOutput:='chetori';
      [COLOR="#ff0000"]2[/COLOR]:TextOutput:='bye';
   end;
end;

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

silvercover

کاربر متخصص
سلام
خب این کد که محسن جان دادند عدد یک رو میگیره
حالا من اگه بخوام از 1 تا 200 بگیره باید چیکار کنم ؟ مثلا 2 بگه برو و الی آخر که هر کدوم جداگونه هستند
طبق راهنمایی های دوستان من باید تو همون پروسیجر فارسی کار رو ادامه بدم
میشه یه نفر نمونه بده ؟؟
مرسی

به هیچ وجه منطقی نیست به این شکل تعداد به این زیادی رو مورد بررسی و مقایسه انجام بدید. سعی کنید از ساختمان های داده ( رکورد ، فایل باینری و نهایتا دیتابیس و...) برای انجام چنین مقاصدی استفاده کنید. تنها اگر قصد آموزش دارید این روش چند صد شرط و if شاید منطقی به نظر بیاد.
 
آخرین ویرایش:

Free Man

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

جوابها و رهنمایی های هر دو عزیز صحیح می باشد.

یکی از ساده ترین راه ها و سریع ترین آنها :


کد:
 var
 Answer: array[1..6] of string = ('One', 'Two', 'Three',
                                  'Four','Five','...');


implementation

///////////////////////////////////////////////////////////////
  procedure farsi; cdecl;
begin
   if NumInput[1]>0 then
   if NumInput[1]<7 then
   TextOutput:=Answer[NumInput[1]];
end;
///////////////////////////////////////////////////////////////
این برای شش عنصر می باشد ، شما می توانید به تعدادی معین که خواستید در آرایه تعریف نمایید.

البته این روش تا 65535 آیتم راجوابگو می باشد و از این بیشتر را با لینک لیست یا بانک داده ایجاد می کنند.
 

Silver PC

Well-Known Member
200 بخوام باید 1 تا 6 رو به 1 تا 200 تغییر بدم ؟
بعد ا.ونجا که به انگلیسی 1 تا 5 رو گفتین چیه ؟
کجا باید کارها رو بنویسم ؟
ممنون
 

Silver Soft

کاربر متخصص مولتی مدیا بیلدر
200 بخوام باید 1 تا 6 رو به 1 تا 200 تغییر بدم ؟
بعد ا.ونجا که به انگلیسی 1 تا 5 رو گفتین چیه ؟
کجا باید کارها رو بنویسم ؟
ممنون
کدی که جناب Free Man گزاشتن برای درخواست شما هست که میخواستین تا 200 برای هر عدد یه کلمه ی خاص برگردونه .
اون 1 تا 5 که به حروف انگلیسی نوشته شده همون کلماتی هست که شما میخواین برگردونده شه ( salam , bye و ... ) و به وسیله ی کدی که گزاشتن :
کد:
  [COLOR="Red"] if NumInput[1]>0 then[/COLOR]
   [COLOR="#ff0000"]if NumInput[1]<7 then[/COLOR]
   TextOutput:=Answer[NumInput[1]];
قسمت های قرمز رنگ ، چک میکنن که عدد بین 0 و 7 باشه . اگه این شرط برقرار بود از آرایه ی رشته ای که اون بالا بهش حروف انگلیسی رو دادن بر طبق شماره وارد شده یکی از عناصر آرایه رو برمیگردونه .

به جای اون 2 شرط هم میتونید از یک شرط استفاده کنید :
کد:
if (NumInput[1]>0) and (NumInput[1]<7) then
 

Silver PC

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

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

بالا