Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2016, 20:55   #1
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию Использование компонента "будильник" через ListBox

Здравствуйте, уважаемые форумчане! Очень нуждаюсь в вашей помощи.

Задача такая: есть созданный мной визуальный компонент будильник. Есть программа, которая его использует. Но там возможно только использовать один будильник. Надо реализовать как в смартфоне - возможность устанавливать несколько будильников.

Компонент работает так. для вывода системного времени я наследовал метку TLabel. Через ее свойство Caption вывожу системное время.

Есть два свойства OnRing булевого типа - включен будильник или нет
и SetAlarm строкового типа. Сюда я записываю время звонка. В программе на форме размещаю DataTimePicker, из него беру время, перевожу в строковый тип. И в setAlarm записываю значение из DataTimePicker.

То есть в моем первом варианте на форме есть только та самая метка, DataPicker и две кнопки - "Задать время" (она устанавливает поле OnRing в true и записывает в SetAlarm значение из DataPicker), и "Остановить".

Я сейчас хотел добавить ListBox. Задумка: при нажатии на кнопку "Задать время" в ListBox будет добавляться новый будильник (то есть выводится время звонка), свойство OnRing ставится в true (то есть будильник включается), а в SetAlarm записывается время звонка из предварительного установленного в DataTimePicker. То есть по сути я мало что меняю, просто добавление будет через ListBox.

Вот код компонента:
Код:
unit ClockAlarm;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, ExtCtrls, MMSystem;

type
  TClockAlarm = class(TCustomLabel)
  private
    { Private declarations }
    FTimer: TTimer;
	FOnRing: boolean;
    FSetAlarm: string;
    procedure UpdateClock (Sender: TObject);
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create (AOwner: TComponent); override;
  published
    { Published declarations }
    property Align;
    property Color;
    property Font;
    property ShowHint;
    property Visible;
    property Height;
    property Width;
	  property OnRing: boolean read FOnRing write FOnRing;
    property SetAlarm: string read FSetAlarm write FSetAlarm;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TClockAlarm]);
end;

{ TClockAlarm }

constructor TClockAlarm.Create(AOwner: TComponent);
begin
  inherited Create (AOwner);
  FOnRing := false;
  FTimer := TTimer.Create (Self);
  FTimer.OnTimer := UpdateClock;
  FTimer.Enabled := true;
end;

procedure TClockAlarm.UpdateClock(Sender: TObject);
begin
  Caption := TimeToStr (Time);
  Visible:=true;
  Invalidate;
	if OnRing = true then
		begin
			if SetAlarm = TimeToStr (Time) then
				begin
          sndPlaySound('C:/3285.wav', SND_ASYNC or SND_LOOP);
        end;
		end;

  if OnRing = false then
      begin
        if sndPlaySound('C:/3285.wav', SND_ASYNC or SND_LOOP) then
        sndPlaySound(nil, SND_PURGE);
      end;
end;

end.
А вот код программы. Здесь пока на форме "старая" версия плюс кнопка Button3, которая должна добавить новый будильник в ListBox. Кроме этого будут кнопки Остановить и Удалить.

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ClockAlarm, Contnrs;

type
  TForm1 = class(TForm)
    ClockAlarm1: TClockAlarm;
    DateTimePicker1: TDateTimePicker;
    Button1: TButton;
    Button2: TButton;
    ListBox1: TListBox;
    Button3: TButton;
    DateTimePicker2: TDateTimePicker;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
    FAlarmList: TObjectList <TClockAlarm>;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClockAlarm1.OnRing := true;
  clockAlarm1.SetAlarm := TimeToStr (DateTimePicker1.time);
  Button2.Enabled := true;
  Button1.Enabled := false;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ClockAlarm1.OnRing := false;
  Button2.Enabled := false;
  Button1.Enabled := true;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
   FAlarmList.Add(TClockAlarm.Create(self));
   try
    FAlarmList[FAlarmList.Count-1].SetAlarm := TimeToStr (DateTimePicker2.time);
    FAlarmList[FAlarmList.Count-1].OnRing := true;
   finally
   ListBox1.Items.Add(DateTimePicker2.time);
   end;
