PDA

View Full Version : سوال: مشكل با kdtele3.5



mostafaserial
یک شنبه 28 تیر 1388, 19:12 عصر
سلام
وقتي نرم افزار رو اجرا ميكنم بعد با يه خط تلفن ديگه به اون خط ديگه زنگ ميزنم
نرم افزار شروع به كار ميكنه و بعد پخش يه پيام صوتي wav منتظر وارد كردن كد ميشه
كد ي كه وارد ميكنم فقط بايد يه كاراكتر باشه وداخل متغير Digit ميشه يعني مثل زير اگه 1 بود انوقت صداي يك رو پخش كن
من ميخوام بجاي گرفتن كاراكتر يه رشته عددي بگيرم مثلا اگر 12345 وارد كردم فايل wav 1 پخش بشه
دانلود با كرك
http://www.developercenter.ir/forum/showthread.php?t=9260
مشكل همينه


procedure TfrmMain.KDPhone1DigitDetected(Sender: TObject; Digit:char;
CallHandle: Integer);
begin

// if Digit='1' then KDVoice1.Play( KDPhone1.WavePlayID,'1.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 );

end

skflower
دوشنبه 29 تیر 1388, 02:27 صبح
سلام دوست عزیز. شما میتونید یه متغیر عمومی تعریف کنید و ارقامی رو که دریافت میکنید توی اون بذارید. اونوقت تو یه دستور if بگید که هروقت متغیر برابر 12345 شد، فلان کار رو انجام بدید.
اگه نیاز بود بگید یه مثال بنویسم براتون.

mostafaserial
دوشنبه 29 تیر 1388, 09:32 صبح
سلام دوست عزیز. شما میتونید یه متغیر عمومی تعریف کنید و ارقامی رو که دریافت میکنید توی اون بذارید. اونوقت تو یه دستور if بگید که هروقت متغیر برابر 12345 شد، فلان کار رو انجام بدید.
اگه نیاز بود بگید یه مثال بنویسم براتون.

سلام
من هر كار ميكنم و اين متغير رو تغيير ميدم سيستم قبول نميكنه
اون لينك رو ببين اگه ميتوني دانلود كن ببين مشكل رو ميتوني برطرف كني
اگه تونستي كد ش رو برام بزار

skflower
سه شنبه 30 تیر 1388, 03:29 صبح
سلام اینم یه مثال که خودم نوشتم واستون. اگه سوالی داشتید در خدمتم. اگه تعداد کدها زیاد باشه، میتونید بجای if از case هم استفاده کنید.


procedure TForm1.KDPhone1DigitDetected(Sender: TObject; Digit: Char;
CallHandle: Integer);
var
str:string;
begin
str:=str+Digit;
if str='12345' then //بجای 12345 عدد مورد نظر
begin
//عمل مورد نظر
end;
end;
موفق باشید.

skflower
سه شنبه 30 تیر 1388, 03:33 صبح
procedure TForm1.KDPhone1DigitDetected(Sender: TObject; Digit: Char;
CallHandle: Integer);
var
str:string;
begin
str:=str+Digit;
if str='12345' then //بجای 12345 عدد مورد نظر
begin
//عمل مورد نظر
end;
end;


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

skflower
سه شنبه 30 تیر 1388, 03:35 صبح
procedure TForm1.KDPhone1DigitDetected(Sender: TObject; Digit: Char;
CallHandle: Integer);
var
str:string;
begin
str:=str+Digit;
if str='12345' then //بجای 12345 کد مورد نظر
begin
//عمل مورد نظر
end;
end;


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

mostafaserial
سه شنبه 30 تیر 1388, 22:55 عصر
procedure TForm1.KDPhone1DigitDetected(Sender: TObject; Digit: Char;
CallHandle: Integer);
var
str:string;
begin
str:=str+Digit;
if str='12345' then //بجای 12345 کد مورد نظر
begin
//عمل مورد نظر
end;
end;


