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

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

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

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

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

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

Да, немалая подборка )) Спасибо большое! Буду смотреть, как ваш компонент устроен. Надеюсь, что он поможет.
Zaresh вне форума Ответить с цитированием
Старый 27.03.2016, 22:49   #12
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Буду смотреть, как ваш компонент устроен.
не путай компонент и класс. А классов самодельных в проге не меньше чем дохрена.
Цитата:
Да, немалая подборка
хехехе!..

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 27.03.2016 в 22:56.
min@y™ вне форума Ответить с цитированием
Старый 28.03.2016, 13:05   #13
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

Так и не нашел информации насчет ЛистБокса
Если в Delphi 7 нельзя делать так: FAlarmList: TObjectList <TClockAlarm>;
то правильным ли будет сделать так?:

type TObjectList = class (TClockAlarm)
private
FAlarmList: TObjectList;
end;

в ХЕ 7 получается реализовать так:

Код:
FAlarmList: TObjectList <TClockAlarm>;

procedure TForm1.Button6Click(Sender: TObject);
begin
  FAlarmList.Add(TAlarmClock.Create(self));
  try
    FAlarmList[FAlarmList.Count - 1].AlarmTime := strtotime(Edit2.Text);
  finally
    listbox1.Items.Add(Edit2.Text);
    button7.Enabled := true;
    showmessage('Будильник сохранен.');
  end;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
  if listbox1.ItemIndex <> - 1 then
  begin
    FAlarmList.Delete(listbox1.ItemIndex);
    listbox1.DeleteSelected;
    showmessage('Будильник удален.');
  end else
    showmessage('Выберите будильник из списка для удаления!');
  if listbox1.Count = 0 then
    button7.Enabled := false;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
  FAlarmList[AlarmActive].StopAlarm;
  FAlarmList[AlarmActive].Parent := Nil;
  Button8.Enabled := false;
end;
То есть проблема в том, что я не могу понять как реализовать использование FAlarmList в старой версии Delphi - в Delphi 7 (как передавать в этот список компонент и его свойства)
Zaresh вне форума Ответить с цитированием
Старый 28.03.2016, 13:38   #14
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Ну чо ты мучаешься?
Снеси Д7 нафиг да поставь ХЕ10.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 28.03.2016, 13:39   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Если в Delphi 7 нельзя делать так: FAlarmList: TObjectList <TClockAlarm>;

Код:
type TAlarmList =class(TObjectList)
private
FAlarmList: TObjectList;
private
  procedure SetAlarm(al: TclockAlarm; n: integer);
  function GetAlarm(n: integer): TclockAlarm;
public
  property alarm[n: integer]: TclockAlarm read GetAlarm write Setalarm; 
end;

function TAlarmList.GetAlarm(n: integer);
begin
   result:=self.item[n] as TClockAlarm;
end;

procedure TAlarmList.SetAlarm(n: integer; al: TclockAlarm);
begin
  self.item[n]:=al;
end;
то можно как-то так.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 28.03.2016, 17:39   #16
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

min@y™, да уже поставил. Я просто хотел тот компонент добить. А сейчас пришлось переписать по новой.

evg_m, спасибо большое! Хотя бы знаю теперь, как такие вещи обыгрывать.

У меня возник еще один вопрос. В коде выше есть такая процедура
Код:
procedure TForm1.Button6Click(Sender: TObject);
begin
  FAlarmList.Add(TAlarmClock.Create(self));
  try
    FAlarmList[FAlarmList.Count - 1].AlarmTime := strtotime(Edit2.Text);
  finally
    listbox1.Items.Add(Edit2.Text);
    button7.Enabled := true;
    showmessage('Будильник сохранен.');
  end;
end;
Вместо edit я решил использовать DAteTimePicker, чтобы у пользователя не было возможности поставить время типа 34:90:15. То есть ограничить формат от 0 до 24 часов.

