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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2011, 02:54   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Написал простенький класс, но таймер внутри него не работает

Доброго времени суток!

Написал простенький класс...
Сам класс функционирует успешно и удачно.
Код:
unit SheduleTaskMgrUnit;

interface

uses Classes, SysUtils, ComCtrls, Contnrs, sListView, ExtCtrls, GlobalStrings;

type
  TSheduleTaskAction = (saStart, saStop, saRestart);

type
  TSheduleTask = class(TObject)
  public
    Active: Boolean;
    Date: TDateTime;
    Time: TDateTime;
    CycleTask: Boolean;
    Action: TSheduleTaskAction;
  end;

type
  ATasks = array of TSheduleTask;

type
  TSheduleTaskManager = class(TObjectList)
  private
    fLV: TsListView;
    fVisible: Boolean;
    fTimer: TTimer;
    fOnTimerEvent: TNotifyEvent;

    //Prop fTimer
    function GetEnabled: Boolean;
    procedure SetEnabled(aVal: Boolean);
    function GetTimerValue: Cardinal;
    procedure SetTimerValue(aVal: Cardinal);

    //property tasks
    function GetTask(aIndex: Integer): TSheduleTask;
  public
    property Tasks[aIndex: Integer]: TSheduleTask read GetTask;
    property CheckTime: Cardinal read GetTimerValue write SetTimerValue default 1000;
    property Enabled: Boolean read GetEnabled write SetEnabled default False;
    property OnCheckOnd: TNotifyEvent read fOnTimerEvent write fOnTimerEvent;
    property LV: TsListView read fLV write fLV;
    property VisibleOn: Boolean read fVisible write fVisible default False;
    procedure AddTask(aTask: TSheduleTask);
    procedure DeleteTask(aIndex: Integer);
    function WriteTasksToArray: ATasks;
    procedure ReadTasksFromArray(aTasksArray: ATasks);
    procedure UpdateTaskData(aindex: Integer);
    constructor Create;
    destructor destroy; override;
  end;

implementation

{ TSheduleTaskManager }

procedure TSheduleTaskManager.AddTask(aTask: TSheduleTask);
var
  LI: TListItem;
begin
  if VisibleOn then
  begin
    with fLV do
    begin
      LI := Items.Add;
      case aTask.Action of
        saStart: Li.Caption := RssaStart;
        saStop: Li.Caption := RssaStop;
        saRestart: Li.Caption := RssaRestart;
      end;
      Li.SubItems.Add(DateToStr(aTask.Date));
      Li.SubItems.Add(TimeToStr(aTask.Time));
    end;
  end;
end;

constructor TSheduleTaskManager.Create;
begin
  inherited;
  fTimer := TTimer.Create(nil);
  fTimer.Interval := 1000;
  fTimer.OnTimer := nil;
  fTimer.Enabled := False;
end;

procedure TSheduleTaskManager.DeleteTask(aIndex: Integer);
begin
  Delete(aIndex);
  fLV.Items.Delete(aIndex);
end;

destructor TSheduleTaskManager.destroy;
begin
  FreeAndNil(fTimer);
  inherited;
end;

function TSheduleTaskManager.GetEnabled: Boolean;
begin
  Result := fTimer.Enabled;
end;

function TSheduleTaskManager.GetTask(aIndex: Integer): TSheduleTask;
begin
  try
    Result := TSheduleTask(Items[aIndex]);
  except
   //EXEPTION КЭП???
  end;
end;

function TSheduleTaskManager.GetTimerValue: Cardinal;
begin
  Result := fTimer.Interval;
end;

procedure TSheduleTaskManager.SetEnabled(aVal: Boolean);
begin
  fTimer.Enabled := aVal;
end;

procedure TSheduleTaskManager.SetTimerValue(aVal: Cardinal);
begin
  fTimer.interval := aVal;
end;

procedure TSheduleTaskManager.UpdateTaskData(aindex: Integer);
begin
  with fLV.Items[aIndex] do
  begin
    case Tasks[aindex].Action of
      saStart: Caption := RssaStart;
      saStop: Caption := RssaStop;
      saRestart: Caption := RssaRestart;
    end;
    SubItems[0] := DateToStr(Tasks[aindex].Date);
    SubItems[1] := TimeToStr(Tasks[aindex].Time);
  end;
end;

{
2 нижних метода. исп. для перемещения задач между списками.
1 из них создаётся в run-time, и там же уничтожается(Юзер открыл форму, редактировал, закрыл).
}
procedure TSheduleTaskManager.ReadTasksFromArray(
  aTasksArray: ATasks);
var
  i: Integer;
begin
  for i := Low(aTasksArray) to High(aTasksArray) do
  begin
    AddTask(aTasksArray[i]);
  end;
end;


//NOTE "Утечка памяти??"
function TSheduleTaskManager.WriteTasksToArray: ATasks;
var
  i: Integer;
  a: ATasks;
begin
  SetLength(a, 0);
  for i := 0 to Count - 1 do
  begin
    SetLength(a, Length(a) + 1);
    a[i] := Tasks[i];
  end;
