Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите пожалуйста решить задачу. Delphi

86K
18 февраля 2013 года
M3thod
7 / / 25.01.2013
1.Создать приложение, в котором:
a)На форме иметься три обьекта TEdit и TButton, а также объект TLabel с именем lNow
b)В основном потоке по нажатию кнопки в третьем объекте TEdit выводиться сумма первых двух TEdit.
c)В отдельном потоке( создаеться в момент запуска программы) в бесконечном цикле вычисляеться время (функция NOW()), после чего рассчитанное время выводиться в lNow.
465
19 февраля 2013 года
QWERYTY
595 / / 25.03.2012
Насчёт таймера могу помоч. Этот таймер отсчитывает милисекунды начиная с запуска программы в отдельном потоке
и заполняет глобальную переменную с которой в любой момент можно считать.
Точность зависит от момента считывания но в целом он точен до милисекунд(в виндовс это лучшее из универсальных решений что у меня получилось сделать)

Код:
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;
Несмотря на такую маленькую паузу в работе потока он почти не грузит проц. Например у меня при работе программы загрузка болтается в диапазоне от 0 до 7 процентов

Пиши если что не получается, будет время помогу
86K
19 февраля 2013 года
M3thod
7 / / 25.01.2013
С таймером понятно. Спасибо
А смотри, а можешь целиком скинуть код? Просто не совсем понятно куда вписывать
465
19 февраля 2013 года
QWERYTY
595 / / 25.03.2012
Какой целиком код?

Если я тебе скину целиком то тебе стане ещё хуже :-)

1, 2 пункт сделал?

Объясни по подробней задачу(пункт с). Какая там функция NOW, и куда её прилепить?
"после чего рассчитанное время выводиться в lNow"
После чего это после чего? Какое время нужно вывести в лэйбл и в каком формате?
Если это задание то препод должен был намекнуть как что лучше решать(по крайней мере у нас так было).
Или вы вместо препода плеер слушаете :-)
86K
19 февраля 2013 года
M3thod
7 / / 25.01.2013
Ну да, на форме я разместил объекты.
Да я не знаю, мне дал препод задачу, сказал какой варинат и делай говорит.
Я сам не могу понять что он в том пункте от меня требует...
А смотри, а как сумму посчитать?
86K
19 февраля 2013 года
M3thod
7 / / 25.01.2013
Насколько я понял функция NOW() Это время просто. Дата
var
today : TDateTime;
begin
today := Now;
ShowMessage('День = '+DateToStr(today));
ShowMessage('Время = '+TimeToStr(today));
end;
День = 05/01/2007
Время = 13:37:25

Вот, ну и это время выводится при запуске программы в Lable
465
20 февраля 2013 года
QWERYTY
595 / / 25.03.2012
Ну вот функция потока
Код:
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;
Вот BeginTime глобальная переменная, а уж когда её там выводить в лейбл решайте с преподом сами
И как её там форматировать тоже, у меня нету времени сейчас разбираться с этой темой. Я функцию Now вижу первый раз в жизни, и как там чё извлекать из дробного числа я хз


Как сумму посчитать?
Ну для целых так:
 
Код:
Edit3.Text := IntToStr(StrToInt(Edit1.Text ) + StrToInt(Edit2.Text ));
86K
20 февраля 2013 года
M3thod
7 / / 25.01.2013
Сможет мне кто-то помочь с кодом то? А то я не знаю как теперь это все объеденить
20K
20 февраля 2013 года
ellor!
198 / / 24.05.2012
С кодом помогли уже более чем для запросов типа "сделайте за меня".
465
20 февраля 2013 года
QWERYTY
595 / / 25.03.2012
Что конкретно вызывает проблемы?

Это действительно почти весь код. Остаётся теперь(вам, не мне) вдуматься в задачу(я про пункт с) и написать пару строк.
Тут есть два варианта:
1) Вы садитесь за интернет и изучаете эту тему с потоками и датой(довольно полезный для будущего).
2) Вы платите денежек и вам дают код с коментариями(быстрый, не напряжный, оставляет время для других "более важных дел")

Решать вам. На уровне безвозместной помощи я действительно вам помог на 5+
465
20 февраля 2013 года
QWERYTY
595 / / 25.03.2012
Хочешь с нуля создам проект, всё сделаю в соответствии с задачей и подробно прокоментирую за 5 сотен р?
Даже могу сделать чтоб в поля редактирования нельзя было писать ничего кроме цифр, и чтоб расчёт не происходил если не достаточно ввели данных для расчёта.
Ну и соответственно его выложу на указанный файлообменник
88K
01 апреля 2013 года
gndragonfly
6 / / 01.04.2013
Код главной формы:

Код:
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.
код потока:

Код:
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.
код проекта:

Код:
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.
сама форма:

Код:
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
рисунок:
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог