درس اول : آغاز ارتباط و کنترل خط
نکته : برای ایجاد ارتباط بایستی حتما یک دستگاه مودم بر روی کامپیوتر شما نصب باشد و خط تلفن به آن متصل باشد.
جهت ایجاد ارتباط بایستی سه عمل اولیه انجام دهید:
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 |
|
|
|
csUnhold |
اکنون شئی 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 از آنها اشاره کردیم (در مقالات بعدی این شئ بیشتر مورد بررسی قرار خواهد گرفت) . در وضعیت اول که در هنگام پایان پخش فایل صوتی اتفاق می افتد ما پیغامی را نمایش دادیم و سپس ارتباط را قطع کردیم.
اين هم تصويري از برنامه اجرا شده:

اینجانب در حال آماده کردن یک فایل ini مرجع کل خطاهای کامپوننت به زبان فارسی هستم که در اسرع وقت در اختیار شما قرار خواهم داد.
شما می توانید با استفاده از یک بانک اطلاعاتی برنامه ای بنویسید که به تلفن نفرات موجود تماس گرفته و پیغامی را پخش کند و در صورتی که موفق نشود فلگی (یک فیلد از نوع بولی) را علامت بزند تا شما بعدا به آن رسیدگی کنید و در صورت موفقیت نفر بعدی را بگیرد. مثلا سیستمی یادآوری تاریخ آزمون شاگردان. البته میشه برنامه های دیگری را نوشت در مقالات بعدی شما را با مطالب جالبتر و کاربردیتر آشنا می کنم.
خوب دوستان عزیز تا اینجا چطور بود نظر خودتان را برای بهتر شدن مطالب بنویسید منتظر نظرات شما هستم
در روهاي آينده بيش از۵ مقاله كاربردي و بهتر قرار خواهم داد منتظر باشيد...