end;

end.

Проблема с таймером внутри класса...
Код:
constructor TApp.Create; //Обьект "программа-задача"
begin
  inherited;
  Sheduler := TSheduleTaskManager.Create; // спислк "план-задач" для этой задачи
  Sheduler.VisibleOn := False; //У нас нет ListView
  Sheduler.CheckTime := 1000;
  Sheduler.OnCheckOnd := DoShedulerCheckEnd; //Назначается но не срабатывает
  Sheduler.Enabled := True; //Тут тоже не понятно
end;
Вроде все правильно..
Но событие DoShedulerCheckEnd не срабатывает вообще... Но должно.
из под дебагера видно что оно = nil.

как быть?

Последний раз редактировалось Человек_Борща; 28.10.2011 в 03:04.
Человек_Борща вне форума Ответить с цитированием
Старый 28.10.2011, 03:06   #2
Хамяг
Форумчанин
 
Аватар для Хамяг
 
Регистрация: 22.08.2008
Сообщений: 105
По умолчанию

нет, не должно

Код:
property OnCheckOnd: TNotifyEvent read fOnTimerEvent write fOnTimerEvent;
записывается указатель в fOnTimerEvent и... и всё. нужно сделать примерно так:

Код:
private
  procedure SetEvent(AEvent: TNotifyEvent);
public
  property OnCheckOnd: TNotifyEvent read fOnTimerEvent write SetEvent;
и реализация метода

Код:
procedure TSheduleTaskManager.SetEvent(AEvent: TNotifyEvent);
begin
  fOnTimerEvent:=AEvent;
  fTimer.OnTimer:=fOnTimerEvent;
end;
Хамяг вне форума Ответить с цитированием
Старый 28.10.2011, 03:41   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Таак это я уже сам допёр..
теперь другая проблема..

как обмениваться списком между 2-я списками?
я придумал через массив...

Последний раз редактировалось Человек_Борща; 28.10.2011 в 03:45.
Человек_Борща вне форума Ответить с цитированием
Старый 28.10.2011, 07:23   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Мне почему-то думается, что в procedure TSheduleTaskManager.AddTask(aTask: TSheduleTask); нет items.add (те айтемс, которые обжектлиста), хотя по логике должны быть - ведь в геттере Вы их берете из айтемс.

А насчёт fOnTimerEvent не понял, зачем он вообще нужен ? сделайте геттер и сеттер прямо в fTimer.OnTimer , зачем лишняя сущность ?

Насчёт массивов и обмена что-то пока не допонял, что надо сделать? единственное, что могу посоветовать - написать свой собственный Tlist-потомок для тасков, и манипулировать им везде - создали, занесли, передали указатель, он там сварился, уничтожили, никаких утечек. Зачем нужны массивы, туда-сюда их по подпрограммам гонять ?? хех, опять же, в предлагаемом мной примере есть и такая вещь ))) , блин, запилить может уже тему по данной штуке , надо мне хорошо подумать, может сделаю, прокомментить только надо бы получше.

Последний раз редактировалось phomm; 28.10.2011 в 07:32.
phomm вне форума Ответить с цитированием
Старый 28.10.2011, 10:21   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
А насчёт fOnTimerEvent не понял, зачем он вообще нужен ? сделайте геттер и сеттер прямо в fTimer.OnTimer , зачем лишняя сущность ?
тьак ведь и было так:
Цитата:
А насчёт fOnTimerEvent не понял, зачем он вообще нужен ? сделайте геттер и сеттер прямо в fTimer.OnTimer , зачем лишняя сущность ?
нет, не воркает..

в
Код:
TSheduleTaskManager.AddTask(aTask: TSheduleTask);
небыло заветного коада:
Код:
Add(aTask);

по поводу массивов. Это класс существует в 2 экземплярах.
1. вариант, когда юзер редактирует все данные TApp.
Создаётся TForm там создаётся Sheduler с VisibleOn:=True,
но т.к. я не знаю как из уже сущ. TObjectLis'а переместить все элементы в новосозданный, я перемещаю их массивом 2 послед. метода, показывают, как я это делаю.
Юзер редактирует, что ему надо, закрывает форму... данные из временного TObjectList, все так же через массив, перегоняются в постоянный ObjectList.
Форма уничтожается.

2-ой экземпляр постоянно обитает в TApp.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс внутри класса Prontit Общие вопросы Delphi 16 07.10.2011 08:30
почта - написал самый простенький код для отправки письма - дает ошибку через секунд 10 (скрин) spydark91 Работа с сетью в Delphi 28 29.06.2011 13:16
Написал программу, все работает кроме одного момента. Palomnik1096 Microsoft Office Excel 5 09.12.2010 14:56
TWebBrowser и ссылки внутри него goblinyara Компоненты Delphi 1 17.01.2009 08:59
Создать класс(компонент) внутри компонента Deight Общие вопросы Delphi 6 21.12.2008 09:26