Так. Готова новая версия, 1.7. Что нового:
1. Полноценный секундомер. Точность до тысячных долей секунды. Думаю, этого хватит.

2. Добавлена возможность выключения компа по окончании отсчета
только для систем Windows 98. Для ХР я почитал хелп - там столько кода писать надо, что я сразу отказался от этой затеи. Так что пользователям
не-Windows 98 систем придется обойтись без этой фичи.

Но код открыт, так что вполне можете сами дополнить или дописать что, если хотите.

Код я выложу тут пониже.
3. Секундомер можно запустить, если у вас выделен радиобатон "Секундомер". Просто когда фокусировка на этом радиобатоне, жмите Энтер, и секундомер запустится.
Ох, уж и не помню, чего ж еще там новенького... Столько работы на секундомер ушло, что и забыл уже, чего же я там делал нового...
4. Исправлены разные мелкие баги, типа некорректной работы свойства Enabled и прочих у разных объектов.
Ну, вот, вроде, и все, что есть нового. Основным новшеством, конечно, является секундомер. У него
реализованы возможности остановить/сброс и + возможность пауза/продолжить. Полезная фича, правда?

За почти полную помощь по доработке и реализации этих двух возможностей отдельное спасибо
BreakPointMan, он мне очень много помогал в кодировании.
Вот, пожалуй, и все. Вот ссыль:
http://my-projects.narod.ru/timer1.7.zip .
Добавлено @ 17:16 Код, к сожалению, выложить не получилось - у вас на форуме длина сообщения ограничена. А код в эту длину не влезает.
Добавлено @ 17:17 Попробую разбить код на части:
Код |
#include <vcl.h> #include <windows.h> #pragma hdrstop #define MIN 47 #define MAX 59 #define BACKSPACE 8
#include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm"
TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //----------------------- Ïðîòîòèïû ôóíêöèé --------------------------------- bool TimerCheck(void); void BACK_SecNorm(void); void BACK_MinNorm(void); void BACK_HourNorm(void); void ClearTime(void); //------------------- Ñîáñòâåííî êîä ïðîãðàììû ------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender) { Label5->Caption=Edit1->Text; } //---------------------------------------------------------------------------
void __fastcall TForm1::Edit2Change(TObject *Sender) { Label6->Caption=Edit2->Text; } //---------------------------------------------------------------------------
void __fastcall TForm1::Edit3Change(TObject *Sender) { Label7->Caption=Edit3->Text; } //---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) { bool begin_timer=true; bool begin_secund=true; Button1->SetFocus(); //ÅÑËÈ ÂÊËÞ×ÅÍ ÒÀÉÌÅÐ if(RadioButton1->Checked) { if(Button1->Caption=="Ñáðîñèòü âðåìÿ" && Timer2->Enabled==false) { ClearTime(); begin_timer=false; }
if(Button1->Caption=="Ñòîï" && Timer2->Enabled==true) { Timer2->Enabled=false; Button1->Caption="Ñáðîñèòü âðåìÿ"; }
if(Button1->Caption=="Íà÷àòü îòñ÷åò" && begin_timer) { if(!TimerCheck()) return; Button1->Caption="Ñòîï"; Edit1->Enabled=false; Edit2->Enabled=false; Edit3->Enabled=false; RadioButton1->Enabled=false; RadioButton2->Enabled=false; Timer2->Enabled=true; } } //ÅÑËÈ ÂÊËÞ×ÅÍ ÑÅÊÓÍÄÎÌÅÐ if(RadioButton2->Checked) { if(Button1->Caption=="Ñáðîñèòü âðåìÿ") { ClearTime(); begin_secund=false; } if(Button1->Caption=="Ñòîï") { SecTimer->Enabled=false; Button1->Caption="Ñáðîñèòü âðåìÿ"; if(Button2->Caption=="Ïðîäîëæèòü") Button2->Caption="Ïàóçà"; Button2->Enabled=false; } if(Button1->Caption=="Íà÷àòü îòñ÷åò" && begin_secund) { launch_time=Time(); Edit1->Text="00"; Edit2->Text="00"; Edit3->Text="00"; Edit1->Enabled=false; Edit2->Enabled=false; Edit3->Enabled=false; Button2->Enabled=true; Button1->Caption="Ñòîï"; RadioButton1->Enabled=false; RadioButton2->Enabled=false; SecTimer->Enabled=true; } } } //---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender) { BACK_SecNorm(); if(Label5->Caption=="00") { if(Label6->Caption=="00") { if(Label7->Caption=="00") { Timer2->Enabled=false; Button1->Caption="Íà÷àòü îòñ÷åò"; Label5->Caption="00"; Label6->Caption="00"; Label7->Caption="00"; Edit1->Text="00"; Edit2->Text="00"; Edit3->Text="00"; Edit1->Enabled=true; Edit2->Enabled=true; Edit3->Enabled=true; RadioButton1->Enabled=true; RadioButton2->Enabled=true; if(TrayIcon1->Visible==true) TrayIcon1Restore(Sender); if(CheckBox1->Checked==true) if(!ExitWindowsEx(EWX_SHUTDOWN,0)) MessageBox(NULL,"Íå óäàëîñü âûêëþ÷èòü êîìïüþòåð! Îäíîé èç ïðè÷èí ìîæåò áûòü òî, ÷òî ó âàñ OS îòëè÷íàÿ îò Windows 98. Âîçìîæíîñòü âûêëþ÷åíèÿ êîìïüþòåðà ïðåäóñìîòðåíà òîëüêî äëÿ ñèñòåì Windows 98.","Íå ïîëó÷èëîñü!",MB_ICONSTOP); else { ShellExecute(NULL,NULL,"\endtimer.mp3",NULL,NULL,SW_SHOWNORMAL); MessageBox(NULL,"Îòñ÷åò çàêîí÷åí!","Èíôîðìàöèÿ",MB_ICONINFORMATION); } } } } if(Label7->Caption=="-1") { Label7->Caption="59"; BACK_MinNorm(); } if(Label6->Caption=="-1") { BACK_HourNorm(); Label6->Caption="59"; } } //---------------------------------------------------------------------------
|
Добавлено @ 17:17 Код |
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key) { if(Key==13) Button1Click(Sender); if(Key==BACKSPACE) return; if(Key<MIN || Key>MAX) Key=0; } //---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { Form1->Visible=false; TrayIcon1->Visible=true; } //---------------------------------------------------------------------------
void __fastcall TForm1::TrayIcon1Restore(TObject *Sender) { Form1->Visible=true; TrayIcon1->Visible=false; } //---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton2Click(TObject *Sender) { if(RadioButton2->Checked==false) return; Edit1->Enabled=false; Edit2->Enabled=false; Edit3->Enabled=false; Label8->Visible=true; } //---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton1Click(TObject *Sender) { if(RadioButton1->Checked==true) { Edit1->Enabled=true; Edit2->Enabled=true; Edit3->Enabled=true; Button2->Enabled=false; Label8->Visible=false; } } //---------------------------------------------------------------------------
bool TimerCheck(void) { //Ïðîâåðÿåì íà ïóñòîòó ïîëåé if(Form1->Edit1->Text=="" || Form1->Edit2->Text=="" || Form1->Edit3->Text=="") { MessageBox(NULL,"Âû íå ââåëè îäèí èç ïàðàìåòðîâ (÷àñû/ìèíóòû/ñåêóíäû).","Îøèáêà",MB_ICONSTOP); Form1->Edit1->SetFocus(); return false; } //Ïåðåâîä î÷åíü áîëüøèõ çíà÷åíèé â ìèíóòû/÷àñû if(StrToInt(Form1->Edit3->Text)>=60) { int errortext=StrToInt(Form1->Edit3->Text); int addsec=errortext-60; int addmin=errortext/60; int newtext=StrToInt(Form1->Edit2->Text)+addmin; Form1->Edit3->Text=IntToStr(addsec); Form1->Edit2->Text=IntToStr(newtext); } if(StrToInt(Form1->Edit2->Text)>=60) { int errortext2=StrToInt(Form1->Edit2->Text); int addmin=errortext2-60; int addhour=errortext2/60; int newtext2=StrToInt(Form1->Edit1->Text)+addhour; Form1->Edit2->Text=IntToStr(addmin); Form1->Edit1->Text=IntToStr(newtext2); } //Äîïèñûâàåì íóëèê â íà÷àëå ÷èñëà, åñëè îíî ìåíüøå 9 è áîëüøå èëè ðàâåí 0 if(StrToInt(Form1->Edit1->Text)<=9 && StrToInt(Form1->Edit1->Text)>=0 && Form1->Edit1->Text.Length()<2) Form1->Edit1->Text="0"+Form1->Edit1->Text; if(StrToInt(Form1->Edit2->Text)<=9 && StrToInt(Form1->Edit2->Text)>=0 && Form1->Edit2->Text.Length()<2) Form1->Edit2->Text="0"+Form1->Edit2->Text; if(StrToInt(Form1->Edit3->Text)<=9 && StrToInt(Form1->Edit3->Text)>=0 && Form1->Edit3->Text.Length()<2) Form1->Edit3->Text="0"+Form1->Edit3->Text; //Åñëè âñå çíà÷åíèÿ íóëåâûå, òî êàêîé íàôèã ñìûñë çàïóñêàòü òàéìåð? Âîò è ïèøåì: if(StrToInt(Form1->Edit3->Text)==0 && StrToInt(Form1->Edit2->Text)==0 && StrToInt(Form1->Edit1->Text)==0) { MessageBox(NULL,"Ïðè óñòàíîâëåííîì âðåìåíè îòñ÷åòà çàïóñêàòü òàéìåð áåññìûñëåííî.","Èíôîðìàöèÿ",MB_ICONINFORMATION); Form1->Edit1->SetFocus(); return false; } return true; } //---------------------------------------------------------------------------
void BACK_SecNorm(void) { int sec=StrToInt(Form1->Label7->Caption); sec-=1; if(sec<=9 && sec>=0) Form1->Label7->Caption="0"+IntToStr(sec); else Form1->Label7->Caption=IntToStr(sec); } //---------------------------------------------------------------------------
void BACK_MinNorm(void) { int min=StrToInt(Form1->Label6->Caption); min-=1; if(min<=9 && min>=0) Form1->Label6->Caption="0"+IntToStr(min); else Form1->Label6->Caption=IntToStr(min); } //---------------------------------------------------------------------------
void BACK_HourNorm(void) { int hour=StrToInt(Form1->Label5->Caption); hour-=1; if(hour<=9 && hour>=0) Form1->Label5->Caption="0"+IntToStr(hour); else Form1->Label5->Caption=IntToStr(hour); } //---------------------------------------------------------------------------
void __fastcall TForm1::SecTimerTimer(TObject *Sender) { //Îñòàëîñü ïîñëåäíåå - íóæíî â ýòîì ìåñòå íàïèñàòü óäàëåíèå ïåðåìåííîé launch_time. È âñå ÎÊ! Word h,m,s,ms; AnsiString nh,nm,ns,nms; TDateTime system_time=Time(); // static TDateTime launch_time=Time(); TDateTime real=system_time-launch_time; DecodeTime(real,h,m,s,ms); if(h<=9) nh="0"+IntToStr(h); else nh=h; if(m<=9) nm="0"+IntToStr(m); else nm=m; if(s<=9) ns="0"+IntToStr(s); else ns=s; if(ms<=9) nms="00"+IntToStr(ms); else if(ms<=99 && ms>9) nms="0"+IntToStr(ms); else nms=IntToStr(ms);
Label8->Caption=nh+":"+nm+":"+ns+":"+nms; } //---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) { if(Button2->Caption=="Ïðîäîëæèòü") { launch_time+=(Time()-beg_pause); Button2->Caption="Ïàóçà"; SecTimer->Enabled=true; } else { beg_pause=Time(); Button2->Caption="Ïðîäîëæèòü"; SecTimer->Enabled=false; } } //---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key) { if(Key==13) Button1Click(Sender); if(Key==BACKSPACE) return; if(Key<MIN || Key>MAX) Key=0; } //---------------------------------------------------------------------------
void __fastcall TForm1::Edit3KeyPress(TObject *Sender, char &Key) { if(Key==13) Button1Click(Sender); if(Key==BACKSPACE) return; if(Key<MIN || Key>MAX) Key=0; } //---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(Key==39) Edit2->SetFocus(); } //---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(Key==37) Edit1->SetFocus(); if(Key==39) Edit3->SetFocus(); } //---------------------------------------------------------------------------
void __fastcall TForm1::Edit3KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(Key==37) Edit2->SetFocus(); } //---------------------------------------------------------------------------
void ClearTime(void) { Form1->Edit1->Text="00"; Form1->Edit2->Text="00"; Form1->Edit3->Text="00"; Form1->Label5->Caption="00"; Form1->Label6->Caption="00"; Form1->Label7->Caption="00"; Form1->Button1->Caption="Íà÷àòü îòñ÷åò"; Form1->Edit1->Enabled=true; Form1->Edit2->Enabled=true; Form1->Edit3->Enabled=true; Form1->RadioButton1->Enabled=true; Form1->RadioButton2->Enabled=true; Form1->Label8->Caption="00:00:00:000"; if(Form1->RadioButton2->Checked==true) { Form1->Edit1->Enabled=false; Form1->Edit2->Enabled=false; Form1->Edit3->Enabled=false; } } //---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton2KeyPress(TObject *Sender, char &Key) { if(Key==13) Button1Click(Sender); } //---------------------------------------------------------------------------
|
Добавлено @ 17:18 Получилось!

