تبلیغات :
آکوستیک ، فوم شانه تخم مرغی، صداگیر ماینر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




صفحه 1 از 17 1234511 ... آخرآخر
نمايش نتايج 1 به 10 از 162

نام تاپيک: زبان Delphi : تمامی مباحث و مسائل

  1. #1
    مهمان
    تاريخ عضويت
    Mar 2005
    پست ها
    513

    پيش فرض زبان Delphi : تمامی مباحث و مسائل

    سلام دوستان
    اين هم تاپيک مربوط به زبان محبوب و مورد علاقه کارلوس و بسياري از برنامه نويسان خوب ايراني.
    اميدوارم دوست خوبم کارلوس اين تاپيک را با موضوعات جالبش منفجر کند

  2. #2
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    سلام
    رامبد جان دستت طلا اين شد يک کار درست و منطقی و من سی ميکنم بترکنم شما هم قسمت c# را منفجر کن دستت درد نکنه

  3. #3
    پروفشنال double_n's Avatar
    تاريخ عضويت
    Apr 2005
    محل سكونت
    the Shire
    پست ها
    900

    پيش فرض

    آقا اگه قراره بمبي منفجر بشه به ما هم بگيد تا اختياط كنيم :mrgreen:

    ايول
    ديگه ميدونيم از كجا اينجور مطالب رو بخونيم :arrow:

  4. #4
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

  5. #5
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

  6. #6
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

  7. #7
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    يكي از مشكلاتي كه بسياري از تازه كاران در دلفي با آن مواجه مي شوند اجراي فايلهاي ديگر يا اجراي دستورات shell است.

    در اين مقاله سعي ما بر اين است كه شما را با اجراي فايلهاي ديگر از درون دلفي و كنترل آنها آشنا كنيم. شما پس از خواندن اين مقاله خواهيد توانست به راحتي فايلهاي ديگر -و نه تنها exe- را از درون دلفي اجرا كنيد و حتي دستورات shell را نيز صادر كنيد. به عنوان مثال ممكن است بخواهيد يك فايل html را با Editor پيش فرض كاربر باز كنيد. يا يك فايل html را با Browser پيش فرض كاربر باز كنيد. يا شايد بخواهيد يك فايل BMP را با اديتور پيش فرض كاربر باز نماييد و يا اين كه يك فايل INF را نصب نماييد.

    با خواندن اين مقاله شما مي توانيد به راحتي به تمامي اين اهداف برسيد.
    تابع APIي وجود دارد به نام WinExec. شكل كلي اين تابع از اين قرار است:


    WinExec(lpCmdLine: PAnsiChar; uCmdShow: Cardinal);
    كه lpCmdLine خط دستور مورد نظر شما براي اجراي فايل و uCmdShow بايد يكي از مقادير زير را داشته باشد:
    SW_HIDE SW_MAXIMIZE SW_MINIMIZE
    SW_RESTORE SW_SHOW SW_SHOWDEFAULT
    SW_SHOWMAXIMIZED SW_SHOWMINIMIZED SW_SHOWMINNOACTIVE
    SW_SHOWNA SW_SHOWNOACTIVATE SW_SHOWNORMAL


    براي توضيحات بيشتر راجع به هر كدام از اين ثابت ها به راهنماي Windows SDK دلفي يا MSDN مراجعه كنيد.

    تابع WinExec تابع بسيار قديمي و محدودي است و ما قصد نداريم در اين مقاله بيشتر از اين راجع به اين تابع صحبت كنيم.

    تابع ديگري وجود دارد به نام ShellExecute. اين تابع در يونيت ShellAPI تعريف شده است. بنابر اين لازم است يونيت ShellAPI را در ليست uses يونيت خود وارد كنيد. اين يكي از توابع بسيار قدرتمند براي اجراي فايل است.
    نگاهي به شكل كلي اين تابع بياندازيد:



    function ShellExecute(hWnd: HWND; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST; stdcall;

    hWnd Handle پنجره اي كه اين دستور را فراخوانده است.
    Operation نوع دستوري مورد نظر جهت اجرا
    FileName نام فايل يا شاخه
    Parameters پارامترهاي مورد نظر در هنگام اجراي فايل exe
    Directory شاخه پيش فرض در هنگام اجراي فايل
    ShowCmd مشخص كننده چگوني نمايش فايل در هنگام اجرا


    پارامتر اول يك متغيير از نوع HWND است.
    لازم است براي كساني كه با مفهوم Handle در ويندوز آشنا نيستند توضيحاتي راجع به Handle بدهم. هر پنجره يا آبجكتي در ويندوز داراي يك Handle است كه براي دسترسي به آن پنجره يا آبجكت شما بايد از اين Handle استفاده كنيد. در واقع يك Handle يك عدد در مبناي 16 است. Handle يك عدد unique يا همتا است كه ويندوز آن را مقداردهي مي كند. اگر از يك پنجره دو Instance اجرا شده باشد (مثلا يك برنامه دو بار اجرا شده باشد) هر كدام از اين Instanceها يك Handle جداگانه دارند.
    با اين تفاصيل پارامتر اول Handle پنجره اي است كه اين دستور را صادر كرده است. شما براي اين پارامتر مي توانيد از Application.Handle استفاده كنيد و يا آن را برابر 0 قرار دهيد. به علاوه مي توانيد Handle يك برنامه ديگر را بدهيد.

    در صورتي كه شما مي خواهيد پيغام هاي اخطار آن فايل را دريافت كنيد يا آن را كنترل نماييد و يا تا اجراي كامل آن اجراي برنامه را متوقف كنيد با Handle برنامه خود را با استفاده از Application.Handle به اين پارامتر بدهيد.

    پارامتر دوم مشخص كننده وظيفه اي است كه قرار است انجام شود. اين پارامتر مقادير پيش فرضي ندارد و بستگي به خصوصيات فايل اجرايي دارد. روي يك فايل از نوع Text كليد سمت راست ماوس را بزنيد. احتمالا موارد بالاي ليست "open"، "Edit with ..." , "print" است. هر كدام از اين رشته هاي مي توانند يك عمليات يا Operation باشند. به عنوان مثال شما مي خواهيد يك فايل Text را چاپ كنيد. در اين صورت كافي است از عبارت print به عنوان operation استفاده كنيد. يا مي خواهيد يك فايل rar را با استفاده از WinRar باز كنيد. در اين صورت مي توانيد از "Extract files" استفاده كنيد. حتما تا به حال متوجه شده ايد كه دستور ShellExecute چه مقدار انعطاف پذير است. با استفاده از اين فرمان مي توانيد هر گونه دستور Shell را اجرا نماييد.

    پارامتر سوم مشخص كننده نام فايل يا شاخه اي است كه شما مي خواهيد عمليات بر روي آن انجام شود.
    پارامتر چهارم ليست پارامترهايي است كه تمايل داريد فايل exe با اين پارامترها اجرا شود. پارامترها پنجم نيز نام شاخه پيش فرض در هنگام اجراي فايل مورد نظر شماست. اگر شما فايل exe اي را اجرا كنيد و اين فايل exe بخواهد از شاخه جاري فايلهاي اضافه اي را استفاده كند ويندوز شاخه جاري را به اون مطابق با اين شاخه اطلاع خواهد داد. و اما آخرين پارامتر مشخص كننده شكل اجراي فايل است. مقدار اين پارامتر مي تواند يكي از ثابت هايي ليستي باشد كه در ابتداي اين مقاله عنوان شد. به عنوان مثال شما مي توانيد از SW_HIDE استفاده كنيد كه در اين صورت فايل اجراي شما مخفي خواهد بود و يا از SW_SHOWMINIMIZE استفاده كنيد كه در اين صورت برنامه شما Minimizeشده اجرا مي شود.

    و حالا به يك نكته خيلي مهم توجه كنيد:
    1- رشته هاي اين تابع از نوع PChar هستند بنابراين شما بايد رشته هاي string را به صورت PChar به اين تابع بدهيد. شما مي توانيد به طور عادي رشته مورد نظر خود را به اين تابع بدهيد و يا در صورتي كه رشته مورد نظر شما string است بايد با استفاده با استفاده از دستور PChar آن را Typecast كنيد. به عنوان مثال:


    ShellExecute(0, 'open', PChar(ExtractFilePath(Application.ExeName) + 'test.exe') , '', '', SW_SHOWNORMAL);

    در اين مثال با استفاده از تابع ExtractFilePath و Application.ExeName كه حاوي آدرس كامل فايل Exe است شاخه اي كه فايل exe در آن قرار دارد را پيدا كرده ايم و سپس فايل test.exe را كه در كنار فايل اصلي اجرايي وجود دارد را به آن اضافه كرده ايم. كل اين عبارت TypeCast شده است به PChar.
    جهت اطلاع كساني كه نمي دانند TypeCast چيست. TypeCast فرآيندي است كه شما متغيير يا Objectي را از يك نوع به نوع ديگري تبديل ميكنيد. كد زير را نگاه كنيد و با نوع پيشرفته تري از TypeCast آشنا شويد:



    procedure TForm1.Button1Click(Sender: TObject); begin TButton(Sender).Caption := 'Test'; end;

    در اين مثال Sender را از نوع TObject است TypeCast كرده ايم به TButton. و پراپرتي Caption آنرا تغيير داده ايم. براي اطلاعات بيشتر راجع به TypeCast به كتب دلفي مراجعه كنيد.


    و اجازه دهيد به چند مثال جالب نيز نگاهي بياندازيم:
    edit كردن يك فايل HTML با Editor پيش فرض HTML:

    ShellExecute(Handle, 'edit', 'test.htm', '', '', SW_SHOW);
    نصب يك فايل INF


    ShellExecute(Handle, 'install', 'divx.inf', '', '', SW_SHOW);
    فشرده ساختن يك فايل با استفاده از winrar و ارسال آن به ايميل:


    ShellExecute(Handle, 'compress and mail...', 'test.file', '', '', SW_SHOW);
    ارسال ايميل به [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ] و با موضوع "Great Article":


    ShellExecute(0, 'open', 'mailto:mamouri@ganjafzar.com?subject=GreatArticle ', '', '', SW_SHOWNORMAL);
    چگونه يك فايل exe را اجرا كنيم و تا اتمام آن برنامه را متوقف كنيم؟


    uses ShellAPI;
    ...
    function ExecAndWait(const ExecuteFile, ParamString : string): boolean;
    var
    SEInfo: TShellExecuteInfo;
    ExitCode: DWORD;
    begin
    FillChar(SEInfo, SizeOf(SEInfo), 0);
    SEInfo.cbSize := SizeOf(TShellExecuteInfo);
    with SEInfo do
    begin
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd := Application.Handle;
    lpFile := PChar(ExecuteFile);
    lpParameters := PChar(ParamString);
    nShow := SW_HIDE;
    end;
    if ShellExecuteEx(@SEInfo) then
    begin
    repeat
    Application.ProcessMessages;
    GetExitCodeProcess(SEInfo.hProcess, ExitCode);
    until (ExitCode <> STILL_ACTIVE) or
    Application.Terminated;
    Result:=True;
    end
    else Result:=False;
    end;



    همان طور كه ملاحظه مي كنيد اين تابع به يونيت ShellAPI نياز دارد و بايد اين يونيت را در ليست uses يونيت خود اضافه كنيد.
    در اين تابع از تابع ديگري به نام ShellExecuteEx استفاده شده است. اين تابع بر خلاف ShellExecute فقط يك پارامتر دارد كه بايد برابر متغييري از نوع TShellExecuteInfo قرار بدهيد. در ابتدا بايد با استفاده از تابع FillChar آنرا مقداردهي كنيد و وجود آنرا به ويندوز اطلاع دهيد. در واقع آن را Create كنيد:


    FillChar(SEInfo, SizeOf(SEInfo), 0); SEInfo.cbSize := SizeOf(TShellExecuteInfo);

    آبجكت ShellExecuteEx داراي پارامترهاي زير است:


    cbSize: DWORD;
    fMask: ULONG;
    Wnd: HWND;
    lpVerb: PAnsiChar;
    lpFile: PAnsiChar;
    lpParameters: PAnsiChar;
    lpDirectory: PAnsiChar;
    nShow: Integer;
    hInstApp: HINST;


    براي اطلاعات بيشتر راجع به اين پارامترها به راهنماي Windows SDK دلفي يا MSDN مراجعه كنيد. خروجي اين تابع از نوع boolean است و مشخص كننده اين است كه آيا اين تابع با موفقيت اجرا شده است يا نه؟
    تابع ExecAndWait پس از اين كه اطمينان پيدا كرد كه فايل با موفقيت اجرا شده است يك حلقه repeat..until تشكيل داده. در داخل repeat دستور Application.ProcessMessage صادر شده است تا برنامه بتواند messageها را دريافت كند. سپس با استفاده از GetExitCodeProcess مقدار خروجي پروسس اجرا شده دريافت مي گردد. در صورتي كه خروجي اين تابع مخالف STILL_ACTIVE بود (كه نشانگر اجراي پروسس است) حلقه با كار خود ادامه مي دهد.

    خروجي اين تابع مشخص كننده اجرا يا عدم اجراي فايل اجرايي است.

    و حالا به چند مثال جالب ديگر توجه كنيد:
    1- دسترسي به HotMail از درون دلفي:


    program dummy;
    var ToAddress: string;
    EightSpaces: string;
    begin
    ToAddress := 'john@pacbell.net';
    // Don't know why but this is required to get the
    // correct compose address...
    EightSpaces := ' ';
    ShellExecute(Handle, PChar('open'), PChar('rundll32.exe'), PChar('C:\PROGRA~1\INTERN~1\HMMAPI.DLL,MailToProto colHandler' + EightSpaces + ToAddress), nil, SW_NORMAL)
    end.

    2- نمايش ديالوگ مشخصات يك فايل:



    procedure ShowPropertiesDialog(Filename: string);
    var
    SEI: TShellExecuteInfo;
    begin
    FillChar(SEI, SizeOf(SEI), 0);
    with SEI do
    begin
    cbSize := SizeOf(SEI);
    lpFile := PChar(Filename);
    lpVerb := 'properties';
    fMask := SEE_MASK_INVOKEIDLIST;
    end;
    ShellExecuteEx(@SEI);
    end;


    3- اجراي ديالوگ Screen ويندوز (Control Panel > Display)


    ShellExecute(HInstance, nil, PCHAR('rundll32.exe'), PCHAR('shell32.dll, Control_RunDLL desk.cpl, , 3') { 3 is the tab index }, NIL, 1);

    همان طور كه متوجه شديد 3 شماره Tabي است كه مورد نظر شماست.

    4- يك مثال كامل تر از فرستادن ايميل با استفاده از Outlook يا ارسال كننده پيش فرض email:


    var
    mail: string;
    begin
    mail := 'mailto:you@you.com' +
    '?subject=hello' +
    '&cc=me@me.com' +
    '&body=Delphi is cool! ';
    ShellExecute(Self.Handle, 'open', PChar(mail), nil, nil, SW_SHOWNORMAL);

    خروجي هاي تابع ShellExecute يا ShellExecuteEx

    خروجي هاي اين دو تابع مي تواند يكي از مقادير زير باشد:

    0 سيستم عامل داراي resourceهاي كافي يا حافظه كافي جهت اجرا نيست.
    ERROR_FILE_NOT_FOUND فايل مورد نظر پيدا نشد.
    ERROR_PATH_NOT_FOUND آدرس مشخص شده پيدا نشد.
    ERROR_BAD_FORMAT فايل EXE نامعتبر است يا اين يك فايل EXE از نوع Win32 نيست.
    SE_ERR_ACCESSDENIED سيستم عامل دسترسي به فايل مشخص شده ندارد.
    SE_ERR_ASSOCINCOMPLETE association فايل مورد نظر شما ناقص يا نامعتبر است. مثلا مشخص نشده كه فايل bmp كه شما مي خواهيد آن را اجراه كنيد بايد با چه برنامه اي باز شود.
    SE_ERR_DDEBUSY DDE transaction مربوطه كامل نشد زيرا DDE transactionهاي ديگري در حال اجرا بودند.
    SE_ERR_DDEFAIL DDE transaction ناموفق بود.
    SE_ERR_DDETIMEOUT DDE transaction نتوانست اجرا شود زيرا درخواست Time Out شد.
    SE_ERR_DLLNOTFOUND فايل dynamic-link library يا dll مشخص شده پيدا نشد.
    SE_ERR_FNF فايل مورد نظر پيدا نشد.
    SE_ERR_NOASSOC هيچ برنامه اي با پسوند فعلي فايل منطبق نشده است. مثلا مشخص نشده كه فايل bmp كه شما مي خواهيد آن را اجراه كنيد بايد با چه برنامه اي باز شود.
    SE_ERR_OOM حافظه كافي جهت اجراي عمليات وجود ندارد.
    SE_ERR_PNF آدرس مشخص شده پيدا نشد.
    SE_ERR_SHARE يك خطاي sharin violation پيش آمد. يعني فايل مورد نظر share شده بود.


    خلاصه:
    در اين مقاله با سه تابع API مهم به نام هاي WinExec و ShellExecute و ShellExecuteEx آشنا شديم و پارامترهاي آنها را بررسي كرديم. به علاوه مثالهاي متعددي راجع به استفاده از ShellExecute ارائه داديم. به علاوه ثابتهاي استفاده شده در اين تابع ها را ليست كرده و بعضا آنها را مورد بررسي قرار داديم. همچنين تابعي به نام ExecAndWait ارائه داديم كه كار آن اجراي يك فايل exe و متوقف كردن برنامه تا اتمام فايل exe آشنا شديم و ساختمان داخلي اين تابع را مورد بررسي قرار داديم.

    موفق و مويد و منصور باشيد

  8. #8
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    يكي از فرمتهاي محبوب وب است و به راحتي مي توان برايflash ساخت Interfaceها در برنامه از آن استفاده كرد. بعضي از برنامه نويسان معتقدند استفاده از Flash سبب سنگين شدن برنامه، وابستگي برنامه به ActiveX فلش، امكان نداشتن تبادل اطلاعات بين Flash و دلفي و مشكلات ديگري مي شود.
    در اين مقاله خواهيد ديد كه به راحتي تمامي اين مشكلات را مي توانيد رفع كنيد.

    نصب ActiveX فلش
    براي نصب ActiveX فلش به Component>Import ActiveX Control برويد. در ليست مربوطه به دنبال Shockwave Flash بگرديد. در صورتي كه آن را پيدا نكرديد. دكمه Add را زده و به آدرس زير برويد:

    WIN_DIRECTORY\System32\Macromed\Flash

    و فايل Flash.ocx را انتخاب كنيد و سپس Install را بزنيد.
    خوب ... تا به اينجا كار نصب اكتيوايكس فلش تمام است. كمپوننت مربوطه را ميتوانيد در پالت ActiveX پيدا كنيد.
    نكته: در صورتي كه شاخه مذكور در كامپيوتر شما وجود ندارد، احتمالا شما Flash Player را نصب نكرده‌ايد.
    البته نگران نباشيد، با شيوه اي كه در اين مقاله ذكر شده كاربر شما بدون نياز به نصب Flash Player مي تواند برنامه شما را اجرا كند.

    استفاده از اكتيوايكس فلش
    اكتيوايكس فلش را مي‌توانيد در پالت ActiveX پيدا كنيد. آن را روي فرمتان قرار دهيد. از پراپرتيMovie ميتوانيد براي Load كردن فايل SWF خود استفاده كنيد.
    به باقى پراپرتى‌هاى اكتيوايكس فلش دقت كنيد:
    (البته توضيحات پراپرتى‌ها را به صورت انگليسى آورده‌ام. چون نوشتن آنها به صورت فارسى زياد جالب نيست. به خاطر اينكه پر از لغاتى هستند كه ترجمه‌شون غير ممكن است.)

    ReadyState (get only)
    0=Loading, 1=Uninitialized, 2=Loaded, 3=Interactive, 4=Complete.

    TotalFrames (get only) Returns the total number of frames in the movie. This is not available until the movie has loaded. Wait for ReadyState = 4.

    FrameNum (get or set) The currently displayed frame of the movie. Setting this will advance or rewind the movie.

    Playing (get or set) True if the movie is currently playing, false if it is paused.

    Quality (get or set) The current rendering quality (0=Low, 1=High, 2=AutoLow, 3=AutoHigh). This is the same as the QUALITY parameter.

    ScaleMode (get or set) Scale mode (0=ShowAll, 1= NoBorder, 2 = ExactFit). This is the same as the SCALE parameter.

    AlignMode (get or set) The align mode consists of bit flags. (Left=+1, Right=+2, Top=+4, Bottom=+8). This is the same as the SALIGN parameter.

    BackgroundColor (get or set) Override the background color of a movie. An integer of the form red*65536+green*256+blue use -1 for the default movie color.

    Loop (get or set) True if the animation loops, false to play once. Same as the MOVIE parameter.
    Movie (get or set) The URL source for the Flash Player movie file. Setting this will load a new movie into the control. Same as the MOVIE parameter.


    متدها:


    Play() Start playing the animation.

    Stop() Stop playing the animation.

    Back() Go to the previous frame.

    Forward() Go to the next frame.

    Rewind() Go to the first frame.

    SetZoomRect(int left, int top, int right, int bottom) Zoom in on a rectangular area of the movie. Note that the units of the coordinates are in twips (1440 units per inch). To calculate a rectangle in Flash, set the ruler units to Points and multiply the coordinates by 20 to get TWIPS.

    Zoom(int percent) Zoom the view by a relative scale factor. Zoom(50) will double the size of the objects in the view. Zoom(200) will reduce the size of objects in the view by one half.

    Pan(int x, int y, int mode) Pan a zoomed in movie. The mode can be: 0 = pixels, 1 = % of window.


    نصب اكتيوايكس فلش روي كامپيوتر كاربر
    براي اين كه كاربر نهايي بتواند از برنامه شما استفاده كند بايد اكتيوايكس فلش را داشته باشد. در واقع شما بايد اكتيوايكس مربوطه را براي او نصب كند. روش كار به اين گونه است كه شما بايد چك كنيد كه آيا كاربر نهايي اكتيوايكس فلش را بر روي دستگاه خود نصب كرده است يا نه و در صورتي كه وي اين اكتيوايكس را ندارد برنامه شما بايد به طور اتوماتيك آن را نصب كنيد.
    براي پياده سازي اين روش ما بايد در ابتدا OCX فلش را با استفاده از Resourceها در فايل Exe خود مخلوط كنيم. در صورتي كه شما با Resourceها آشنايي نداريد نگران نباشيد. مراحل زير را انجام دهيد و باقي كار را به دلفي بسپاريد: 1- يك فايل Text بسازيد و اسم آن را SWFActivex.rc بگذاريد
    2- خطوط زير را در آن قرار دهيد:

    FlashOCX EXTRA Flash.ocx

    و فايل Flash.ocx را از مسيري كه قبلا ذكر شد در شاخه پروژه خود قرار دهيد.
    3- آن را ضبط كنيد و با استفاده از BRCC32.EXE كه در شاخه Bin محل نصب دلفي وجود دارد، آن را كامپايل كنيد. (خط زير را در Command Line تايپ كنيد يا به سادگي فايل SWFActivex.rc را بر روي فايل BRCC32.EXE دراگ (Drag) كنيد.

    BRCC32.EXE MyExeRes.rc

    خوب حالا شما يك فايل Resource كامپايل شده داريد به نام SWFActivex.res داريد.
    4- خطوط زير را در در سورس كد فرم اصلي خود قرار دهيد:

    ...
    ...
    implementation
    ...
    ...
    ...
    {$R *.dfm}
    {$R SWFActivex.RES}
    5- حالا اين تابع را به كد خود اضافه كنيد:

    function GetResourceFile(S : string; FilePath : string) : Boolean;
    var
    Res : TResourceStream;
    begin
    Result := True;
    if S <> '' then
    begin
    if FindResource(hInstance, PChar(S), Pchar('EXTRA')) = 0 then
    begin
    Result := False;
    Exit;
    end;
    try
    Res := TResourceStream.Create(hInstance, S, Pchar('EXTRA'));
    except
    Result := False;
    Exit;
    end;
    if FileExists(FilePath) then DeleteFile(FilePath);
    try
    Res.SaveToFile(FilePath);
    except
    Result := False;
    end;
    Res.Free;
    end;
    end;


    6- اين تابع را نيز اضافه كنيد:

    function GetSystemDir : string;
    var
    SysPath : PChar;
    begin
    GetMem(SysPath, MAX_PATH + 1);
    GetSystemDirectory(SysPath, MAX_PATH);
    Result := StrPas(SysPath)+ '\';
    FreeMem(SysPath, MAX_PATH + 1);
    end;



    7- خوب! حالا بگذاريد به مهمترين قسمت قضيه يعني Register كردن OCX مربوطه بپردازيم. در ابتدا يونيت ActiveX را به ليست uses خود اضافه كنيد. سپس تابع زير را نيز به سورس خود اضافه نماييد.

    function RegisterOCX( OCXFileName : string; Flag : Boolean) : Boolean;
    var
    OCXHand: THandle;
    RegFunc: TDllRegisterServer;
    OCXFileNamePtr : PChar;
    begin
    Result := True;
    if not FileExists( OCXFileName ) then
    begin
    Result := False;
    Exit;
    end;
    GetMem(OCXFileNamePtr, Length(OCXFileName) + 1);
    StrPCopy(OCXFileNamePtr, OCXFileName);
    OCXHand:= LoadLibrary(OCXFileNamePtr);
    FreeMem(OCXFileNamePtr, Length(OCXFileName) + 1);
    OCXFileNamePtr := nil;
    if OCXHand = 0 then
    begin
    Result := False;
    Exit;
    end;
    if Flag then
    RegFunc:= GetProcAddress(OCXHand, 'DllRegisterServer')
    else
    RegFunc:= GetProcAddress(OCXHand, 'DllUnregisterServer');

    if RegFunc = S_OK then
    Result := False;

    FreeLibrary(OCXHand);
    end;


    8- اين سه متغيير را نيز به كد خود اضافه كنيد:

    var
    FilePath : string;
    FlashOCX: TShockwaveFlash;




    9- تابع زير را نيز اضافه كنيد:

    function CreateFlashOCX : Boolean;
    var
    FilePath : string;
    begin
    Result := True;
    FilePath := GetSystemDir + 'Macromed\Flash\Flash.ocx';
    if not GetResourceFile('FlashOCX', FilePath) then
    begin
    Result := False;
    Exit;
    end;
    try
    FlashOCX := TShockwaveFlash.Create(nil);
    except
    if not RegisterOCX(FilePath, True) then
    Result := False
    else
    try
    FlashOCX := TShockwaveFlash.Create(nil);
    except
    Result := False;
    end;
    end;
    end;




    10- كدهاي زير را به انتهاي فايل خود، قبل از .end اضافه كنيد:


    initialization
    CoInitialize(nil);
    if not CreateFlashOCX then
    ShowMessage('An Error Occured!' + #13 + 'Program dosent run correctly!');
    finalization
    if Assigned(FlashOCX) then
    begin
    try
    FlashOCX.Free;
    FlashOCX := nil;
    except
    end;
    DeleteFile(FilePath);
    end;
    CoUninitialize;
    end.

    end.


    11- در اونت OnCreate فرم خودتون به راحتي از كمپوننت مربوطه استفاده كنيد:

    FlashOCX.Parent := Form1;
    FlashOCX.Movie := ExtractFilePath(Application.ExeName) + 'Main.swf';
    FlashOCX.Play;


    Resize شدن درست
    يكي از مشكلاتي كه ممكن است با اكتيو ايكس فلش پيدا كنيد مشكل Resize شدن است. همه ما مي دانيم كه يكي از مهمترين مزاياي فلش برداري بودن آن است و اين برداري بودن سبب مي شود كه فايل فلش بتواند در هر اندازه به درستي نشان داده شود. ولي متاسفانه فرم خود را در RunTime تغييراندازه مي دهيد فايل Flash تغيير اندازه نمي يابد. در اين جا يك راه حل ساده براي حل اين مشكل بيان شده كه به خوبي كار ميكند. كافي است كمپوننت فلش را در يك پانل قرار دهيد و پراپرتي Align آن را برابر alClient بگذاريد. حالا پراپرتي Anchor پانل خود را به گونه‌اي تنظيم كنيد كه مايل هستيد كمپوننت فلش Resize شود. سپس در اونت OnResize فرم خود، خطوط زير را درج كنيد:
    FlashOCX.Parent := nil;
    FlashOCX.Parent := Self;


    غيرفعال كردن كليك سمت راست
    مساله ديگرى كه ذهن بسيارى از برنامه‌نويسان را مشغول مى‌كند منوى Popup فلش است. غيرفعال كردن اين منو بسيار ساده است. كافي است يك كمپوننت TApplicationEvents را روي فرم خود قرار دهيد و كد زير را در اونت OnMessage اين كمپوننت بنويسيد:


    if (Msg.message = WM_RBUTTONDOWN) and (Msg.hwnd := FlashOCX) then
    begin
    PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
    Handled := True;
    end;



    ارتباط بين Flash و دلفى
    يكى از مسائل بسيار مهم و اساسى ديگر برقرارى ارتباط بين Flash و دلفي است. فرض كنيد در فايل SWF خود چند Button داشته باشيد و بخواهيد وقتى كاربر روى هر كدام از اين اونتها كليك كرد فرم خاصى باز شود. در اين صورت چه بايد بكنيد. پياده سازى اين كار بسيار ساده است. كافى است در Flash براى هر كدام از دكمه‌هاى خود يك Action تعريف كنيد و از دستور FSCommand استفاده نماييد. از يك مقدار دلخواه مثل fMatn يا fSearch استفاده كنيد و در دلفى نيز از اونت OnFSCommand به صورت زير استفاده كنيد:

    if command = 'fMain' then fMain.ShowModal;
    if command = 'fSearch' then fSearch.ShowModal;




    خوب! فكر كنم با توضيحاتى كه در اين مقاله اومده، قانع شده باشيد كه Flash يكى از بهترين راه حلها براى طراحى Interfaceهاست.
    تا مقاله بعد .... به اميد ديدار

  9. #9
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    چگونه با استفاده از شيوه Boyer-Moore جستجو كنيم؟
    راه حل اول:



    unit BMSearch;

    interface

    type
    {$IFDEF WINDOWS}
    size_t = Word;
    {$ELSE}
    size_t = LongInt;
    {$ENDIF}

    type
    TTranslationTable = array[char] of char; { translation table }
    TSearchBM = class(TObject)
    private
    FTranslate: TTranslationTable; { translation table }
    FJumpTable: array[char] of Byte; { Jumping table }
    FShift_1: integer;
    FPattern: pchar;
    FPatternLen: size_t;
    public
    procedure Prepare(Pattern: pchar; PatternLen: size_t; IgnoreCase: Boolean);
    procedure PrepareStr(const Pattern: string; IgnoreCase: Boolean);
    function Search(Text: pchar; TextLen: size_t): pchar;
    function Pos(const S: string): integer;
    end;

    implementation

    uses
    SysUtils;

    {Ignore Case Table Translation}

    procedure CreateTranslationTable(var T: TTranslationTable; IgnoreCase: Boolean);
    var
    c: char;
    begin
    for c := #0 to #255 do
    T[c] := c;
    if not IgnoreCase then
    exit;
    for c := 'a' to 'z' do
    T[c] := UpCase(c);

    { Mapping all accented characters to their uppercase equivalent }

    T['Á'] := 'A';
    T['À'] := 'A';
    T['Ä'] := 'A';
    T['Â'] := 'A';

    T['á'] := 'A';
    T['à'] := 'A';
    T['ä'] := 'A';
    T['â'] := 'A';

    T['É'] := 'E';
    T['È'] := 'E';
    T['Ë'] := 'E';
    T['Ê'] := 'E';

    T['é'] := 'E';
    T['è'] := 'E';
    T['ë'] := 'E';
    T['ê'] := 'E';

    T['Í'] := 'I';
    T['Ì'] := 'I';
    T['Ï'] := 'I';
    T['Î'] := 'I';

    T['í'] := 'I';
    T['ì'] := 'I';
    T['ï'] := 'I';
    T['î'] := 'I';

    T['Ó'] := 'O';
    T['Ò'] := 'O';
    T['Ö'] := 'O';
    T['Ô'] := 'O';

    T['ó'] := 'O';
    T['ò'] := 'O';
    T['ö'] := 'O';
    T['ô'] := 'O';

    T['Ú'] := 'U';
    T['Ù'] := 'U';
    T['Ü'] := 'U';
    T['Û'] := 'U';

    T['ú'] := 'U';
    T['ù'] := 'U';
    T['ü'] := 'U';
    T['û'] := 'U';

    T['ñ'] := 'Ñ';
    end;

    {Preparation of the jumping table}

    procedure TSearchBM.Prepare(Pattern: pchar; PatternLen: size_t; IgnoreCase: Boolean);
    var
    i: integer;
    c, lastc: char;
    begin
    FPattern := Pattern;
    FPatternLen := PatternLen;
    if FPatternLen < 1 then
    FPatternLen := strlen(FPattern);
    {This algorythm is based on a character set of 256}
    if FPatternLen > 256 then
    exit;
    {1. Preparing translating table}
    CreateTranslationTable(FTranslate, IgnoreCase);
    {2. Preparing jumping table}
    for c := #0 to #255 do
    FJumpTable[c] := FPatternLen;
    for i := FPatternLen - 1 downto 0 do
    begin
    c := FTranslate[FPattern[i]];
    if FJumpTable[c] >= FPatternLen - 1 then
    FJumpTable[c] := FPatternLen - 1 - i;
    end;
    FShift_1 := FPatternLen - 1;
    lastc := FTranslate[Pattern[FPatternLen - 1]];
    for i := FPatternLen - 2 downto 0 do
    if FTranslate[FPattern[i]] = lastc then
    begin
    FShift_1 := FPatternLen - 1 - i;
    break;
    end;
    if FShift_1 = 0 then
    FShift_1 := 1;
    end;

    procedure TSearchBM.PrepareStr(const Pattern: string; IgnoreCase: Boolean);
    var
    str: pchar;
    begin
    if Pattern <> '' then
    begin
    {$IFDEF Windows}
    str := @Pattern[1];
    {$ELSE}
    str := pchar(Pattern);
    {$ENDIF}
    Prepare(str, Length(Pattern), IgnoreCase);
    end;
    end;

    {Searching Last char & scanning right to left}

    function TSearchBM.Search(Text: pchar; TextLen: size_t): pchar;
    var
    shift, m1, j: integer;
    jumps: size_t;
    begin
    result := nil;
    if FPatternLen > 256 then
    exit;
    if TextLen < 1 then
    TextLen := strlen(Text);
    m1 := FPatternLen - 1;
    shift := 0;
    jumps := 0;
    {Searching the last character}
    while jumps <= TextLen do
    begin
    Inc(Text, shift);
    shift := FJumpTable[FTranslate[Text^]];
    while shift <> 0 do
    begin
    Inc(jumps, shift);
    if jumps > TextLen then
    exit;
    Inc(Text, shift);
    shift := FJumpTable[FTranslate[Text^]];
    end;
    { Compare right to left FPatternLen - 1 characters }
    if jumps >= m1 then
    begin
    j := 0;
    while FTranslate[FPattern[m1 - j]] = FTranslate[(Text - j)^] do
    begin
    Inc(j);
    if j = FPatternLen then
    begin
    result := Text - m1;
    exit;
    end;
    end;
    end;
    shift := FShift_1;
    Inc(jumps, shift);
    end;
    end;

    function TSearchBM.Pos(const S: string): integer;
    var
    str, p: pchar;
    begin
    result := 0;
    if S <> '' then
    begin
    {$IFDEF Windows}
    str := @S[1];
    {$ELSE}
    str := pchar(S);
    {$ENDIF}
    p := Search(str, Length(S));
    if p <> nil then
    result := 1 + p - str;
    end;
    end;

    end.




    راه حل دوم:
    اين يك دمو براى الگوريتم جستجوى Boyer-Moore است. ايده بسيار ساده است. در ابتدا يك فهرست از رشته‌هاى مورد نظر جهت جستجو ساخته و سپس روتين BMsearch را صدا مى‌كنيم. فراموش نكنيد كه در برنامه نهايى خود Range Checking را با سوييج {$R-} خاموش كنيد. در غير اينصورت جستجو 2 الى 3 ساعت بيشتر از زمان عادي طول مي‌كشد.



    {Public-domain demo of Boyer-Moore search algorithm.
    Guy McLoughlin - May 1, 1993.}

    program DemoBMSearch;

    {Boyer-Moore index table data definition}
    type
    BMTable = array[0..127] of byte;

    {Create a Boyer-Moore index table to search with.}

    procedure Create_BMTable(Pattern: string; var BMT: BMTable);
    var
    Index: byte;
    begin
    fillchar(BMT, sizeof(BMT), length(Pattern));
    for Index := 1 to length(Pattern) do
    BMT[ord(Pattern[Index])] := (length(Pattern) - Index)
    end;

    {Boyer-Moore Search function. Returns 0 if string is not found. Returns 65,535 if
    BufferSize is too large, ie: greater than 65,520 bytes.}

    function BMsearch(var Buffer; BuffSize: word; var BMT: BMTable; Pattern: string): word;
    var
    Buffer2: array[1..65520] of char absolute Buffer;
    Index1, Index2, PatSize: word;
    begin
    if (BuffSize > 65520) then
    begin
    BMsearch := $FFFF;
    exit
    end;
    PatSize := length(Pattern);
    Index1 := PatSize;
    Index2 := PatSize;
    repeat
    if (Buffer2[Index1] = Pattern[Index2]) then
    begin
    dec(Index1);
    dec(Index2)
    end
    else
    begin
    if (succ(PatSize - Index2) > (BMT[ord(Buffer2[Index1])])) then
    inc(Index1, succ(PatSize - Index2))
    else
    inc(Index1, BMT[ord(Buffer2[Index1])]);
    Index2 := PatSize
    end;
    until
    (Index2 < 1) or (Index1 > BuffSize);
    if (Index1 > BuffSize) then
    BMsearch := 0
    else
    BMsearch := succ(Index1)
    end;

    type
    arby_64K = array[1..65520] of byte;

    var
    Index: word;
    st_Temp: string[10];
    Buffer: ^arby_64K;
    BMT: BMTable;

    begin
    new(Buffer);
    fillchar(Buffer^, sizeof(Buffer^), 0);
    st_Temp := 'Gumby';
    move(st_Temp[1], Buffer^[65516], length(st_Temp));
    Create_BMTable(st_Temp, BMT);
    Index := BMSearch(Buffer^, sizeof(Buffer^), BMT, st_Temp);
    writeln(st_Temp, ' found at offset ', Index)
    end.

  10. #10
    آخر فروم باز Nesta's Avatar
    تاريخ عضويت
    Jan 2005
    محل سكونت
    tehran
    پست ها
    3,343

    پيش فرض

    با سلام

    Microsoft Agent يكي از سرگرم كننده ترين فن آوريهاي Microsoft مي باشد كه تا كنون توانسته بسيار مورد علاقه كاربران قرار بگيرد. Agentها به برنامه هاي شما جذابيت زيادي مي دهند و امكان ارتباط بهتر و جالبتري را با كاربر ايجاد ميكنند. در اينجا من مي خواهم شما را با Microsoft Agent و طريقه بكار گيري آن در برنامه هاي خودتان را آموزش بدهم كه اميدوارم مفيد باشد. از آنجايي كه من اين امكان را در دلفي استفاده كرده ام براي شما هم مثالهاي دلفي آورده ام ...

    اولين باري كه از اين تكنولوژي استفاده شد در برنامه Office 97 بود كه خيلي مورد علاقه كاربران قرار گرفت. من اون موقع خيلي گشتم تا بتونم از اين امكان استفاده كنم ولي خوب نتونستم ): اما بعد ها با پيشرفت كردن علم برنامه نويسي و همچنين با پيشرفت كردن عقل Microsoft (كه از نظر من بزرگترين كلاه بردار قرن هست) اين تكنولوژي در اختيار ديگران هم قرار گرفت... براي همين در اوايل فقط در Office بود كه از اين امكان استفاده مي شد.

    حالا اينا رو گفتم اما ببينيم اصلاً Agent چي هست؟؟!!!

    شما اگه از Office استفاده ميكنيد حالا هر كدوم از برنامه هاش كه باشه (Word,Excel,FrontPage,...) يك شكلكي رو ميبينيد كه هميشه نسبت به كارهايي كه انجام ميدين يك سري حركات از خودش نشون ميده كه هم سرگرم كننده هست هم آموزنده. حالا حتماً متوجه شدين كه در مورد چي صحبت ميكنيم (هر چند كه ميدونم ميدونستيد (; ) خوب حالا مي خواهيم ببينيم كه چطور ميشه از اين امكان تو برنامه هاي خودمون استفاده كنيم مثلاً وقتي برنامه داره كار ميكنه يه شكلكي بياد براي كاربر ادا در بياره تا طرف نفهمه كه برنامه چيكار ميكنه (: يا مثلا موقع ذخيره كردن و بازيابي كردن و يا جستجو و ... يك سري حركات مربوط به آن عمل انجام بده...

    اينكار خيلي ساده است و فقط كافي هست شما يك Agent رو انتخاب كنيد و در برنامتون تعريفش كنيد و بعد هر كاري كه خواستين رو بهش دستور بدين تا براتون انجام بده . ضمنا شما لازم نيست اصلاً غصه درست كار كردن اون رو بخورين چون خود Windows اونو كنترل ميكنه كه يه وقت كار بدي نكنه ((:

    شما نميتونيد كه Agent رو داخل يك جعبه مكالمه (Dialog Box) قرار بدين و فقط ميتونيد جاي اوليه اون رو انتخاب كنيد بعد نمايش بدين و كاربر ميتونه اونو به دلخواه خود تغيير مكان بده با Drag كردن اينكار رو انجام ميده. خوب حالا براي شروع كار به يك سري Agent نياز داريم كه البته همراه ويندوز هميشه يك سري همراه هستند بهترين اونها كه ميتونه كارهاي زيادي انجام بده (منظور حالتهاي زيادي براش تعريف شده) Merlin هست كه يك جادوگر پير مي باشد. براي Download كردن اينها ميتونيد به سايتهايي كه معرفي ميكنم يك سري بزنيد. ضمناً شما خودتون هم ميتونيد يك Agent طراحي بكنيد كه براي اينكار بايد از يك سري نرم افزار استفاده كنيد.

    براي اينكه كاربر بتونه از Agent برنامه شما استفاده كنه بايد حتماً Microsoft Agent Server‌ رو نصب كنه. كه البته من تا حالا تو هر ويندوزي كه برنامم رو اجرا كردم نصب شده بوده فكر كنم اين برنامه همراه خود ويندوز هست (; ولي اگه نبود شما ميتونيد يك سري به آدرس زير بزنيد اونجا چيزهاي جالبي در اين مورد داره كه يك مطالعه كنيد بد نيست.

    [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]

    در اين آدرس اخرين باري كه رفتم مطالب زير بود حالا اگه تا حالا بيلي جون حوصله اش از اونا سر نرفته باشه و عوض نكرده باشد بايد باشه:

    - The Agent Server

    - The Characters/Agents

    - A Text-to-Speech pices

    - A Voice command (input) pices



    اين مطالب تحت عنوان Microsoft Agent Software Development Kit هست كه در اونجا شما همچنين ميتونيد نرم افزار Microsoft Agent Character Editor رو براي درست كردن Agent دريافت كنيد. در اين مقاله ما در مورد Voice Command‌ (فرمان هاي صوتي) و طراحي Agent صحبت نميكنيم و فقط طرز استفاده از اين امكان رو شرح ميدم كه خودتون بعداً ميتونيد در موردش بيشتر جستجو كنيد. ما براي كارمون فقط احتياج به Agent Server و يك كاراكتر داريم كه اگه روي ويندوزتون ندارين ميتونيد از اينجا Download بكنيد.

    خوب حالا ميريم سر اصل مطلب:

    بعد از اينكه مطمئن شدين روي ويندوزتون AgentServer رو دارين دلفي رو اجرا كنيد و مراحل زير رو مو به مو انجام بدين:

    1- Component|Import ActiveX Control رو انتخاب كنيد.

    2- Microsoft Agent Control رو از تو ليست پيدا كنيد و رو ي دكمه Install كليك كنيد.

    3- خوب حالا بايد تو قسمت ActiveX يك آيكوني شبيه به MenInBlack داشته باشيد.

    خوب تا يادم نرفته اينو بگم كه براي پيدا كردن يك كاراكتر روي ويندوزتون بايد براي acs.* جستجو كنيد كه البته به طور عادي اگر Agent Server نصب باشه توي شاخه Windows يك msagent بايد وجود داشته باشه و داخل اون هم يك شاخه ديگه به نام Char هم هست كه توش يك يا چند كاراكتر وجود داره كه اگر از XP استفاده ميكنيد حتماً يكيش Merlin.acs هست (كه من خيلي بهش علاقه دارم (: ) براي همين ما بايد تو برنامه مون چك كنيم كه آيا اين شاخه وجود داره يا نه اگه وجود داشت ميدونيم كه Agent Server روي ويندوز كاربر نصب هست و ما مي تونيم از Agent استفاده كنيم .

    خوب براي اينكار بايد اول ActiveX رو به روي فرم منتقل كنيم با اينكار يك type با نام TAgent به تعاريف فرم اضافه ميشه . بعد بايد يك متغيير تعريف كنيم كه از نوع Boolean باشه تا با اون چك كنيم كه آيا Agent Server نصب هست يا نه براي اينكار ميشه از Code زير استفاده كرد:



    TYourObject

    private

    AgentInstalled: Boolean;

    function AgentIsInstalled: Boolean;

    procedure CreateAndLoadAgentIfInstalled;

    function GetColorDepth: Word;

    function GetWinDir: String;

    procedure SetFormColor;

    function AgentWasClicked



    شما ميتونيد روي ويندوز كاربر به دنبال اون شاخه و كاراكتري كه مي خواهيد از او استفاد هكنيد بگرديد و اگه بود كار رو باهاش شروع كنيد اگه هم نبود خوب ديگه كاربر بايد محيط خشك برنامتون رو تحمل كنه (;

    حالا مثلاً ما مي خواهيم از Merlin استفاده كنيم :

    {-----------------------------------------------}

    function TYourObject.AgentIsInstalled: Boolean;

    begin

    Result := (FileSearch('Merlin.acs',

    Format('%s\MSAGENT\CHARS', [GetWinDir]))<>'');

    end;



    {-----------------------------------------------}

    function TYourObject.GetWinDir : string;

    var

    WinDirZ : array[0..256] of Char;

    begin

    GetWindowsDirectory(WinDirZ, SizeOf(WinDirZ));

    Result := StrPas(WinDirZ);

    end;



    نكته : در بالا براي بدست آوردن نام شاخه اي كه ويندوز در آن نصب هست از API استفاده شده كه مسير كامل ويندوز را به ما ميدهد.

    حال كه فهميديم كاربر امكان استفاده از Agent رو داره مي تونيم كار رو شروع كنيم. در ادامه بايد يك Object براي Agent خودمون بسازيم تا از اين به بعد از اون استفاده كنيم و مجبور نباشيم از ActiveX استفاده كنيم. براي اينكار از كد زير ميشه استفاده كرد:

    implementation



    uses

    AgentDemoConsts,

    Registry,

    OLECtrls, AgentObjects_TLB;



    {-----------------------------------------------}

    procedure

    TYourObject.CreateAndLoadAgentIfInstalled;

    const

    RightBias = 80;

    TopBias = 70;

    var

    tp: TPoint;

    begin

    if (AgentInstalled) and

    not (Assigned(RobotAgent)) then begin

    RobotAgent := TAgent.Create(Application);

    RobotAgent.Characters.Load('Merlin','Merlin.acs');

    { Move the Agent to the center of the screen }

    tp.x := (Screen.Width div 2)-(Width div 2);

    tp.y := (Screen.Height div 2)-(Height div 2);

    with RobotAgent.Characters.Item['Merlin'] do begin

    MoveTo(tp.x+RightBias, tp.y+TopBias, 0);

    Show(0);

    Play('Greet');

    Play('Explain');

    Speak(SDemoIntro, '');

    Play('Pleased');

    Play('RestPose');

    Speak(SWhisper, '');

    Speak(SMonotone, '');

    Speak(SMap, '');

    end;

    end;

    end;





    چند خط اول كه مشخص هست چه كار ميكنه . اما بعد از اينكه كاراكتر تعريف شد (RobotAgent) اونو به Merlin نسبت ميديم وبعد هم اونو به وسط صفحه نمايش منتقل ميكنيم و حالا ميرسيم به مهمترين قسمت كار كه دستور دهي به Merlin هست.

    با استفاده از Play شما ميتونيد به Agent دستور بدين اما براي هر Agnet دستورات متفاوت هست يعني ممكن هست كه دستوارتي كه براي Merlin كار ميكنه براي Robby (كه يكي ديگر از Agent ها هست) كار نكنه. شما اگه كاراكترتون رو خودتون درست ميكنيد خوب پس ليست دستوراتش رو داريد اما اگه اونو از جايي Download ميكنيد حتما ليست دستوارتش هم همراش هست مثلا شما ميتونيد در مورد Merlinو يا Robby و يا چند Agent ديگه از تو همون آدرسي كه در بالا دادم ليست دستوارتش رو بگيريد.

    حالا در كد بالا ميبينيد كه در ابتدا از دستور Show استفاده شده اين دستور براي به نمايش در آوردن Agent هست و در تمامي آنها كار ميكنه . بعد با استفاده از Play كارهاي مورد نظرمون رو به Agent‌ ميگيم. مثلاً من در ابتدا با استفاده از دستور Greet از Agent خواستم كه سلام كنه و بعد هم با استفاده از Explain خواستم كه شروع كنه به گفتن يك سري مطالب كه با دستور Speak اونها رو كه در متغيير SDemoIntro قرار داده ام به صورت يك بالون كه بالاي سرش باز ميشه ميگه. شما براي اينكه بگين مطالب رو با چه حالتهايي بخونه مي تونيد از دستواراتي كه در جدول زير آوردم استفاده كنيد:

    Addition

    Resulting capability

    \Chr="Whisper"\

    The Agent will whisper the following text.

    \Pau=N\

    The Agent will pause for the designated number of milliseconds.

    \Emp\

    The Agent will give special emphasis to the following phrase.

    \Chr="Montone"\

    The Agent will emphasize nothing at all.

    \Map=

    The Agent will say one thing, and = "think" another.

    خوب حالا براي اينكه بيشتر متوجه بشين در زير يك سري مثال آوردم كه ميتونيد اونها رو در برنامه استفاده كنيد و نقش هر كدوم از دستوارت رو ببينيد:

    SFuzzyWuzzy = 'Fuzzy wuzzy was a bear;\Pau=500\ ' +

    'fuzzy wuzzy had no hair;\Pau=500\ ' +

    'fuzzy wuzzy wasn't very \Emp\fuzzy, \Emp\was he?';

    SWhisper = '\Chr="Whisper"\Now I will whisper: ' +

    'Whisper whisper whisper.';

    SMonotone = '\Chr="Monotone"\Now I will speak in a ' +

    'monotone. Pat Paulsen for President.';

    SMap = '\Map="I will now continue to speak in ' +

    'English, but you will see my words ' +

    'translated into German in the balloon above ' +

    'my head. How are you today? I am just ' +

    '\Emp\dandy!"="Jetzt werde ich zwar immer ' +

    'noch in Englisch reden, sie werden ' +

    'aber meine Woerte im Balloon obenauf ins ' +

    'Deutsch uebersetzt sehen. Wie geht es ' +

    'Ihnen heute? Mir geht es ganz gut!"\';



    خوب ديگه همين بود تمام ماجرا حالا شما اگه مي خواهين بيشتر در اين مورد كار كنيد من در مقالات بعدي يكي سري سايت و مطلب ديگه هم براتون ميزارم البته به زبون اصلي خودشون حتماً خيلي مفيد خواهد بود.

    ضمنا شما ميتونيد از Event ها هم در Agent استفاده كنيد و مثلا براي رويداد OnClick روي Agent‌ يك چيزي تعريف كنيد.



    خوب در آخر از شما كه تا اينجا آمديد متشكرم و يك سري نكات رو هم بايد ذكر كنم :

    1- اين مطالب حاصل تجربه خودم و همچنين برگرفته از يك سري مقالاتي بوده كه در اين مورد مطالعه كردم.

    2- در مورد استفاده از اين كدهايي كه در اين مقاله آورده ام و همچنين در پايان اين مقاله ضميمه كرده ام هيچ گونه مسئوليتي بعهده من نخواهد بود كه درست كار كنه يا بزنه كامپيوتر شما رو بسوزونه !!!!!

    3- استفاده از اين مقاله به شرط ذكرنام و آدرس اصلي مقاله در سايتها و جاهاي ديگر آزاد است .

    4- اگه در اين مورد نظري دارين يا حتماً براي من ايميل كنيد خوشحال خواهم شد بشنوم.







    موفق باشيد

صفحه 1 از 17 1234511 ... آخرآخر

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •