![]() |
|
|
#1
|
|||
|
|||
|
Есть основная форма программы.
В основной форме программы вызывается дополнительная форма с двумя кнопками "Да", "Нет". . Как сделать, чтобы дополнительная форма закрывалась через определенное время и чтобы в нужной кнопке, например кнопке "Да", тикал таймер в обратном отсчете, т.е. текст кнопки динамически менялся, например, 10 сек, 9 сек, 8 сек, и так далее, после чего форма автоматически закрывалась с ответом "Да" или закрывалась по нажатию клавиши не дожидаясь таймера, или, если наоборот, таймер в кнопке "Нет", с ответом "Нет". А также дополнительная форма закрывалась при нажатии на крестик формы с выбранным по умолчанию ответом, например "Да" и остановкой таймера. . Заранее благодарен. . Хотелось бы увидеть код на Delphi . . Последний раз редактировалось Jenyok, 11.06.2015 в 15:38. |
|
#2
|
|||
|
|||
|
Вот для затравки пример из книги "Delphi для чайников"
Код:
type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption := TimeToStr(Now);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1Timer(Timer1);
end;Попробуйте остальное дописать сами. Для обратного отсчёта надо от текущего времени отнимать время старта. |
|
#3
|
|||
|
|||
|
Прикольненько получилось.
. Код:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
Button1 : TButton;
Button2 : TBitBtn;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
procedure OnTimer(Sender: TObject);
public
{ Public declarations }
end;
var
Form1 : TForm1;
implementation
{$R *.dfm}
const
MsgText = #10'ВНИМАНИЕ !!!'#10#10'Есть неотправленная отчетность 364-П !'#10#10'Запустить отправку почты (АСТРА) ?'#10#10'НЕТ - через %d секунд(ы).'#10;
MsgCaption = 'Осталось %d секунд';
BtnCaption = 'ОK (%d сек.)';
MsgBtnCaption1 = 'Да - %d сек.';
MsgBtnCaption2 = 'Нет - %d сек.';
var
MyMsgDialog : TForm;
Sec : Integer;
procedure TForm1.OnTimer(Sender: TObject);
var
Control : TControl;
begin
with MyMsgDialog do
begin
Caption:=Format(MsgCaption, [Sec]);
TButton(FindComponent('Yes')).Caption:=Format(MsgBtnCaption1, [Sec]);
TButton(FindComponent('Cancel')).Caption:=Format(MsgBtnCaption2, [Sec]);
TLabel(FindComponent('Message')).Alignment:=taCenter;
TLabel(FindComponent('Message')).Caption:=Format(MsgText, [Sec]);
end;
Button2.Caption:=Format(BtnCaption, [Sec]);
if (Sec = 0) then
begin
MyMsgDialog.ModalResult:=ID_OK;
Button2.Caption:='ОК'
end;
Dec(Sec);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Timer : TTimer;
Control : TControl;
Btn1X : Integer;
begin
// Создаем диалог
MyMsgDialog:=CreateMessageDialog(MsgText, mtWarning, [mbYes, mbCancel]);
// Создаем таймер
Timer:=TTimer.Create(MyMsgDialog);
Timer.Enabled:=False;
// 10 - это кол-во секунд до закрытия
Sec:=10;
with MyMsgDialog do
begin
try
Caption:='';
Width:=400;
// Height:=300;
Font.Color:=clRed;
// Font.Size:=12;
Control:=FindChildControl('Yes');
if ((Control <> nil) and (Control is TButton)) then
begin
(Control as TButton).Left:=25;
Btn1X:=(Control as TButton).Left;
(Control as TButton).Width:=100;
(Control as TButton).Caption:='Да';
end;
Control:=FindChildControl('Cancel');
if ((Control <> nil) and (Control is TButton)) then
begin
(Control as TButton).Left:=Btn1X + 200;
(Control as TButton).Width:=100;
(Control as TButton).Caption:='Нет';
end;
// Задаем параметры таймера
Timer.Enabled:=True;
Timer.OnTimer:=OnTimer;
OnTimer(Self);
// Показываем окно как модальное
case ShowModal of
ID_OK, ID_YES : begin
Button2.Caption:='ОК - Да';
MyMsgDialog.Close;
end;
ID_CANCEL : begin
Button2.Caption:='ОК - Нет';
end;
end;
finally
// Освобождаем переменные
Timer.Free;
Free;
end;
end;
end;
end. |