Можете смотреть, списывать, добавлять и т.д. Только обо всех существенных добавлениях плиз пишите тут с комментами, чтобы я тож мог разобраться.
Добавлено @ 17:19 Да, и еще: я не стал исправлять неверную кодировку (у Билдера кодировка не та, что на форуме), посему плиз не ругайтесь за белеберду вместо русских надписей в коде.
Добавлено @ 17:20 И еще вот код немного измененного заголовочного файла:
Код |
//---------------------------------------------------------------------------
#ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include <Buttons.hpp> #include "trayicon.h" //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TTimer *Timer2; TEdit *Edit1; TEdit *Edit2; TEdit *Edit3; TLabel *Label1; TLabel *Label2; TLabel *Label3; TLabel *Label4; TLabel *Label5; TLabel *Label6; TLabel *Label7; TLabel *Label9; TLabel *Label10; TButton *Button1; TSpeedButton *SpeedButton1; TTrayIcon *TrayIcon1; TButton *Button2; TRadioGroup *RadioGroup1; TRadioButton *RadioButton1; TRadioButton *RadioButton2; TTimer *SecTimer; TLabel *Label8; TGroupBox *GroupBox1; TCheckBox *CheckBox1; void __fastcall Edit1Change(TObject *Sender); void __fastcall Edit2Change(TObject *Sender); void __fastcall Edit3Change(TObject *Sender); void __fastcall Button1Click(TObject *Sender); void __fastcall Timer2Timer(TObject *Sender); void __fastcall Edit1KeyPress(TObject *Sender, char &Key); void __fastcall SpeedButton1Click(TObject *Sender); void __fastcall TrayIcon1Restore(TObject *Sender); void __fastcall RadioButton2Click(TObject *Sender); void __fastcall RadioButton1Click(TObject *Sender); void __fastcall SecTimerTimer(TObject *Sender); void __fastcall Button2Click(TObject *Sender); void __fastcall Edit2KeyPress(TObject *Sender, char &Key); void __fastcall Edit3KeyPress(TObject *Sender, char &Key); void __fastcall Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift); void __fastcall Edit2KeyDown(TObject *Sender, WORD &Key, TShiftState Shift); void __fastcall Edit3KeyDown(TObject *Sender, WORD &Key, TShiftState Shift); void __fastcall RadioButton2KeyPress(TObject *Sender, char &Key); private: // User declarations
TDateTime launch_time, beg_pause; public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
|