X
تبلیغات
برنامه نویسی با دلفی

برنامه نویسی با دلفی
 

در این مقاله و یا مقالات بعدی سعی بر این داریم که کار با تلفن و یا مودم را با استفاده از کامپوننت تلفن یا همان KDTele آغاز کنیم ، در این مقالات با مطالب زیر آشنا می شویم:

 

  • نصب و آشنايي با متدها
  • راه اندازي و ارسال پيغام از طريق خط تلفن
  • شماره گیری و پخش صدا از طریق تلفن
  • طراحی تلفن پیامگیر ( عکس العمل به شماره فشرده شده)
  • ارسال فایل از طریق تلفن
  • ارسال فکس
  • ضبط صدای تماس گیرنده و تاریخ و ساعت تماس
  • و...

 

برای شروع کار تنها کاری که شما بایستی انجام دهید اینست که ابتدا کامپوننت تلفن یا همان KDTele را از قسمت زیر دانلود کنید. پس از دانلود آنرا از حالت فشرده در آورده و سپس آنرا در مسیر دلخواهی کپی کرده و نصب کنید.

 

دانلود KDTele برای دلفی 7 - حجم فایل: 1.26 مگابایت
دانلود - لینک غیرمستقیم از DivShare
       

دانلود KDTele برای دلفی 2006 - حجم فایل: 1.25 مگابایت
دانلود - لینک غیرمستقیم از DivShare
      

کرک  KDTele - حجم فایل: 14 کیلوبایت
دانلود - لینک غیرمستقیم از DivShare

      

نحوه نصب به این شکل می باشد که ابتدا دلفی را اجرا کرده و سپس از منوی Component ، قسمت InstallPackges را کلیک کرده و سپس بر روی دکمه Add کلیک کرده و سپس وارد مسیر شده و فایل KDTeleDelphi2006.bpl یا KDTeleDelphi7.bpl (بستگی به نسخه دلفی شما) را انتخاب کرده و در خاتمه OK را کلیک کنید. اکنون گروه جدیدی با نام KDTele Tools به کامپوننتهای دلفی اضافه می شود که شامل 8 جزء زیر می باشد:

 

KDPhone:  ایجاد ارتباط تلفی و کنترل تلفن

KDVoice: ضبط و پخش صدا بر روی خط تلفن

 KDFax: ارسال و دریافت فکس

KDFile: ارسال و دریافت هر گونه فایل

KDSpeack: پخش متن دلخواه بصورت صدا بر روی خط تلفن

KDListen: دریافت فرمانهای صوتی

KDSerialPort: کنترل و ارسال داده از طریق پورت سریال

KDWaveEditor: کنترل صدا و نمایش موج صوتی

 

 

آغاز ارتباط و کنترل خط

جهت ایجاد ارتباط بایستی سه عمل اولیه انجام دهید:

 

  1. ابتدا بایستی خط ارتباطی را برای برنامه مشخص کنید. منظور اینست که شما از طریق کدام پورت یا کدام مودم می خواهید تماس را برقرار کنید و آن خط را بایستی فعال کنید.
  2. بایستی شماره گیری را آغاز کنید. پس از اجرای درست و موفقیت آمیز مرحله بالا خط تلفن آماده خواهد بود که شماره تلفن مورد نظر را بصورت رشته ای وارد کنید و شماره گیری را آغاز کنید.
  3. بایستی وضعیت ارتباطی را بررسی کنید. پس از شماره گیری بایستی بررسی کنید که آیا ارتباط برقرار شد، خط مشغول است و...

 

شروع:

 

ابتدا وارد دلفی شده و یک پروژه جدیدی شروع کنید و اجزاء زیر را بر روی فرم مانند شکل را قرار دهید:

 

                       

در مثالهای زیر توابع، متدها و خصوصیهای مربوط به کامپوننتهای تلفن را با رنگ نارنجی جهت راحتی کار نشان داده ایم و در مورد آنها توضیحاتی را نوشته ایم،  البته لازم بذکر است که کلیه توابع در صورت موفقیت مقدار صفر را بر می گردانند و در صورت عدم موفقیت کد مربوط به خطا را بصورت عدد بر می گردانند که ما در برنامه زير از متغیر err برای ذخیره کد خطا و سپس نمایش خطای مربوط به آن استفاده کردیم.

 