ببخشید. یکم قاطی شد. مجبور شدم دوباره بفرستم. با عرض معذرت از مدیران محترم سایت.
سلام
شما اين دستوراتي رو كه نوشتين تست كردين؟
من كه
هر كليد ي رو ميزنم عمل مورد نظر رو انجام ميده
درست جواب نميده
فكر كنم بايد از آرايه استفاده كنم
كمكم كنيد
چيكار كنم؟

Saeed_m_Farid
یک شنبه 04 مرداد 1388, 13:20 عصر
سلام دوست عزیز. شما میتونید یه متغیر عمومی تعریف کنید و ارقامی رو که دریافت میکنید توی اون بذارید. اونوقت تو یه دستور if بگید که هروقت متغیر برابر 12345 شد، فلان کار رو انجام بدید.
اگه نیاز بود بگید یه مثال بنویسم براتون.




procedure TForm1.KDPhone1DigitDetected(Sender: TObject; Digit: Char;
CallHandle: Integer);
var
str:string;
begin
str:=str+Digit;
if str='12345' then //بجای 12345 کد مورد نظر
begin
//عمل مورد نظر
end;
end;
...
جناب skflower شما خودتون می گید باید متغیر عمومی (global) تعریف کنید ولی تو کدتون str محلی تعریف شده!
خوب اینطوری str فقط تو خود procedure اعتبار داره، با خروج از procedure مقدارش هم از بین میره ...
متغیر سراسری باید قبل تمام توابع و procedure ها شما تعریف بشه، یعنی قبل implementation ؛

در ضمن :