Код
Код:
procedure TForm1.btnOnAlarmClick(Sender: TObject);
begin
  FAlarmList.Add(TClockAlarm5.Create(Self));
  try
    FAlarmList[FAlarmList.Count - 1].AlarmTime := DateTimePicker1.Time;
  finally
    ListBox1.Items.Add(TimeToStr(DateTimePicker1));
    btnDelAlarm.Enabled := true;
    ShowMessage ('Будильник установлен!');
  end;
end;
Ругается на эту строчку ListBox1.Items.Add(TimeToStr(DateTi mePicker1));
мне тут надо передать время в строковом виде
Zaresh вне форума Ответить с цитированием
Старый 28.03.2016, 17:53   #17
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

ListBox1.Items.Add(TimeToStr(DateTi mePicker1. time));
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 28.03.2016, 18:07   #18
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

min@y™, спасибо! одновременно с вашим постом пришел к правильному решению.

Частично прога готова. То есть еще надо добавить выбор дня недели для звонка.

Но пока беспокоит такая проблема. Программа худо-бедно с косяками отрабатывает функционал. Но звук не проигрывает при наступлении времени звонка.

Сначала в компоненте было sndPlaySound('C:/3285.wav', SND_ASYNC or SND_LOOP);
Модуль MMSystem подключен.

Ладно, меняю эту сроку на
beep;
Delay(2000);

все равно нет звука

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

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Winapi.MMSystem;

type
  TClockAlarm5Event = procedure(Sender: TObject) of object;
  TClockAlarm5Thread = class(TThread) // поток для проигрывания сигнала без прерывания основного потока
  private
    procedure Delay(dwMilliseconds: Longint); // задержка выполнения
  protected
    procedure Execute; override; // метод проигрывания сигнала
  end;

