Помогите пожалуйста решить задачу. Delphi
a)На форме иметься три обьекта TEdit и TButton, а также объект TLabel с именем lNow
b)В основном потоке по нажатию кнопки в третьем объекте TEdit выводиться сумма первых двух TEdit.
c)В отдельном потоке( создаеться в момент запуска программы) в бесконечном цикле вычисляеться время (функция NOW()), после чего рассчитанное время выводиться в lNow.
и заполняет глобальную переменную с которой в любой момент можно считать.
Точность зависит от момента считывания но в целом он точен до милисекунд(в виндовс это лучшее из универсальных решений что у меня получилось сделать)
Код:
function MyTimerThread(Data: POINTER): INTEGER;
var
Time: SYSTEMTIME;
StartTime, NowTime: UINT64;
begin
GetSystemTime(Time);
StartTime := Time.wMilliseconds + Time.wSecond * 1000 + Time.wMinute * 60000 + Time.wHour * 3600000;
repeat
Sleep(1);
GetSystemTime(Time);
NowTime := Time.wMilliseconds + Time.wSecond * 1000 + Time.wMinute * 60000 + Time.wHour * 3600000;
BeginTime := NowTime - StartTime;
until 2 < 1;
end;
var
Time: SYSTEMTIME;
StartTime, NowTime: UINT64;
begin
GetSystemTime(Time);
StartTime := Time.wMilliseconds + Time.wSecond * 1000 + Time.wMinute * 60000 + Time.wHour * 3600000;
repeat
Sleep(1);
GetSystemTime(Time);
NowTime := Time.wMilliseconds + Time.wSecond * 1000 + Time.wMinute * 60000 + Time.wHour * 3600000;
BeginTime := NowTime - StartTime;
until 2 < 1;
end;
Пиши если что не получается, будет время помогу
А смотри, а можешь целиком скинуть код? Просто не совсем понятно куда вписывать
Если я тебе скину целиком то тебе стане ещё хуже :-)
1, 2 пункт сделал?
Объясни по подробней задачу(пункт с). Какая там функция NOW, и куда её прилепить?
"после чего рассчитанное время выводиться в lNow"
После чего это после чего? Какое время нужно вывести в лэйбл и в каком формате?
Если это задание то препод должен был намекнуть как что лучше решать(по крайней мере у нас так было).
Или вы вместо препода плеер слушаете :-)
Да я не знаю, мне дал препод задачу, сказал какой варинат и делай говорит.
Я сам не могу понять что он в том пункте от меня требует...
А смотри, а как сумму посчитать?
var
today : TDateTime;
begin
today := Now;
ShowMessage('День = '+DateToStr(today));
ShowMessage('Время = '+TimeToStr(today));
end;
День = 05/01/2007
Время = 13:37:25
Вот, ну и это время выводится при запуске программы в Lable
Код:
function MyTimerThread(Data: POINTER): INTEGER;
var
StartTime, NowTime: EXTENDED; // Тотже TDateTime
begin
StartTime := Now;
repeat
Sleep(1);
NowTime := Now;
BeginTime := NowTime - StartTime;
until 2 < 1;
end;
var
StartTime, NowTime: EXTENDED; // Тотже TDateTime
begin
StartTime := Now;
repeat
Sleep(1);
NowTime := Now;
BeginTime := NowTime - StartTime;
until 2 < 1;
end;
И как её там форматировать тоже, у меня нету времени сейчас разбираться с этой темой. Я функцию Now вижу первый раз в жизни, и как там чё извлекать из дробного числа я хз
Как сумму посчитать?
Ну для целых так:
Код:
Edit3.Text := IntToStr(StrToInt(Edit1.Text ) + StrToInt(Edit2.Text ));
Сможет мне кто-то помочь с кодом то? А то я не знаю как теперь это все объеденить
С кодом помогли уже более чем для запросов типа "сделайте за меня".
Это действительно почти весь код. Остаётся теперь(вам, не мне) вдуматься в задачу(я про пункт с) и написать пару строк.
Тут есть два варианта:
1) Вы садитесь за интернет и изучаете эту тему с потоками и датой(довольно полезный для будущего).
2) Вы платите денежек и вам дают код с коментариями(быстрый, не напряжный, оставляет время для других "более важных дел")
Решать вам. На уровне безвозместной помощи я действительно вам помог на 5+
Даже могу сделать чтоб в поля редактирования нельзя было писать ничего кроме цифр, и чтоб расчёт не происходил если не достаточно ввели данных для расчёта.
Ну и соответственно его выложу на указанный файлообменник
Код:
unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ThrUnit;
type
TMainForm = class(TForm)
EditSl1: TEdit;
EditSl2: TEdit;
EditSum: TEdit;
BtnSum: TButton;
lNow: TLabel;
procedure BtnSumClick(Sender: TObject);
procedure EditSl1KeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure lNowDblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
lTimeThr: TimeThread;
implementation
{$R *.dfm}
procedure TMainForm.BtnSumClick(Sender: TObject);
begin
EditSum.Text := FloatToStr(StrToFloat(EditSl1.Text) + StrToFloat(EditSl2.Text)
);
end;
procedure TMainForm.EditSl1KeyPress(Sender: TObject; var Key: Char);
begin
with (Sender as TEdit) do
begin
if (CharInSet(Key, ['/', '.', ','])) or (Key = 'б') or (Key = 'Б') or
(Key = 'ю') or (Key = 'Ю') then
Key := DecimalSeparator
else if Key <> #8 then
if not CharInSet(Key, ['0' .. '9']) then
Key := #0;
if ((Key = ',') and ((Pos(',', Text) <> 0) or (Text = ''))) then
Key := #0;
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
lTimeThr := TimeThread.Create(tpLower, Self.lNow);
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
if Assigned(lTimeThr) then
begin
SetEvent(lTimeThr.TermEvent);
lTimeThr := nil;
end;
end;
procedure TMainForm.lNowDblClick(Sender: TObject);
begin
if Assigned(lTimeThr) then
begin
SetEvent(lTimeThr.TermEvent);
lTimeThr := nil;
end
else
lTimeThr := TimeThread.Create(tpLower, Self.lNow);
end;
end.
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ThrUnit;
type
TMainForm = class(TForm)
EditSl1: TEdit;
EditSl2: TEdit;
EditSum: TEdit;
BtnSum: TButton;
lNow: TLabel;
procedure BtnSumClick(Sender: TObject);
procedure EditSl1KeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure lNowDblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
lTimeThr: TimeThread;
implementation
{$R *.dfm}
procedure TMainForm.BtnSumClick(Sender: TObject);
begin
EditSum.Text := FloatToStr(StrToFloat(EditSl1.Text) + StrToFloat(EditSl2.Text)
);
end;
procedure TMainForm.EditSl1KeyPress(Sender: TObject; var Key: Char);
begin
with (Sender as TEdit) do
begin
if (CharInSet(Key, ['/', '.', ','])) or (Key = 'б') or (Key = 'Б') or
(Key = 'ю') or (Key = 'Ю') then
Key := DecimalSeparator
else if Key <> #8 then
if not CharInSet(Key, ['0' .. '9']) then
Key := #0;
if ((Key = ',') and ((Pos(',', Text) <> 0) or (Text = ''))) then
Key := #0;
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
lTimeThr := TimeThread.Create(tpLower, Self.lNow);
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
if Assigned(lTimeThr) then
begin
SetEvent(lTimeThr.TermEvent);
lTimeThr := nil;
end;
end;
procedure TMainForm.lNowDblClick(Sender: TObject);
begin
if Assigned(lTimeThr) then
begin
SetEvent(lTimeThr.TermEvent);
lTimeThr := nil;
end
else
lTimeThr := TimeThread.Create(tpLower, Self.lNow);
end;
end.
Код:
unit ThrUnit;
interface
uses
Classes, SysUtils, Windows, StdCtrls;
type
TimeThread = class(TThread)
private
{ Private declarations }
FTermEvent: THandle;
LN: TLabel;
public
constructor Create(ThreadPriority: TThreadPriority; labelNow: TLabel);
property TermEvent: THandle read FTermEvent;
protected
procedure Execute; override;
end;
implementation
{ TimeThread }
constructor TimeThread.Create(ThreadPriority: TThreadPriority;
labelNow: TLabel);
begin
inherited Create(True); // Поток создаем в состоянии «Приостановлен»
FreeOnTerminate := True; // Поток освободит ресурсы при окончании работы
LN := labelNow;
{ хэндл события завершения потока }
FTermEvent := CreateEvent(nil, True, False, nil);
Self.Priority := ThreadPriority; // приоритет потока из .. см ниже
// tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest, tpTimeCritical
Resume; // Переводим поток в состояние «Активен»
end;
procedure TimeThread.Execute;
var
hDir: THandle;
WaitHandles: array [0 .. 1] of THandle;
begin
try
while True do
begin
// обновляем время
Synchronize( procedure begin try LN.Caption := FormatDateTime
(' h:nn:ss dd mmm yyyy', now); except end; end);
{ ожидаем событие 500мс - можно указать любое число}
if WaitForSingleObject(FTermEvent, 500) = WAIT_OBJECT_0 then
Break;
end;
finally
end;
end;
end.
interface
uses
Classes, SysUtils, Windows, StdCtrls;
type
TimeThread = class(TThread)
private
{ Private declarations }
FTermEvent: THandle;
LN: TLabel;
public
constructor Create(ThreadPriority: TThreadPriority; labelNow: TLabel);
property TermEvent: THandle read FTermEvent;
protected
procedure Execute; override;
end;
implementation
{ TimeThread }
constructor TimeThread.Create(ThreadPriority: TThreadPriority;
labelNow: TLabel);
begin
inherited Create(True); // Поток создаем в состоянии «Приостановлен»
FreeOnTerminate := True; // Поток освободит ресурсы при окончании работы
LN := labelNow;
{ хэндл события завершения потока }
FTermEvent := CreateEvent(nil, True, False, nil);
Self.Priority := ThreadPriority; // приоритет потока из .. см ниже
// tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest, tpTimeCritical
Resume; // Переводим поток в состояние «Активен»
end;
procedure TimeThread.Execute;
var
hDir: THandle;
WaitHandles: array [0 .. 1] of THandle;
begin
try
while True do
begin
// обновляем время
Synchronize( procedure begin try LN.Caption := FormatDateTime
(' h:nn:ss dd mmm yyyy', now); except end; end);
{ ожидаем событие 500мс - можно указать любое число}
if WaitForSingleObject(FTermEvent, 500) = WAIT_OBJECT_0 then
Break;
end;
finally
end;
end;
end.
Код:
program Zadacha1;
uses
Forms,
MainUnit in 'MainUnit.pas' {MainForm},
ThrUnit in 'ThrUnit.pas';
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
uses
Forms,
MainUnit in 'MainUnit.pas' {MainForm},
ThrUnit in 'ThrUnit.pas';
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
Код:
object MainForm: TMainForm
Left = 0
Top = 0
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = #1057#1091#1084#1084#1072' + '#1087#1086#1090#1086#1082
ClientHeight = 170
ClientWidth = 327
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poDesktopCenter
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object lNow: TLabel
Left = 51
Top = 120
Width = 206
Height = 25
AutoSize = False
Font.Charset = RUSSIAN_CHARSET
Font.Color = clBlue
Font.Height = -13
Font.Name = 'Times New Roman'
Font.Style = []
ParentFont = False
OnDblClick = lNowDblClick
end
object EditSl1: TEdit
Left = 8
Top = 8
Width = 121
Height = 21
Alignment = taRightJustify
TabOrder = 0
Text = '100'
OnKeyPress = EditSl1KeyPress
end
object EditSl2: TEdit
Left = 8
Top = 35
Width = 121
Height = 21
Alignment = taRightJustify
TabOrder = 1
Text = '200'
OnKeyPress = EditSl1KeyPress
end
object EditSum: TEdit
Left = 183
Top = 21
Width = 121
Height = 21
Alignment = taCenter
Enabled = False
TabOrder = 2
end
object BtnSum: TButton
Left = 112
Top = 62
Width = 97
Height = 35
Caption = #1057#1091#1084#1084#1072
TabOrder = 3
OnClick = BtnSumClick
end
end
Left = 0
Top = 0
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = #1057#1091#1084#1084#1072' + '#1087#1086#1090#1086#1082
ClientHeight = 170
ClientWidth = 327
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poDesktopCenter
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object lNow: TLabel
Left = 51
Top = 120
Width = 206
Height = 25
AutoSize = False
Font.Charset = RUSSIAN_CHARSET
Font.Color = clBlue
Font.Height = -13
Font.Name = 'Times New Roman'
Font.Style = []
ParentFont = False
OnDblClick = lNowDblClick
end
object EditSl1: TEdit
Left = 8
Top = 8
Width = 121
Height = 21
Alignment = taRightJustify
TabOrder = 0
Text = '100'
OnKeyPress = EditSl1KeyPress
end
object EditSl2: TEdit
Left = 8
Top = 35
Width = 121
Height = 21
Alignment = taRightJustify
TabOrder = 1
Text = '200'
OnKeyPress = EditSl1KeyPress
end
object EditSum: TEdit
Left = 183
Top = 21
Width = 121
Height = 21
Alignment = taCenter
Enabled = False
TabOrder = 2
end
object BtnSum: TButton
Left = 112
Top = 62
Width = 97
Height = 35
Caption = #1057#1091#1084#1084#1072
TabOrder = 3
OnClick = BtnSumClick
end
end