end;

end.
Но возникла проблема:

1) Строка FAlarmList: TObjectList <TClockAlarm>
здесь ругается
Undeclared identifier: 'TObjectList'
';' expected but '<' found
',' or ':' expected but '>' found

2) Строка FAlarmList.Add(TClockAlarm.Create(s elf));
здесь ошибки
Missing operator or semicolon

3) оператор try
даже на него ругается
';' expected but 'TRY' found

Делаю в Delphi 7 (старая версия, не ХЕ)
Zaresh вне форума Ответить с цитированием
Старый 27.03.2016, 21:10   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
FAlarmList: TObjectList <TClockAlarm>;
В делфи 7 такой фишки еще не было
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.03.2016, 21:23   #3
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

А чем тогда можно заменить? или как правильно будет организовать вывод нескольких будильников?
Zaresh вне форума Ответить с цитированием
Старый 27.03.2016, 21:37   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для начала просто FAlarmList: TObjectList;

Где твои лэйблы для кучи будильников собираются отображаться?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.03.2016, 21:55   #5
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

Ну вот в этом одном ListBox'е будут отображаться. То есть ввожу время звонка в DataTimePicker, нажимаю кнопку "Задать". В ListBox заносится время звонка. То есть это будет первый будильник с заданными свойствами: при клике на кнопку "задать" мы занесли в его свойства время звонка и включили сам будильник.

Потом в DataTimePicker ставлю следующее время. Снова жму "задать" и в ListBox появляется второй будильник и т.д.

Я уже думал, что сначала надо задать, как вы написали. Но что дальше делать, не могу даже предположить. К сожалению, опыт программирования маленький, с синтаксисом еще мало знаком

А лейбл используется для отображения системного времени. Он должен быть один. Но как я понимаю, мне мою процедуру сейчас придется делить на две, чтобы лейблы не дублировать в ListBox'е? В одной отображается системное время. В другой - описывается работа будильника. Или не обязательно так делить?
Zaresh вне форума Ответить с цитированием
Старый 27.03.2016, 22:00   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Ой, ребяты, я ж такую весчь писал в 2009 году на Д7.
И даже немного тут в интернетах засветил.
WorkerClocker называется. На работе до сих пор народ юзает...

Афтор, хош посмотреть на мой говнокод? Там можно создать 100500 будильников!
Бонус - прога говорит время. Но только по-русски.

Вложения
Тип файла: zip WorkerClocker.7z.zip (630.7 Кб, 22 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 27.03.2016, 22:10   #7
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

До такого "говнокода" мне еще как до Луны ))) Пока сложновато. Несомненно завтра с утра ознакомлюсь подробнее. Может, подскажете, в каком направлении мне копать? А то чужой код копировать - к добру не приведет ))
Zaresh вне форума Ответить с цитированием
Старый 27.03.2016, 22:13   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
До такого "говнокода" мне еще как до Луны ))) Пока сложновато.
чо, неужели посмотрел?
страшно стало?
Цитата:
А то чужой код копировать - к добру не приведет
и не надо.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 27.03.2016, 22:16   #9
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

В вашей программе свой разработанный компонент используется или все реализовано через стандартную палитру?
Zaresh вне форума Ответить с цитированием
Старый 27.03.2016, 22:27   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Раньше (очень давно) я баловался написанием своих компонентов в том смысле, которые можно на форму положить и настроить через Object Inspector. Теперь довольствуюсь написанием только своих классов или даже иерархий классов. Писать визуальные компоненты приходится очень редко, и не устанавливаю я их в палитру никогда - они одноразовые все и заточенные под текущую задачу. Если откроешь модуль uClocker.pas, то увидишь это всё.

За годы работы у меня накопилась туева хуча левых компонентов, просто скачанных в разное время из интернетов. Jedi, Delphi Area, и ещё... Если чего-то не хватает - лезу на торри и там ищу.

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование у формы свойства "Cycle" с "MultiPage" Скрипт Microsoft Office Excel 7 23.12.2013 10:31
Visual Basic, использование операторов "for..next" и "if.. end if" Dieza Помощь студентам 0 27.10.2010 20:46