2015-06-19 2 views
-1

В Delphi я понимаю, как создать таймер. Но я не уверен, как написать код для C++ Builder. Я не мог найти ни одного примера.Определить и построить истекший таймер

В Delphi я написал ниже код, копию из источника где-то: -

.... 
type 
    TFrame2 = class(TFrame) 
StatusBar1: TStatusBar; 
Timer1: TTimer; 

constructor TFrame2.Create(TheOwner: TComponent); 
begin 
    inherited Create(TheOwner); 
    StartTime := Now; 
    Timer1.Enabled := True; 
end; 

destructor TFrame2.Destroy; 
begin 
    inherited Destroy 
end; 

procedure TFrame2.Timer1Timer(Sender: TObject);//This event occurs every second. 
Var 
Hour, Min, Sec, MSec : Word; 
Diff : TTime; 
begin 
Timer1.Enabled := False; 
Diff := Now - StartTime; 
DecodeTime(Diff, Hour, Min, Sec, MSec); 
StatusBar1.Panels.Items[1].Text := IntToStr(Min)+' Minutes, '+IntToStr(Sec)+' Seconds.'; 
Timer1.Enabled := True; 
end; 

... 

Просьба, как сделать то же самое в C++. Благодаря

+0

Delphi и C++ Builder разделяют VCL и C++ Builder имеет много специфических изменений, чтобы сделать он совместим с Delphi, поэтому преобразование C++ из кода Delphi, как правило, очень просто, по крайней мере, с таким простым кодом, как пример, который вы предоставили. Вы пытались сделать это сами? Намного лучше, если вы покажете нам код, который у вас есть на C++, и задайте конкретные проблемы, которые вы найдете в переводе, чем просто перевести все это. –

ответ

1

Попробуйте это:

.... 
class TFrame2 : public TFrame 
{ 
__published: 
    TStatusBar *StatusBar1; 
    TTimer *Timer1; 
    ... 
    void __fastcall Timer1Timer(TObject *Sender); 
    ... 
private: 
    TDateTime StartTime; 
    ... 
public: 
    __fastcall TFrame2(TComponent *TheOwner); 
}; 

__fastcall TFrame2::TFrame2(TComponent *TheOwner) 
    : TFrame(TheOwner) 
{ 
    StartTime = Now(); 
    Timer1->Enabled = true; 
} 

void __fastcall TFrame2::Timer1Timer(TObject *Sender) //This event occurs every second. 
{ 
    Timer1->Enabled = false; 

    TDateTime Diff = Now() - StartTime; 
    Word Hour, Min, Sec, MSec; 
    DecodeTime(Diff, Hour, Min, Sec, MSec); 
    StatusBar1->Panels->Items[1]->Text = String(Min)+" Minutes, "+String(Sec)+" Seconds."; 

    Timer1->Enabled = true; 
} 

... 

В качестве альтернативы, вы можете упростить Timer1Timer() к этому:

void __fastcall TFrame2::Timer1Timer(TObject *Sender) //This event occurs every second. 
{ 
    // this is not overhead-intense code, so 
    // stopping and re-starting the timer 
    // is wasting unnecessary processing time... 

    //Timer1->Enabled = true; 

    TDateTime Diff = Now() - StartTime; 
    StatusBar1->Panels->Items[1]->Text = Diff.FormatString("n' Minutes, 's' Seconds.'"); 

    //Timer1->Enabled = true; 
} 

Лично я бы не использовать системные часы на всех, в случае, если пользователь изменяет часы или автоматические кадры для DST, в то время как ваш таймер работает. Я хотел бы использовать процессор клещей вместо либо вручную:

.... 
class TFrame2 : public TFrame 
{ 
__published: 
    TStatusBar *StatusBar1; 
    TTimer *Timer1; 
    ... 
    void __fastcall Timer1Timer(TObject *Sender); 
    ... 
private: 
    DWORD StartTime; 
    ... 
public: 
    __fastcall TFrame2(TComponent *TheOwner); 
}; 

__fastcall TFrame2::TFrame2(TComponent *TheOwner) 
    : TFrame(TheOwner) 
{ 
    StartTime = GetTickCount(); 
    Timer1->Enabled = true; 
} 

void __fastcall TFrame2::Timer1Timer(TObject *Sender) //This event occurs every second. 
{ 
    //Timer1->Enabled = false; 

    DWORD Diff = GetTickCount() - StartTime; 
    DWORD Mins = Diff/60000; Diff %= 60000; 
    DWORD Secs = Diff/1000; 

    StatusBar1->Panels->Items[1]->Text = String(Mins)+" Minutes, "+String(Secs)+" Seconds."; 

    //Timer1->Enabled = true; 
} 

... 

Или через TStopWatch:

#include <System.Diagnostics.hpp> 

.... 
class TFrame2 : public TFrame 
{ 
__published: 
    TStatusBar *StatusBar1; 
    TTimer *Timer1; 
    ... 
    void __fastcall Timer1Timer(TObject *Sender); 
    ... 
private: 
    TStopwatch SW; 
    ... 
public: 
    __fastcall TFrame2(TComponent *TheOwner); 
}; 

__fastcall TFrame2::TFrame2(TComponent *TheOwner) 
    : TFrame(TheOwner) 
{ 
    SW = TStopwatch::StartNew(); 
    Timer1->Enabled = true; 
} 

void __fastcall TFrame2::Timer1Timer(TObject *Sender) //This event occurs every second. 
{ 
    //Timer1->Enabled = false; 
    SW.Stop(); 

    TTimeSpan TS = SW.Elapsed; 
    StatusBar1->Panels->Items[1]->Text = String(TS.Minutes)+" Minutes, "+String(TS.Seconds)+" Seconds."; 

    SW.Start(); 
    //Timer1->Enabled = true; 
} 
+0

Спасибо большое. Возможные решения - бонус. еще раз спасибо – user1739825

Смежные вопросы