Sử dụng bộ tính giờ ở Delphi. Một ví dụ về làm việc với bộ đếm thời gian trong delphi

Bộ hẹn giờ - Thành phần bộ hẹn giờ

Thành phần Hẹn giờ cho phép bạn đặt các khoảng thời gian trong ứng dụng của mình. Bộ hẹn giờ có rất nhiều ứng dụng: đồng bộ hóa hoạt ảnh, đóng một số cửa sổ mà người dùng trong một khoảng thời gian dài không hoạt động, hãy bật trình bảo vệ màn hình hoặc đóng kết nối bằng máy chủ từ xa trong trường hợp không có hành động của người dùng, thăm dò thường xuyên một số nguồn thông tin, đặt thời gian cho câu trả lời trong các chương trình đào tạo - tất cả đều là nhiều nhiệm vụ cần thiết lập các khoảng thời gian, có thể giải quyết bằng cách sử dụng bộ hẹn giờ.

Bộ hẹn giờ là một thành phần không trực quan có thể được đặt ở bất kỳ đâu trên biểu mẫu. Nó có hai thuộc tính cho phép bạn quản lý chúng: Interval - khoảng thời gian tính bằng mili giây và Enabled - khả dụng. Thuộc tính Interval chỉ định khoảng thời gian. Bởi vì khoảng thời gian xác định thời gian sau thao tác trước hoặc sau cài đặt phần mềm Thuộc tính Interval hoặc sau khi ứng dụng khởi động, nếu Interval được đặt tại thời điểm thiết kế, bộ hẹn giờ sẽ kích hoạt, gây ra sự kiện OnTimer. Trình xử lý sự kiện này ghi lại các thao tác cần thiết.

Nếu bạn đặt Interval = 0 hoặc Enabled = false, bộ hẹn giờ sẽ ngừng hoạt động. Để bắt đầu tính thời gian, bạn phải đặt Đã bật = true nếu Khoảng thời gian được đặt thành giá trị dương hoặc đặt Khoảng thời gian thành giá trị dương nếu Đã bật = true.

Ví dụ: nếu bạn muốn một biểu mẫu - màn hình giật gân hiển thị logo ứng dụng - được đóng 5 giây sau khi ứng dụng được khởi chạy, bạn cần đặt bộ hẹn giờ trên đó, đặt khoảng Interval = 5000 trong đó và chèn một Đóng toán tử vào trình xử lý sự kiện OnTimer để đóng cửa sổ biểu mẫu.

Nếu bạn cần khởi động bộ hẹn giờ theo một quy trình nhất định để đếm ngược một khoảng thời gian xác định, chẳng hạn như 5 giây, sau đó bạn cần thực hiện một số thao tác và tắt bộ hẹn giờ, việc này có thể được thực hiện như sau. Theo thiết kế, bộ hẹn giờ được cung cấp (Đã bật = true), nhưng thuộc tính Khoảng thời gian được đặt thành 0. Bộ hẹn giờ sẽ không chạy cho đến khi câu lệnh được thực thi tại thời điểm bộ hẹn giờ được bắt đầu

thao tác này sẽ tắt bộ hẹn giờ, sau đó bạn có thể thực hiện các thao tác cần thiết.

Một cách tương đương khác để giải quyết vấn đề là sử dụng thuộc tính Enabled. Tại thời điểm thiết kế, giá trị được đặt thành Khoảng thời gian = 5000 và Đã bật = false. Tại thời điểm bộ đếm thời gian cần được bắt đầu, câu lệnh sẽ được thực thi

sẽ tắt bộ hẹn giờ.

Bộ hẹn giờ duy trì chính xác các khoảng thời gian được chỉ định, nếu chúng đủ lớn - hàng trăm và hàng nghìn mili giây. Nếu bạn đặt khoảng thời gian kéo dài hàng chục hoặc vài mili giây thì khoảng thời gian thực tế sẽ dài hơn đáng kể do các chi phí chung khác nhau liên quan đến lệnh gọi hàm và các khía cạnh tính toán khác.

Thành phần này là một thành phần rất đơn giản không hiển thị trên màn hình, tuy nhiên Đồng hồ hẹn giờ Delphi thực hiện rất chức năng quan trọng trong một chương trình. cho phép bạn đưa ra độ trễ cần thiết giữa việc thực hiện một số hành động nhất định.

