Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 262
  • Last Modified:

Calling procedures from within timerproc gives violation exception

procedure TfrmVoiceTextAPI.Button1Click(Sender: TObject);
begin
  OleCheck(Voice.Speak(PChar(memText.Text), 0, nil));
end;

the above works and i get text to speech

******************

procedure TfrmVoiceTextAPI.Button1Click(Sender: TObject);
begin
  settimer(application.Handle, 2, 1000, @TfrmVoiceTextAPI.myTimerProc);
end;

procedure TfrmVoiceTextAPI.myTimerProc(hwnd : HWND; uMsg, idEvent : UINT;
                          dwTime :DWORD);
begin
  killtimer(application.Handle, 2);
  OleCheck(Voice.Speak(PChar(memText.Text), 0, nil));
end;

this fails with violation exception

I have defined timerproc with no calling convention and with stdcall but both fail.
0
bigpeta
Asked:
bigpeta
  • 2
1 Solution
 
Slick812Commented:
hello bigeta, This is a common misteak, the windows system need a fuction address in SetTimer, not a Method address, the @TfrmVoiceTextAPI.myTimerProc is a Method Address, you need to use a procedure that id NOT in a Class, you might try something like this -



procedure TimerProc(Wnd, Mesg, TimerID, SysTime: Integer); stdcall;
begin
 killtimer(Handle, 2);
 OleCheck(frmVoiceTextAPI.Voice.Speak(PChar(memText.Text), 0, nil));
end;


procedure TfrmVoiceTextAPI.Button1Click(Sender: TObject);
begin
 settimer(Handle, 2, 1000, @TimerProc);
end;


- - - - - - - - -  - - - - - - - - - -  --

be sure the TimerProc is above the ButtonClick

ask questions if you need more info
0
 
Slick812Commented:
should be

procedure TimerProc(Wnd, Mesg, TimerID, SysTime: Integer); stdcall;
begin
killtimer(frmVoiceTextAPI.Handle, 2);
OleCheck(frmVoiceTextAPI.Voice.Speak(PChar(memText.Text), 0, nil));
end;
0
 
MadshiCommented:
Slick is right. If you want to use a method, please use TTimer instead of the pure win32 APIs.
0
 
bigpetaAuthor Commented:
I had to make one more adjustment - having taken timerproc outside the scope of the form owner I had to fully qualify the memo text access with
frmVoiceTextAPI.memText.Text
thank you slick for a prompt reply.
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now