باید مقدار بافر -متغیر سراسری- که Digit ها (درستش DTMF هست) در اون ریخته میشه، پس از استفاده خالی بشه (اگه نوعش String است، باید با EmptyStr انتساب داده بشه).
Case...of رو فقط برای نوع داده های ساده (Ordinal type) میشه استفاده کرد، برای String قابل استفاده نیست.
جناب mostafaserial : این راهی که شما در پیش گرفتید یکم مشکل داره! تو سیستمهای IVR شما باید یه مکانیزم صحیح انتظار و پاسخگویی داشته باشید. مثلاً اگه یه پیغام خاص پخش کردید، باید منتظر جواب خاصی در رابطه با پیغام موردنظر باشید و در مرحله بعد همین روال باید برای پبغام پخش شده بعدی پیاده بشه و ... ؛ حالا مشکلی که هست اینه که شما نمی تونین تمام این روال درختی رو تو همین KDPhone1DigitDetected پیاده سازی کنید؛ برای نمونه یه فلوچارت سیستم گویا (در این مورد صندوق صوتی) میتونید اینجا فایل pdf (http://fhdafiles.fhda.edu/downloads/callcenter/VoiceMailChart.pdf) رو مشاهده کنید. برای یه همچین روالی شما نیاز به یه ساختار و برنامه مستحکم تر دارید که مثلاً در این قسمت DigitDetection شما فقط همین بافر Digit ها رو مقدار دهی کرده و یه فلگ رو True می کنید که متوجه بشید یه Digit وارد شده؛ پخش پیام و روالهای کار با کاربر (کسی که با سیستم تماس گرفته)، باید مستقل از کار با مودم شما باشه (یعنی تو یه thread جداگانه باشد) ...
برای اینکه همین اول کار، زیاد درگیر مسائل جانبی نشید، حداقل کد لازم برای کار تو این حالت، میتونه به شکل زیر باشه :
var
frmMain: TfrmMain;
g_DTMFBuffer: String;
g_IsDigitRecieve: Boolean;

implementation

{$R *.dfm}

//...

procedure TfrmMain.KDPhone1DigitDetected(Sender: TObject;
Digit: Char;
CallHandle: Integer);
begin
g_DTMFBuffer := g_DTMFBuffer + Digit;
if g_DTMFBuffer = '123' then begin
KDVoice1.Play(KDPhone1.WavePlayID,
'123PCM.wav',
0,
-1 );
// Do SomeThing with 123
end else if g_DTMFBuffer = '456' then begin
KDVoice1.Play(KDPhone1.WavePlayID,
'456PCM.wav',
0,
-1 );
// Do SomeThing with 456
end else if g_DTMFBuffer = '789' then begin
KDVoice1.Play(KDPhone1.WavePlayID,
'789PCM.wav',
0,
-1 );
// Do SomeThing with 789
end;
// and so on for other DTMFs...
g_IsDigitRecieve := True; // Must be set False in Customer Thread ...
end;


موفق باشید.

skflower
دوشنبه 05 مرداد 1388, 14:00 عصر
سلام
شما اين دستوراتي رو كه نوشتين تست كردين؟
من كه
هر كليد ي رو ميزنم عمل مورد نظر رو انجام ميده
درست جواب نميده
فكر كنم بايد از آرايه استفاده كنم
كمكم كنيد
چيكار كنم؟

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

m_shahbazee
یک شنبه 25 مرداد 1388, 00:29 صبح
جناب Saeed_m_Farid شما سوال دوستمان را درست متوجه نشده اید.
ایشون میخواستند بدونند چطور میشه حلقه های تو در تو از رشته های عددی را در این کامپوننت کنترل کرد بصورت نمودار درختی با شرط لازم.

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

m_shahbazee
یک شنبه 25 مرداد 1388, 00:34 صبح
این مسئله در سیستم قفل تلفن گویای نرم افزارهای ایرانی است که اول سریال سی دی را میخواد و در صورت
درست بودن سریال کامپیوتر را میخواد تا کلمه رمز داده شود.

skflower
یک شنبه 25 مرداد 1388, 02:12 صبح
تو سیستم تلفن گویای مدارس هم کاربرد داره. شماره دانش آموزی رو میگیره، بعد کد درس رو و بعد نمرات رو میده. خیلی سرم شلوغه. ولی سعی میکنم یه کد بنویسم.

m_shahbazee
جمعه 06 شهریور 1388, 14:33 عصر
سلام دوست عزیز.
من در ساخت یک قفل تلفن گویا برای سی دی هام یک مشکل دارم.
میخوام اول سریال سی دی را بگیرم در صورت درست بودن سریال کامپیوتر را بگیرم
خوب چون هر دوی اونها رشته چند کاراکتری(عددی) هستند نمیتونم در
KDPhone1DigitDetected
کد شرطی بنویسم.
در واقع میخوام چند تا شرط داخلی (نمودار درختی )بنویسم نمیدونم.
if digit N then M, N= چند رقمی است.
bein
if digit= M then
begin
code.......
end else
begin
code.....
end;
end
خیلی عجله دارم .اگه میتونی سریع جوابم را بده ممنون.
e-mail من هست .
:لبخندساده:milad_shahbazee@yahoo.com

m_shahbazee
جمعه 06 شهریور 1388, 14:42 عصر
سلام دوست عزیز.
من در ساخت یک قفل تلفن گویا برای سی دی هام یک مشکل دارم.
میخوام اول سریال سی دی را بگیرم در صورت درست بودن سریال کامپیوتر را بگیرم
خوب چون هر دوی اونها رشته چند کاراکتری(عددی) هستند نمیتونم در
KDPhone1DigitDetected
کد شرطی بنویسم.
در واقع میخوام چند تا شرط داخلی (نمودار درختی )بنویسم نمیدونم.
M ,N چند رقمی هستند.
if digit N then
bein
if digit= M then
begin
code.......
end else
begin
code.....
end;
end; d
خیلی عجله دارم .اگه میتونی سریع جوابم را بده ممنون.
ببخشید قبلی بهم ریخته بود.
e-mail من :
milad_shahbazee@yahoo.com

skflower
جمعه 06 شهریور 1388, 22:19 عصر
سلام دوست عزیز. پاسخی که درقبل ارسال کردم گرچه جواب دوستمون نبود ولی جواب شماست.