Thành phần hẹn giờ chỉ có bốn thuộc tính và một sự kiện và làm việc với thành phần này rất đơn giản.


Đặt thành phần trên Biểu mẫu. Đặt thuộc tính Khoảng thời gian thành khoảng thời gian cần thiết (được tính bằng mili giây). Chuyển đến tab Sự kiện và chúng tôi thấy sự kiện duy nhất được hỗ trợ bởi thành phần Bộ hẹn giờ Delphi: Hẹn giờ. Bằng cách nhấp đúp vào nó hoặc nhấp đúp vào chính thành phần đó, chúng ta sẽ được đưa đến phần được tạo Môi trường Delphi trình xử lý sự kiện, nơi chúng ta sẽ nhập mã cung cấp việc thực hiện một số hành động nhất định.

Vì theo mặc định thuộc tính Đã bật cài đặt trong ĐÚNG VẬY, sau đó trong chương trình thông qua thiết lập trong thuộc tính Khoảng thời gian khoảng thời gian bộ đếm thời gian sẽ hoạt động, nghĩa là nó sẽ đưa ra một sự kiện Hẹn giờ. Các hành động cần thiết sẽ được thực hiện. Đôi khi các hành động theo kế hoạch sẽ không tự động diễn ra khi chương trình khởi động mà khi một số hành động khác được thực hiện. Trong trường hợp này, tài sản là bắt buộc Đã bật trong Thanh tra đối tượng được đặt thành SAI. Sau đó, vào đúng thời điểm bạn cần chạy lệnh:

Hẹn giờ1.Enabled:=True;

Xin lưu ý rằng bây giờ Hẹn giờ1.Đã bật bằng ĐÚNG VẬY, thành phần sẽ tiếp tục tạo ra sự kiện Hẹn giờ sau mỗi khoảng thời gian bằng giá trị tài sản Khoảng thời gian. Do đó, nếu chỉ cần một thao tác duy nhất thì phải dừng bộ hẹn giờ và ngay lập tức:

thủ tục
bắt đầu
Hẹn giờ1.Enabled:=False;
(Những hành động cần thiết)
kết thúc;

Nếu bạn lập trình bộ hẹn giờ để "tắt" sau khi thực hiện các hành động được cung cấp trong chương trình, thì nếu giá trị của thuộc tính đủ nhỏ so với thời lượng của các hành động cần thiết Khoảng thời gianđồng hồ hẹn giờ sẽ tắt lần nữa và điều này có thể ảnh hưởng đến chương trình.

Thành phần này không chính xác lắm và không phù hợp để đo trong khoảng thời gian ngắn. Độ chính xác của nó là khoảng 50 mili giây. Để làm ví dụ tôi sẽ đưa ra một chương trình đơn giản, hiển thị thời điểm hiện tại.

Sẽ chỉ có một thành phần trên biểu mẫu Nhãn và chính thành phần của chúng tôi. Thuộc tính Hẹn giờ có thể được để bằng 1000, nhưng sớm hơn nhiều hơn máy tính chậm cần phải hiển thị thời gian vài lần trong một giây, vì do ảnh hưởng của các quá trình khác do máy tính thực hiện, các số đọc được hiển thị một lần mỗi giây “nổi”, có thể nhìn thấy rõ bằng mắt. Hãy lấy cỡ chữ lớn hơn - 50 và chọn một cỡ chữ mượt mà hơn, tôi lấy Bell M.T.. Hãy kéo dài nó ra toàn bộ Biểu mẫu: Căn chỉnh=alClient. Thực ra thì chính đoạn mã đó:

thủ tục TForm1.Timer1Timer(Người gửi: TObject);
bắt đầu
Label1.Caption:=TimeToStr(Bây giờ);
kết thúc;

Đó là tất cả! Delphi Hiện nay- Cái này chức năng hệ thống, trở về ngày giờ hiện tạiở định dạng thích hợp TDateTime. Nếu bạn chuyển đổi nó thành một chuỗi bằng hàm Thời gianToStr, thì nó sẽ trả về thời gian hiện tại nếu DateToStr, sau đó là ngày hiện tại. Nếu chúng ta cũng muốn hiển thị ngày trong chương trình của mình, chúng ta chỉ cần thêm một thành phần nữa Nhãn, và hàm DateToStr chuyển ngày vào đó. Bạn có thể tải về dự án.

Thành phần Bộ hẹn giờ Delphi là một thành phần rất đơn giản, không hiển thị trên màn hình, tuy nhiên, Bộ hẹn giờ Delphi thực hiện các chức năng rất quan trọng trong chương trình. Delphi Hẹn giờ cho phép bạn nhập độ trễ cần thiết giữa việc thực hiện một số hành động nhất định.
Thành phần Bộ hẹn giờ chỉ có bốn thuộc tính và một sự kiện và cách làm việc với thành phần Bộ hẹn giờ Delphi rất đơn giản.

Nơi chúng tôi thành phần Delphi Hẹn giờ trên Biểu mẫu. Đặt thuộc tính Khoảng thời gian thành khoảng thời gian cần thiết (được tính bằng mili giây). Chúng ta đi tới tab Sự kiện và xem sự kiện duy nhất được hỗ trợ bởi thành phần Bộ hẹn giờ Delphi: OnTimer. Bằng cách nhấp đúp vào nó hoặc nhấp đúp vào chính thành phần đó, chúng ta sẽ được đưa đến trình xử lý sự kiện do môi trường Delphi tạo ra, nơi chúng ta sẽ nhập mã để thực hiện một số hành động nhất định.

Vì thuộc tính Enabled được đặt thành True theo mặc định nên bộ hẹn giờ trong chương trình sẽ kích hoạt sau khoảng thời gian được đặt trong thuộc tính Interval, nghĩa là nó sẽ phát ra sự kiện OnTimer. Các hành động cần thiết sẽ được thực hiện. Đôi khi các hành động theo kế hoạch sẽ không tự động diễn ra khi chương trình khởi động mà khi một số hành động khác được thực hiện. Trong trường hợp này, bạn cần đặt thuộc tính Đã bật trong Trình kiểm tra đối tượng thành Sai. Sau đó, vào đúng thời điểm bạn cần chạy lệnh:

Hẹn giờ1.Enabled:=True;

Lưu ý rằng miễn là Time1.Enabled là True, thành phần sẽ tiếp tục phát ra sự kiện OnTimer sau mỗi khoảng thời gian bằng giá trị của thuộc tính Interval. Do đó, nếu chỉ cần một thao tác duy nhất thì phải dừng bộ hẹn giờ và ngay lập tức:


bắt đầu
Hẹn giờ1.Enabled:=False;
(Những hành động cần thiết)
kết thúc;

Nếu bạn lập trình bộ hẹn giờ để "tắt" sau khi thực hiện các hành động được cung cấp trong chương trình, thì nếu giá trị của thuộc tính Khoảng thời gian đủ nhỏ so với thời lượng của các hành động được yêu cầu, bộ hẹn giờ sẽ hoạt động trở lại và điều này có thể gây trở ngại. với tiến độ của chương trình.

Thành phần Bộ hẹn giờ Delphi không chính xác lắm và không phù hợp để đo trong khoảng thời gian ngắn. Độ chính xác của nó là khoảng 50 mili giây. Để làm ví dụ, tôi sẽ đưa ra một chương trình đơn giản hiển thị thời gian hiện tại.

Biểu mẫu sẽ chỉ có thành phần Nhãn và chính thành phần Bộ hẹn giờ Delphi của chúng tôi. Thuộc tính Hẹn giờ có thể được để bằng 1000, nhưng trước đây, trên các máy tính chậm hơn, cần phải hiển thị thời gian vài lần trong một giây, do ảnh hưởng của các tiến trình khác đang chạy trên máy tính, số đọc hiển thị mỗi giây một lần “trôi nổi”. ”, mà mắt có thể nhìn thấy rõ ràng. Hãy lấy cỡ chữ lớn hơn - 50 và chọn một cỡ chữ mượt mà hơn, tôi lấy Bell MT. Hãy kéo dài nó ra toàn bộ Biểu mẫu: Align=alClient. Thực ra thì chính đoạn mã đó:

thủ tục TForm1.Timer1Timer(Người gửi: TObject);
bắt đầu
Label1.Caption:=TimeToStr(Bây giờ);
kết thúc;