1- ابتدا در قسمت Var اصلی برنامه سه متغیر با نامهای زیر تعریف کنید:

 

var

     Form1: TForm1;

     I        : Word;

     S       : WideString;

     err     : Word; 

implementation

 

2-  بر روی فرم دوبار کلیک کرده تا رویداد OnCreate فرا خوانی شود و سپس کد زیر را وارد کنید:

 

procedure TForm1.FormCreate(Sender: TObject);

begin

    for I := 0 to KDPhone1.NumberOfLines-1 do

       begin

             KDPhone1.GetLineName( i,S);

             ComboBox1.Items.Add(S(;

       end;

end;

 

در کد فوق همانگونه که مشاهده می کنید از یک حلقه شمارشی برای بدست آوردن خطوط ارتباطی موجود در کامپیوترمان استفاده کرده ایم. در این حلقه از خصوصیت NumberOfLines برای بدست آوردن تعداد خطوط استفاده کردیم سپس با استفاده از تابع GetLineName( i,S)برای بدست آوردن نام خط ارتباطی و ذخیره آن در متغیر S  استفاده کردیم و در انتها مقدار S را درون ComboBox1 اضافه کردیم تا برنامه موقع اجراء لیستی از خطوط ارتباطی موجود را جهت انتخاب به ما نشان دهد.

 

3- اکنون بر روی ComboBox1 دابل کلیک کنید و کد زیر را وارد کنید:

 

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

  err :=  KDPhone1.LineActive(ComboBox1.ItemIndex,True);

  if  err<>0 then

    ShowMessage(KDPhone1.GetErrorMsg(err))

  else Memo1.Lines.add('خط ارتباطی آماده می باشد');

end;

 

در فوق ما کدی نوشتیم که کاربر با انتخاب هر کدام از خطوط موجود در ComboBox1 بتواند آن خط را بعنوان خطوط فعال توسط تابع  LineActive( LineNumber , True)  معرفی و فعال کند. چنانچه فعال سازی خط با مشکل مواجه شود آنگاه با استفاده از تابع GetErrorMsg(err) پیغام مربوط به آن خطا را بدست آورده و نمایش می دهیم. شما می توانید درون اسامی مربوط به خطوط و دستگاههاي ارتباطي نام مودم خود را یافته و آنرا انتخاب کنید.

 

4- اکنون بر روی دکمه Dial  دابل کلیک کنید و کد زیر را بنویسید:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  err := KDPhone1.DialNumber( Edit1.Text,0);

  if err<>0 then

    ShowMessage(KDPhone1.GetErrorMsg(err));

end;

 

توسط تابع  DialNumber( Edit1.Text,0)  شماره تایپ شده توسط کاربر در Edit1.Text شروع به شماره گیری می گردد. شما می توانید شماره ثابتی را درون این تابع بصورت رشته ای بنویسید.

 

 5- در این قسمت ما با کنترل وضعیتهای مختلف تلفن آشنا می شویم که می توان توسط آن سیستمی بسیار قوی و با دقت طراحی کرد. وضعیتهای مختلف هنگام فعالیتKDPhone  در جدول زیر آمده اند اما ما در این تمرین فقط با چندتا از آنها که اهمیت ویژه ای دارند آشنا می شویم:

 

csError

csRemotePartyDisconnected

csDisconnected

csOfferedCallDropped

csBusy

csConnected

csWaitingDisconnection

csOffering

csProceeding

csNoDialTone

csRing

csDialing

csWaitingForFaxCommand

csRemovedFromConference

csInConference

csOnHold

csRingBack

csDialTone

 

 

اکنون شئی KDPhone1 را انتخاب کرده و سپس از پنجره Object Inspector به تب Events رفته و در مقابل OnCallState دابل کلیک کنید و سپس کد زیر را بنویسید:

procedure TForm1.KDPhone1CallState(Sender: TObject; CallState: TCallState;

  Param1, Param2, CallHandle: Integer);

begin

   case CallState of

     csDialing : Memo1.Lines.Add( 'در حال تماس گرفتن');

     csConnected  : begin

                             Memo1.Lines.Add( 'تماس برقرار شد' );

                             Err := KDVoice1.Play( KDPhone1. WavePlayID,'C:\ Wellcome.Wav',0,-1);

                             if err<>0 then ShowMessage(KDPhone1.GetErrorMsg(err));

                            else Memo1.Lines.Add('در حال پخش پیغام');

                          end;

      csDisconnected : Memo1.Lines.Add( 'ارتباط قطع شد' );

      csBusy: begin

                      Memo1.Lines.Add( 'خط تلفن مشترک مشغول می باشد' );

                      KDPhone1.Hangup;

                  end;

      csError: begin

                    Memo1.Lines.Add( 'خطایی در تماس رخ داده است' );

                    KDPhone1.Hangup;

                  end;

  end; //of case

end;

 

به نظر می رسد کمی گیج کننده باشه ولی کامل منطقی و جالب می شه گفت با کد نویسی درست وضعیتها می شه کنترل بیشتری بر روی سیستم داشته باشیم اما شرح کدها:

 

وضعيت   csDialing موقعي اتفاق مي افتد كه تلفن طرف مقابل در حال زنگ خوردن باشد.

 

وضعیت csConnected  موقعی اتفاق می افتد که خط ارتباطی و شماره طرف مقابل با موفقيت وصل شود که در اینصورت ما بعد از نمایش پیغامی مناسب توسط شئی KDVoice1 و با استفاده از تابع Play  فایل صوتی Wellcome.Wav واقع در درایو C: را پخش کردیم که در این هنگام طرف مقابل آن صدا را خواهد شنید لازم بذکر است که فایل صوتی حتما باید از نوع Wav باشد.

 

وضعیت csDisconnected موقعی رخ دهد که به هر طریق ارتباط قطع گردد.

 

وضعیت csBusy موقعی رخ می دهد که تلفن مقابل زنگ مشغولی بخورد که ما در این هنگام پس از نمایش پیغام مناسب سعی بر قطع ارتباط با استفاده از متد Hangup کردیم این متد هر کجا بکار رود موجب قطع ارتباط شده و وضعیت   csDisconnected  را بوجود می آورد.

 

وضعیت  csError  موقعی بکار می رود که در هر صورتی خطای در ارتباط رخ دهد. که در این هنگام ما سعی بر قطع ارتباط می کنیم.

 

توضیح در مورد تابع Play : این تابع برای پخش صدا بکار می رود که پارامتر اول آن نشان دهنده محل پخش فایل صوتی است اگر مقدار آن 1- باشد یعنی صدا از طریق کارت صدای کامپیوتر جاری پخش شود و اگر از تابع WavePlayID مربوط به شیئ KDPhone استفاده کنیم آنگاه خط تلفن را برای پخش بکار می گیرد، در پارامتر دوم بایستی مسیر و نام فایل صوتی را مشخص کنیم، پارامتر سوم محل آغاز پخش فایل را مشخص می کند که عدد صفر نشانه شروع از ابتدا می باشد و آخرین پارامتر محل پایان فایل صوتی را نشان می دهد که مقدار 1- نشان دهنده پایان فایل است.

 

6- اکنون شئی KDVoice1 را انتخاب کرده و سپس از پنجره Object Inspector به تب Events رفته و در مقابل OnSoundState دابل کلیک کنید و سپس کد زیر را بنویسید:

 

procedure TForm1.KDVoice1SoundState(Sender: TObject; State: TSoundState; BytePosition, ErrorNumber: Integer);

begin

    Case State of

        ssPlayDone : begin

                             Memo1.Lines.Add( 'پخش فایل صوتی با موفقیت به پایان رسید' );

                             KDPhone1.Hangup;

                           end;

        ssError : begin

                       KDPhone1.Hangup;

                       Memo1.Lines.Add( 'خطایی در پخش صدا رخ داده است' );

                     end;

    end; // of case

end;

 

شئی KDVoice داری 11 وضعیت مختلف و کاربردی می باشد که در اینجا فقط به 2 از آنها اشاره کردیم (در مقالات بعدی این شئ بیشتر مورد بررسی قرار خواهد گرفت) . در وضعیت اول که در هنگام پایان پخش فایل صوتی اتفاق می افتد ما پیغامی را نمایش دادیم و سپس ارتباط را قطع کردیم.

 

اين هم تصويري از برنامه اجرا شده:

 

                              

در مطالب فوق سعی بر این شد که با استفاده از امکانات این کامپوننت بتوانیم یک برنامه ای بنویسیم که بوسیله آن یک تماس برقرار کنیم و پیغام خود را پخش کنیم ، اکنون با یک مثال و برنامه ساده دیگر می خواهیم به تماسهای گرفته شده پاسخ دهد ، بدین صورت که وقتی تماس گیرنده ای به شماره ما زنگ بزند سیستم آنرا تشخیص داده و به آن پاسخ مناسب را بدهد.

 

برای انجام چنین کاری بایستی ابتدا موارد زیر را انجام دهیم:

 

  1. خط تلفن را به مودم کامپیوترمان وصل کنیم
  2. خط راتباطی را انتخاب بکنیم و آنرا فعال کنیم
  3. در قسمت کنترل وضعیتها کد مناسب برای وضعیت csReferring بنویسیم

 

لطفاً پروژه جدیدی را شروع کنید و بر روی فرم آن اشیاء زیر را قرار دهید:

 

اکنون قسمت Var را همانند مثال فوق طراحی کنید همچنین قسمت رویدادOnCreate  را به همان صورت و نیز کد مربوط به ComboBox1 را نیز همانند قسمت بالا بنویسید و در پایان شئی KDPhone1 را انتخاب و برای رویداد OnCallState آن همان کد بالا را وارد کنید....

برای تشخیص تماس گرفته شده، شئی KDPhone وضعیت به خصوصی را دارا می باشد که نام این وضعیت csReferring است و بایستی آنرا به وضعیتهای onCallState اضافه بکنیم، اگر ما برنامه را اجرا کنیم و خط ارتباطی (مودم) را فعال کنیم و بعد از آن شخصی با ما تماس بگیرد آنگاه وضعیت csReferring بطور خود کار رخ خواهد داد اما این کافی نیست و هنوز برنامه ما قادر به پاسخ نمی باشد لذا برای اینکه پاسخگویی و ارتباط آغاز گردد بایستی در این وضعیت ما از تابع Answer(0) استفاده می کنیم (مانند این است که گوشی را برداشته باشیم) در زیر کد مربوط به رویداد onCallState مربوط به KDPhone1 را برای شما باز نویسی شده است:

case CallState of

    csConnected  : begin

                             Memo1.Lines.add ('تماس برقرار شد' );

                             Err := KDVoice1.Play( KDPhone1.WavePlayID,'start.wav',0,-1 );

                             Memo1.Lines.add ('در حال دريافت شماره');

                             if err<>0 then ShowMessage(KDPhone1.GetErrorMsg(err));

                          end;

   csDisconnected :  Memo1.Lines.add ('ارتباط قطع شد');

   csRing: Memo1.Lines.add ('در حال زنگ خوردن');

   csBusy: begin

                 Memo1.Lines.add ('خط ارتباطي مشغول مي باشد');

                 KDPhone1.Hangup;

               end;

   csError: begin

                 Memo1.Lines.add ('خطایی در تماس رخ داده است');

                 KDPhone1.Hangup;

               end;

   csOffering: begin

                      Memo1.Lines.add ('دریافت تماس جدید');

                      err := KDPhone1.Answer(0);

                      if err<>0 then ShowMessage(KDPhone1.GetErrorMsg(err));

                   end;

end; //case

 

لازم به ذکر است بعد از آنکه تابع Answer به تماس پاسخ داد وضعیت csConnect رخ خواهد داد که ما در اینجا از این فرصت اسفاده کردیم و یک فایل صوتی خوش آمد گویی قرار دادیم تا به محض تماس برای طرف مقابل پخش گردد.

حال چگونه در هنگام برقراری تماس می توانیم بفهمیم که کاربر تماس گیرنده کدام دکمه های گوشی خود را فشار می دهد تا بتوانیم با توجه به آنها برنامه ای خواصی بنویسیم؟ خوشبختانه KD راه حل ساده ای برای این موضوع گذاشته است که در اینجا فقط به ذکر یک مثال ساده اکتفا می کنیم. برای دسترسی به این قابلیت بایستی ابتدا شیئ KDPhone1 را انتخاب کرده و سپس در قسمت Event مقابل رویداد onDigitDetected دوبار کلیک کنید، این همان چیزیست که ما نیازمندیم و KD آنرا موقعی که دکمه ای از سمت تماس گیرنده فشار داده شود فراخوانی می کند به کد زیر دقت کنید:

 

procedure TmainForm.KDPhone1DigitDetected(Sender: TObject; Digit: Char;  CallHandle: Integer);

begin

    if Digit='1' then …………

    if Digit='2' then …………

   if Digit='*' then …………

end;

 

در رویداد فوق متغیر Digit از نوع کاراکتر بوده و شماره یا علامت فشرده شده توسط طرف مقابل را  به ما می دهد اکنون شما برای تمرین کد زیر را به برنامه خود اضافه کنید:

 

if Digit='1' then KDVoice1.Play( KDPhone1.WavePlayID,'1.wav',0,-1 );

if Digit='2' then KDVoice1.Play( KDPhone1.WavePlayID,'2.wav',0,-1 );

if Digit='3' then KDVoice1.Play( KDPhone1.WavePlayID,'3.wav',0,-1 );

if Digit='4' then KDVoice1.Play( KDPhone1.WavePlayID,'4.wav',0,-1 );

if Digit='5' then KDVoice1.Play( KDPhone1.WavePlayID,'5.wav',0,-1 );

 

در مثال فوق با فشرده شدن هر عدد یک فایل صوتی برای تماس گیرنده پخش می شود و اگر علامتی فشرده شود مانند * , #   فایل صوتی دیگری پخش می شود. البته شما می توانید یک شماره چند رقمی را دریافت کنید و برای آن برنامه بنویسید برای مثال مشترکی که از طریق تلفن شماره اشتراک خود را وارد می کند تا اطلاعاتی را دریافت کند و ....  البته برای این کار بایستی یک قانونی قرار بدهید و آنرا در هنگام آغاز تماس، به تماس گیرنده اطلاع دهید مثل خاتمه ورود شماره با فشردن دکمه *ً مثال زیر را ملاحظه فرمائید:

 

procedure TmainForm.KDPhone1DigitDetected(Sender: TObject; Digit: Char;  CallHandle: Integer);

begin

   If Digit='*' then begin

    //  کد و عملیات مورد نظر

     N := '';

  End

     else

   N := N+Digit;

end;

 

می بینید که مساله بسیار ساده هست کاربر ارقام مربوط به کد خود را یکی یکی وارد می کند و برای پایان از دکمه * استفاده می کند و در بالا متغیر N یک متغیر از نوع رشته ای و بصورت سراسری معرفی شده است که در آن شماره نهایی ثبت می شود و پس از خاتمه عملیات دوباره این متغیره خالی شده و منتظر شماره بعدی می ماند.

 

نکته 1: گوشی تماس گیرنده بایستی در حالت Tone باشد.

 

نکته 2: شما نمی توانید از هر فایل صوتی استفاده کنید برای اینکه ابزارهای KD فقط فایلهای *.Wav را پشتیبانی می کنند آن هم با این شرایط که این فایلها بایستی دارای فرمتی با مشخصات زیر باشد:

8,000hz; 16bit; mono

 

اگر فایل صوتی شما از نوع Wav باشد ولی مشخصات آن متفاوت باشد مثلا Stereo باشد پخش نخواهد شد. پس ابتدا شما هر فایلی که دوست داشته باشید حتی اگر MP3 باشد را ابتدا به فرمت Wav تبدیل کنید و مشخصات آن را بصورت بالا در آورید سپس در برنامه از آن استفاده کنید.

 

هر دو مثال توضیح داده شده را می توانید از لینکهای زیر دریافت نمائید. اگر در دانلود فایلهای فوق پیام pop-up بر روی صفحه باز شده ظاهر شد بر روی آن کلیک کرده و گزینه Download File را انتخاب نمائید.

 

دانلود مثال اول - حجم فایل: 278 کیلوبایت 

            دانلود - لینک غیرمستقیم
      

دانلود مثال دوم - حجم فایل: 430 کیلوبایت

         دانلود - لینک غیرمستقیم

      

 

delphigroup.blogfa.com :منبع


ادامه مطلب
نوشته شده در تاريخ پنجشنبه سیزدهم اردیبهشت 1386 توسط ابراهیم خدائی
تمامی حقوق این وبلاگ محفوظ است | طراحی : پیچک