PDA

Ver la Versión Completa : ventana de mensaje por un tiempo determinado


reina
11-08-2005, 18:39:39
Hola bueno yo de nuevo..Necesito hacer una funcion que cree una ventana, una ventana de mensaje para mostrar un texto recibido por parametro,tambien recibe un tiempo, es decir recibe como parametro el mensaje y un tiempo, la ventana tiene que estar abierta por esos segundo indicados, si el tiempo es cero la ventana se cerrara cuando se presione cualquier tecla...bueno a ver quien me da una mano..creo que tiene que ver con un temporizador del sistema operativo..pero la verdad no me sale

dec
11-08-2005, 18:46:22
Hola,

Tal vez no te parezca mal usar un componente de nombre TimeForm que puedes encontrar en el paquete DecComp, el cual puedes encontrar a su vez en la sección de componentes (http://www.clubdelphi.com/componentes/) de esta misma página Web. Queda que limarle algunas cosillas (digo a TimeForm), pero, puede que te dé ciertas ideas o te sirva, directamente, para lo que pretendes.

Por otro lado revisa este Hilo (http://www.clubdelphi.com/foros/showthread.php?t=21947), que tal vez también te pueda resultar útil.

reina
11-08-2005, 20:52:12
si ..esos componentes no sé si me sirven...porque estoy trabajando con delphi 2005...de todas maneras uso solo lo de delphi comun..tks por la data..el hilo ese que me indicaste por ahi si..pero ahora estoy peleando con otra cosa(regvariante), despues me ocupare de la ventanita..byee

dec
12-08-2005, 13:05:48
Hola,


(...) esos componentes no sé si me sirven...porque estoy trabajando con delphi 2005... (...)

Sí; puedes instalarlos en Delphi 2005, aunque no cuentes con un paquete específico para esa versión de Delphi, puedes usar el único que hay para Delphi 7. No creo que tuvieras demasiados problemas.

delphi.com.ar
12-08-2005, 17:05:05
A ver si te sirve....

delphi.com.ar
16-08-2005, 15:44:07
100% Api, como hablamos fuera de los foros:

procedure WaitDialog(const AText: PChar; ATimeOut: Cardinal = 5000);
var
wcClass: Windows.TWndClass;
hHandle: HWND;
Msg: TMsg;
hCanvas: HDC;
hFnt, hOldFont: HFONT;
hTimer: UINT;
R: TRect;
L: Cardinal;
begin
L := StrLen(AText);
ZeroMemory(@wcClass, SizeOf(TWndClass));
with wcClass do
begin
Style := CS_CLASSDC;
hInstance := SysInit.HInstance;
lpszClassName := 'WaitDlg';
lpfnWndProc := @DefWindowProc;
hbrBackGround := CTLCOLOR_MSGBOX+1;
end;
Windows.RegisterClass(wcClass);

{ Crea la ventana }
hHandle := Windows.CreateWindowEx(WS_EX_TOOLWINDOW, wcClass.lpszClassName,
nil, WS_POPUP or WS_BORDER, 0, 0, 100, 100, 0, 0,
wcClass.hInstance, nil);

if hHandle = 0 then
RaiseLastOSError
else
try
hCanvas := GetWindowDc(hHandle);
{ Crea la fuente }
hFnt := CreateFont(-1, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH + FF_DONTCARE, 'MS Sans Serif');
hOldFont := SelectObject(hCanvas, hFnt);
try
{ Calcula el tamaño del texto }
SetRectEmpty(R);
R.Right := GetSystemMetrics(SM_CXSCREEN);
DrawText(hCanvas, AText, L, R, DT_CALCRECT + DT_CENTER + DT_WORDBREAK);

{ Para que no escriba sobre el Borde }
InflateRect(R, 2, 2);

SetBkMode(hCanvas, TRANSPARENT);

SetWindowPos(hHandle, 0,
(GetSystemMetrics(SM_CXSCREEN) - R.Right) div 2,
(GetSystemMetrics(SM_CYSCREEN) - R.Bottom) div 2,
R.Right, R.Bottom, 0);

{ Crea el timer que disparará el evento WM_TIMER cada ATimeOut milisegundos }
hTimer := SetTimer(hHandle, 1, ATimeOut, nil);
try
ShowWindow(hHandle, SW_SHOW);
while GetMessage(Msg, hHandle, 0, 0) do
begin
TranslateMessage(Msg);
case Msg.message of
WM_PAINT:
begin
GetClientRect(Msg.hwnd, R);
OffsetRect(R, 1, 1);
DrawText(hCanvas, PChar(AText), Length(AText), R, DT_WORDBREAK + DT_CENTER + DT_NOCLIP);
DispatchMessage(Msg);
end;
WM_CLOSE, WM_DESTROY, WM_KEYDOWN, WM_TIMER, WM_RBUTTONDOWN:
begin
KillTimer(hHandle, hTimer);
hTimer := 0;
Break; {WM_QUIT}
end;
else
DispatchMessage(Msg);
end;
end;
finally
if hTimer <> 0 then
KillTimer(hHandle, hTimer);
end;
finally
SelectObject(hCanvas, hOldFont);
DeleteObject(hFnt);
end;
finally
DestroyWindow(hHandle);
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
WaitDialog(PChar(Memo1.Lines.Text));
end;

Antuan
16-08-2005, 17:05:16
He probado la funcion y es muy chula, como sabeis sigo novato y se podria hacer que ese mensaje que depende del texto que pongamos en el memo.
Sea un mensaje que este incluido en el codigo de la funcion y que aparezca cada ciero tiempo.
Supongo que sera pedir mucho.
Gracias

delphi.com.ar
16-08-2005, 17:07:48
No te entiendo... ¿Quieres "hardcodear" el parámetro de la función?.. si puedes hacerlo, remplaza el parámetro por una constante!

Saludos!

Antuan
16-08-2005, 19:01:56
Bueno es que lo quiero hacer a lo mejor es muy complicado
No es mas que la misma funcion se ejecutara cada cierto tiempo.
Yo ya tengo hecho algo en un formulario y el mensaje de ejecuta cada cierto tiempo. Pero esto no me sirve para una DLL que estoy haciendo
Pero como he visto que la funcion WaitDialog tiene incluido el timer y presenta el mensaje y luego lo borra.
Pues esa funcion me vendria bien siempre que se ejecute cada cierto tiempo para incluirla en la DLL.
Muchas gracias por tu informacion.