Đó là tất cả! Delphi Now là một hàm hệ thống trả về ngày giờ hiện tại ở định dạng TDateTime thích hợp. Nếu bạn chuyển đổi nó thành một chuỗi bằng hàm TimeToStr, nó sẽ trả về thời gian hiện tại; nếu DateToStr thì ngày hiện tại. Nếu chúng ta cũng muốn hiển thị ngày trong chương trình của mình, chúng ta chỉ cần thêm một thành phần Nhãn khác và sử dụng hàm DateToStr để chuyển ngày vào đó.

TÀI SẢN - MỤC ĐÍCH
Đã bật
- Hẹn giờ bật/tắt
Khoảng thời gian- Khoảng thời gian kích hoạt (tính bằng mili giây)
Tên- Tên các thành phần trong chương trình
Nhãn- Tham số số tùy ý

Làm sao để khi đặt giới hạn thời gian chẳng hạn 30 giây thì sau 30 giây Showmessage xuất hiện THỜI GIAN LÊN! sau đó cứ tiếp tục như vậy trong 1 phút, 2 phút, 5 phút cho nút GO

Serge_Bliznykov
Làm cho nhiệm vụ của bạn khó khăn hơn một chút.
Nếu vậy thì vứt đi

tóm lại đây là mã PAS của mô-đun:

Đơn vị Đơn vị 1;

công dụng
Windows, Tin nhắn, SysUtils, Biến thể, Lớp, Đồ họa, Điều khiển, Biểu mẫu,
Hộp thoại, StdCtrls, ComCtrls, ExtCtrls;

kiểu
TForm1 = lớp(TForm)
trckbr1: TTrackBar;
btCloseAll: TButton;
Nhãn1: Nhãn T;
Nhãn2: Nhãn T;
tmr1: TTimer;
btGO: TButton;
btStop: TButton;
Bản ghi nhớ1: TMemo;
lbThời gian còn lại: TLabel;
thủ tục FormCreate(Người gửi: TObject);
thủ tục trckbr1Change(Người gửi: TObject);
thủ tục btGOClick(Người gửi: TObject);
thủ tục StopTimerAndPrepareToNext;
thủ tục tmr1Timer(Người gửi: TObject);
thủ tục btCloseAllClick(Người gửi: TObject);
thủ tục btStopClick(Người gửi: TObject);
riêng tư
Giây hẹn giờ: số nguyên;
Thời gian bắt đầu: TDateTime;
công cộng
(Tuyên bố công khai)
kết thúc;

var
Mẫu1: TForm1;

thực hiện
sử dụng DateUtils;
($R *.dfm)

hằng số
buf: mảng Chuỗi = ("không", "30 giây", "1 phút", "2 phút" , "5 phút");
bufInterval: mảng số nguyên = (0, 30, 60, 2*60, 5*60);

thủ tục TForm1.FormCreate(Người gửi: TObject);
bắt đầu
StopTimerAndPrepareToNext;

lbRemainTime.Caption:= "";
Giây hẹn giờ:= 0;
Thời gian bắt đầu:= Bây giờ;
kết thúc;

thủ tục TForm1.StopTimerAndPrepareToNext;
bắt đầu
tmr1.Enabled:= sai; // ngay lập tức tắt bộ đếm thời gian
Memo1.Enabled:= false; // cấm nhập vào bản ghi nhớ
trckbr1.Enabled:= true; // đã bật thanh trackbar
btStop.Enabled:= false; // vô hiệu hóa nút STOP
kết thúc;

thủ tục TForm1.trckbr1Change(Người gửi: TObject);
bắt đầu
Label2.Caption:= buf;
kết thúc;

thủ tục TForm1.btGOClick(Người gửi: TObject);
bắt đầu
trckbr1.Enabled:= false; //tắt trackbar

nếu trckbr1.Position>0 thì bắt đầu (đặt thời gian tắt máy)
Giây hẹn giờ:= bufInterval;
Thời gian bắt đầu:= Bây giờ;
tmr1.Interval:= 1000; // bộ đếm thời gian sẽ kích hoạt mỗi giây
// và thực hiện các xử lý cần thiết
tmr1.Enabled:= đúng; // bắt đầu hẹn giờ
kết thúc;