type
  TClockAlarm5 = class(TCustomPanel)
  private
    FOnAlarm: TClockAlarm5Event; // событие при срабатывании будильника
    FOnStopAlarm: TClockAlarm5Event; // событие при отключении будильника
    FOnSetup: TClockAlarm5Event; // событие при установки будильника
    FEdit: TEdit; // Edit для отоброжения системного времени
    FTimer: TTimer; // Timer для обновления системного времени
    FClockAlarm5Thread: TClockAlarm5Thread;
    FClockAlarm5Time: TTime;
    FActiveAlarm: boolean;
    procedure SetAlarmTime(const Value: TTime);
    procedure WMSize(var Message: TMessage); message WM_SIZE; // перехват изменения размера компонента
    procedure SetTextFont(Value: TFont);
    function GetTextFont: TFont;
    procedure SetBGColor(Value: TColor);
    function GetBGColor: TColor;
  protected
    procedure TimerTimer(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override; // конструктор
    destructor Destroy; override; // деструктор
    property ActiveAlarm: boolean read FActiveAlarm; // есть ли активный будильник
    property AlarmTime: TTime read FClockAlarm5Time write SetAlarmTime; // установка времени будильника
    procedure StopAlarm; // программное отключение будильника
  published
    property TextFont: TFont read GetTextFont write SetTextFont; // изменение шрифта FEdit
    property BGColor: TColor read GetBGColor write SetBGColor; // изменение цвета FEdit
    property Align;
    property Enabled;
    property Visible;
    { события }
    property OnAlarm: TClockAlarm5Event read FOnAlarm write FOnAlarm;
    property OnStopAlarm: TClockAlarm5Event read FOnStopAlarm write FOnStopAlarm;
    property OnSetup: TClockAlarm5Event read FOnSetup write FOnSetup;
    property OnClick;
    property OnDblClick;
    property OnMouseActivate;
    property OnMouseDown;
    property OnMouseEnter;
    property OnMouseLeave;
    property OnMouseMove;
    property OnMouseUp;
    property OnResize;
    property PopupMenu;
  end;

procedure Register;

implementation

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

constructor TClockAlarm5.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  { инициализация компонентов }
  FEdit := TEdit.Create(self);
  FEdit.Parent := self;
  FTimer := TTimer.Create(self);
  { настройка AlarmClock }
  self.Height := 30;
  self.Width := 150;
  self.BevelOuter := bvNone;
  self.Caption := '';
  self.ShowCaption := false;
  { настройка Edit }
  FEdit.Text := timetostr(Now);
  Fedit.Alignment := taCenter;
  FEdit.Enabled := false;
  FEdit.Font.Size := 12;
  FEdit.Font.Name := 'Arial';
  FEdit.Top := 0;
  FEdit.Left := 0;
  FEdit.Width := self.Width;
  { настройка Timer }
  FTimer.OnTimer := self.TimerTimer;
  FTimer.Interval := 1000;
  FTimer.Enabled := true;
  { настройка AlarmThreadTimer }
  FClockAlarm5Thread := TClockAlarm5Thread.Create(True); // поток ожидает запуск
  FClockAlarm5Thread.Priority := tpLower; // приоритет выполнения потока
end;

destructor TClockAlarm5.Destroy;
begin
  FEdit.Free;
  FTimer.Free;
  FClockAlarm5Thread.Terminate;
  FClockAlarm5Thread.Free;
  inherited;
end;

function TClockAlarm5.GetBGColor: TColor;
begin
  result := FEdit.Color;
end;

function TClockAlarm5.GetTextFont: TFont;
begin
  result := FEdit.Font;
end;

procedure TClockAlarm5.SetBGColor(Value: TColor);
begin
  FEdit.Color := value;
end;

procedure TClockAlarm5.SetTextFont(Value: TFont);
begin
  FEdit.Font := value;
end;

procedure TClockAlarm5.SetAlarmTime(const Value: TTime);
begin
  FClockAlarm5Time := Value;
  FActiveAlarm := true;
  if Assigned(FOnSetup) then
    FOnSetup(self);
end;

procedure TClockAlarm5.StopAlarm;
begin
  if FClockAlarm5Thread.Suspended = false  then
  begin
    FActiveAlarm := false;
    FClockAlarm5Thread.Suspend;
    if Assigned(FOnStopAlarm) then
      FOnStopAlarm(self);
  end;
end;

procedure TClockAlarm5.TimerTimer(Sender: TObject);
var
  i: integer;
begin
  FEdit.Text := timetostr(Now);
  if timetostr(FClockAlarm5Time) = timetostr(Now)  then
  begin
    if Assigned(FOnAlarm) then
      FOnAlarm(self);
    FActiveAlarm := false;
    FClockAlarm5Thread.Resume; // возобновление работы потока
  end;
end;

procedure TClockAlarm5.WMSize(var Message: TMessage);
begin
  inherited;
  if self.Width < 80 then
    self.Width := 80;
  if self.Height < 30 then
    self.Height := 30;
  FEdit.Width := self.Width;
end;

procedure TClockAlarm5Thread.Delay(dwMilliseconds: Integer);
var
  iStart, iStop: DWORD;
begin
  iStart := GetTickCount;
  repeat
    iStop := GetTickCount;
    Application.ProcessMessages;
  until (iStop - iStart) >= dwMilliseconds;
end;

procedure TClockAlarm5Thread.Execute;
begin
  while not Terminated do
  begin
    //sndPlaySound('C:/3285.wav', SND_ASYNC or SND_LOOP);
	beep;
	Delay(2000);
  end;
end;

end.
код программы в этот пост не поместился
Zaresh вне форума Ответить с цитированием
Старый 28.03.2016, 18:16   #19
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

жуть какая.
треды-то зачем тут?
нафига так сложно?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 28.03.2016, 18:25   #20
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

Если будет несколько будильников, надо иметь возможность проигрывать мелодию и при этом иметь возможность нормально работать с кнопками. в общем, мне посоветовали выделить проигрывание в отдельный поток.

А вот код программы
Код:
unit ProgClockAlarm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls,
  Vcl.ComCtrls, VCLTee.TeCanvas, Vcl.Mask, System.Generics.Collections,
  Vcl.Menus, ClockAlarm5;

type
  TForm1 = class(TForm)
    btnOnAlarm: TButton;
    btnStopAlarm: TButton;
    btnDelAlarm: TButton;
    Memo1: TMemo;
    ListBox1: TListBox;
    ClockAlarm51: TClockAlarm5;
    TimerAlarm: TTimer;
    DateTimePicker1: TDateTimePicker;
    btnColorClock: TButton;
    procedure FormCreate(Sender: TObject);
    procedure ClockAlarm51Alarm(Sender: TObject);
    procedure ClockAlarm51Setup(Sender: TObject);
    procedure ClockAlarm51StopAlarm(Sender: TObject);
    procedure btnOnAlarmClick(Sender: TObject);
    procedure btnDelAlarmClick(Sender: TObject);
    procedure btnStopAlarmClick(Sender: TObject);
    procedure TimerAlarmTimer(Sender: TObject);
    procedure btnColorClockClick(Sender: TObject);
  private
    FAlarmList: TObjectList<TClockAlarm5>;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ClockAlarmActive: integer;

implementation

{$R *.dfm}

procedure TForm1.btnColorClockClick(Sender: TObject);
begin
  //ClockAlarm51.BGColor := btnColorClock.SymbolColor;
end;

procedure TForm1.btnDelAlarmClick(Sender: TObject);
begin
  if ListBox1.ItemIndex <> - 1 then
    begin
      FAlarmList.Delete(ListBox1.ItemIndex);
      ListBox1.DeleteSelected;
      ShowMessage ('Будильник удален!');
    end
    else
    ShowMessage ('Вы не выбрали будильник для удаления!');
    if ListBox1.Count = 0 then
    btnDelAlarm.Enabled := false;
end;

procedure TForm1.btnOnAlarmClick(Sender: TObject);
begin
  FAlarmList.Add(TClockAlarm5.Create(Self));
  try
    FAlarmList[FAlarmList.Count - 1].AlarmTime := DateTimePicker1.Time;
  finally
    ListBox1.Items.Add(TimeToStr(DateTimePicker1.Time));
    btnDelAlarm.Enabled := true;
    ShowMessage ('Будильник установлен!');
  end;
end;

procedure TForm1.btnStopAlarmClick(Sender: TObject);
begin
  FAlarmList[ClockAlarmActive].StopAlarm;
  FAlarmList[ClockAlarmActive].Parent:=nil;
  btnStopAlarm.Enabled := false;
end;

procedure TForm1.ClockAlarm51Alarm(Sender: TObject);
begin
  Form1.Caption := 'Просыпайся!';
end;

procedure TForm1.ClockAlarm51Setup(Sender: TObject);
begin
  Form1.Caption := 'Время звонка задано! Высыпайтесь!';
end;

procedure TForm1.ClockAlarm51StopAlarm(Sender: TObject);
begin
  Form1.Caption := 'Будильник выключен! Удачного дня!';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FAlarmList := TObjectList<TClockAlarm5>.Create;
  btnStopAlarm.Enabled := false;
  btnDelAlarm.Enabled := false;
  //btnColorClock.SymbolColor := ClockAlarm51.BGColor;
end;

procedure TForm1.TimerAlarmTimer(Sender: TObject);
  var i:integer;
begin
  for i:=0 to ListBox1.Count - 1 do
    begin
      if ListBox1.Items[i] = TimeToStr (Now) then
      begin
        btnStopAlarm.Enabled := true;
        FAlarmList[i].Parent := Form1;
        ClockAlarmActive := i;
      end;
    end;
end;

end.
Только здесь почему-то не работает SymbolColor. Я его закомментил

Во вложении скрин программы
Изображения
Тип файла: jpg Безымянный.jpg (112.6 Кб, 124 просмотров)

Последний раз редактировалось Zaresh; 28.03.2016 в 18:39.
Zaresh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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