btStop.Enabled:= true; // kích hoạt nút dừng hẹn giờ
Memo1.Enabled:= true; // đã mở một điều khiển nơi bạn có thể nhập nội dung nào đó
kết thúc;

thủ tục TForm1.btStopClick(Người gửi: TObject);
bắt đầu
StopTimerAndPrepareToNext;
lbRemainTime.Caption:= "";
kết thúc;

thủ tục TForm1.tmr1Timer(Người gửi: TObject);
var Giây: số nguyên;
bắt đầu
Giây:= GiâyGiữa(Bây giờ, Thời gian bắt đầu);
nếu Secs>=TimerSeconds thì bắt đầu
// đó là nó!! Thời gian đã hết!
StopTimerAndPrepareToNext;

lbRemainTime.Caption:= "hết thời gian";
ShowMessage("Thời gian của bạn đã hết!!");
Giây hẹn giờ:= 0;
kết thúc
khác
lbRemainTime.Caption:= ""+IntToStr(TimerSeconds - Secs)+" giây còn lại.";
kết thúc;

thủ tục TForm1.btCloseAllClick(Người gửi: TObject);
bắt đầu
Đóng;
kết thúc;

Sử dụng Bộ hẹn giờ ở Delphi

Lớp TTimer gói gọn các thuộc tính và phương thức làm việc với bộ đếm thời gian cho phép bạn đếm các khoảng thời gian. Mô tả lớp được đưa ra trong mô-đun ExtCtrls, vì vậy để sử dụng nó bạn phải chỉ định tên của mô-đun nàyở phần sử dụng.
Lớp TTimer không trực quan, nghĩa là nó không được hiển thị trên biểu mẫu.
Lớp này có hai thuộc tính:


Các thuộc tính này cho phép bạn quản lý thành phần. Tài sản Khoảng thời gian bộ
khoảng thời gian hẹn giờ. Tại một khoảng thời gian xác định sau khoảng thời gian trước đó
được kích hoạt hoặc sau khi thiết lập thuộc tính theo chương trình Khoảng thời gian, hoặc sau
khởi chạy ứng dụng nếu giá trị Khoảng thời gianđược cài đặt trong quá trình thiết kế,
đồng hồ bấm giờ kích hoạt, gây ra sự kiện Hẹn giờ. Trong trình xử lý sự kiện này
các hoạt động cần thiết được ghi lại.

Nếu bạn đặt Khoảng thời gian = 0 hoặc Đã bật = Sai, thì bộ hẹn giờ sẽ ngừng hoạt động.
Để bắt đầu đếm ngược thời gian, bạn cần đặt Đã bật = Đúng, nếu được cài đặt
giá trị dương Khoảng thời gian hoặc đặt giá trị dương Khoảng thời gian,
Nếu như Đã bật = Sai.

Nếu cần thiết phải khởi động bộ hẹn giờ trong một số quy trình để đếm ngược một thời điểm nhất định
khoảng thời gian, ví dụ: 5 giây, sau đó bạn cần thực hiện một số thao tác và tắt
hẹn giờ, việc này có thể được thực hiện như sau. Khi thiết kế một bộ đếm thời gian, nó được thực hiện
có sẵn ( Đã bật = Đúng), nhưng tính chất Khoảng thời gianđược đặt bằng 0 .
Bộ hẹn giờ sẽ không chạy cho đến khi hoàn tất thời gian mà bộ hẹn giờ cần bắt đầu.
nhà điều hành

Bộ hẹn giờ1.Interval:=5000;


5 giây sau sự kiện này sẽ xảy ra Hẹn giờ. Trong trình xử lý của nó, bạn cần
đặt toán tử

Bộ hẹn giờ1.Interval:=0;


thao tác này sẽ tắt bộ hẹn giờ, sau đó bạn có thể thực hiện các thao tác cần thiết.

Một cách tương đương khác để giải quyết vấn đề là sử dụng tính chất Đã bật.
Trong quá trình thiết kế, giá trị được đặt Khoảng thời gian = 5000 và ý nghĩa
Đã bật = Sai. Tại thời điểm bộ đếm thời gian cần được khởi động, câu lệnh sẽ được thực thi:

Hẹn giờ1.Enabled:=True;


Trong trình xử lý sự kiện Hẹn giờ, sẽ xảy ra 5 giây sau khi khởi chạy
hẹn giờ, bạn có thể chèn một toán tử

Hẹn giờ1.Enabled:=False;


sẽ tắt bộ hẹn giờ.

Có một điểm đặc biệt khi sử dụng lớp TTimer bên ngoài các thành phần trực quan - biểu mẫu. Thực tế là khi đặt bộ đếm thời gian trên một biểu mẫu, hàm tạo cho lớp của nó sẽ tự động được khởi chạy khi biểu mẫu được tạo và hàm hủy khi nó bị hủy. Khi tạo bộ hẹn giờ trực tiếp trong khi thực hiện chương trình và do đó, việc sử dụng trình xử lý sự kiện OnTimer phải được thực hiện như sau.
Trước tiên, một lớp phụ trợ phải được tạo có chứa một thủ tục duy nhất - một thủ tục sẽ được thực thi khi bộ đếm thời gian kích hoạt.

TTimeredObject = lớp(TObject)
thủ tục Hẹn giờEvent(Người gửi:Tobject);
kết thúc;

thủ tục TTimeredObject.TimerEvent(Người gửi:TObject);
bắt đầu
Thời gian kết thúc:=true;
kết thúc;

Biến kiểu boolean Finished phải được khai báo là biến toàn cục và biến Time1:TTimer cũng phải được khai báo ở đó. Để thực hiện việc này, trong phần giao diện của mô-đun sau từ khóa hãy viết var

var
Thời gian kết thúc:boolean;
Bộ hẹn giờ1:TBộ hẹn giờ;

Trong hàm được xuất LEntry, hàm thực sự triển khai phương thức này hoặc phương thức kia, chúng ta viết những dòng sau:

hàm LEntry(...)
var TimeredObject:TTimeredObject;
bắt đầu

// đặt thuộc tính kết thúc vòng lặp thời gian thành false
Thời gian kết thúc:=false;

// tạo bộ đếm thời gian
Bộ hẹn giờ1:=TTimer.Create(nil);
// đặt khoảng
Bộ hẹn giờ1.Interval:=5000;

// tạo đối tượng phụ mà chúng ta đã tạo
TimeredObject:=TTimeredObject.Create;

// gán trình xử lý mà chúng ta đã tạo cho phương thức OnClick của bộ đếm thời gian
Hẹn giờ1.OnClick:=TimeredObject.TimerEvent;

// khởi động bộ đếm thời gian và bắt đầu vòng lặp
Hẹn giờ1.Enabled:=true;

cho đến khi hết thời gian<>ĐÚNG VẬY;

Hãy để tôi thảo luận ngắn gọn lý do tại sao cần phải gán trình xử lý cho phương thức OnClick theo cách này. Trong phần mô tả của lớp TTimer, phương thức được mô tả như sau

thuộc tính OnTimer:TNotifyEvent đọc FOnTimer ghi SetOnTimer;

Nói chung, một thuộc tính đối tượng cung cấp cả việc đọc và/hoặc viết, sử dụng một số thủ tục, cho một số trường của lớp. TRONG trong trường hợp này trường mà thuộc tính được liên kết là trường FOnTimer. Việc đọc xảy ra trực tiếp từ trường, nhưng để ghi dữ liệu vào trường thì nó được sử dụng thủ tục đặc biệt SetOnTimer.
Thuộc tính (và đương nhiên là trường được liên kết với thuộc tính này) thuộc loại TNotifyEvent, tương ứng với sự xuất hiện của một số sự kiện. Loại TNotifyEvent được định nghĩa như sau:

TNotifyEvent = thủ tục (Người gửi:TObject) của đối tượng;

cấu trúc như vậy xác định kiểu dữ liệu - một tham chiếu đến một thủ tục thuộc về một đối tượng nhất định, nghĩa là một phương thức của đối tượng. Tham số thủ tục là đối tượng gọi sự kiện.
Chúng tôi đã định nghĩa một lớp trợ giúp có chứa một phương thức giống hệt kiểu TNotifyEvent. Do đó, thuộc tính OnTimer có thể được chỉ định trình xử lý sự kiện TimeEvent.