Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка преобразования типов [D7]


Страницы:   1 2

Artem78 ©   (2016-10-23 05:36:00) 

У меня есть вот такой класс для работы с объектами на базе TCollection:
unit UTasks;

interface

uses SysUtils, Classes, Variants, Controls;

type
 TDayOfWeek = 1..7;

 TTask = class(TCollectionItem)
 private
   FDayOfWeek: TDayOfWeek;
   FTime1: TTime;
   FTime2: TTime;
   FTimeInterval: boolean;
   FTitle: string;
   FOrder: integer;
   FEnabled: boolean;
 public
   constructor Create(Collection: TCollection); override;
 published
   property DayOfWeek: TDayOfWeek read FDayOfWeek write FDayOfWeek;
   property Time1: TTime read FTime1 write FTime1;
  property Time2: TTime read FTime2 write FTime2;
   property TimeInterval: boolean read FTimeInterval write FTimeInterval;
   property Title: string read FTitle write FTitle;
   property Order: integer read FOrder write FOrder;
   property Enabled: boolean read FEnabled write FEnabled;
 end;

 TTaskChangeEvent = procedure(Item: TCollectionItem) of object;

 TTasksList = class(TCollection)
 private
   FOnTaskChange: TTaskChangeEvent;
   function GetTask(index:integer): TTask;
   procedure SetTask(index:integer; Value:TTask);
 protected
   procedure DoTaskChange(Item: TCollectionItem); dynamic;
 public
   function Add:TTask;
   property Items[Index:integer]:TTask read GetTask write SetTask; default;
   procedure Update(Item: TCollectionItem); override;
 published
   property OnTaskChange: TTaskChangeEvent read FOnTaskChange write FOnTaskChange;
 end;

 TTasks = class(TComponent)
 private
   FTasksList: TTasksList;
   function GetIndexById(const ID: integer): variant;
   function GetCount: integer;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;

   function Add: TTask;
   function Get(const ID: integer): TTask; {overload;}
   procedure Update(const ID: integer; const Task: TTask); {overload;}
   procedure Delete(const ID: integer);
   procedure DeleteAll;

   procedure SaveToFile(Path:String);
   procedure LoadFromFile(Path:String);
 published
   property TasksList: TTasksList read FTasksList write FTasksList;
   property Count: integer read GetCount;
 end;

implementation

{ TTask }

constructor TTask.Create(Collection: TCollection);
begin
 inherited create(Collection);
 DayOfweek := 1;
 Time1 := StrToTime('00:00:00');
 Time2 := StrToTime('00:00:00');
 TimeInterval := False;
 Title := '';
 Enabled := false;
end;

{ TTasksList }

function TTasksList.Add: TTask;
begin
 Result := TTask(inherited Add);
end;

function TTasksList.GetTask(index: integer): TTask;
begin
 Result := TTask(Inherited GetItem(index));
end;

procedure TTasksList.SetTask(index: integer; Value: TTask);
begin
 Items[Index].Assign(Value);
end;

procedure TTasksList.Update(Item: TCollectionItem);
begin
 inherited Update(Item);
 DoTaskChange(Item);
end;

procedure TTasksList.DoTaskChange(Item: TCollectionItem);
begin
 if Assigned(FOnTaskChange) then
   FOnTaskChange(Item);
end;

{ TTasks }

constructor TTasks.Create(AOwner: TComponent);
begin
 inherited create(AOwner);
 TasksList := TTasksList.Create(TTask);
end;

destructor TTasks.Destroy;
begin
 TasksList.Free;
 inherited;
end;

function TTasks.GetIndexById(const ID: integer): variant;
var
 Task: TTask;
begin
 Task := TTask(TasksList.FindItemID(ID));
 if Task <> nil then
 begin
   Result := Task.Index;
 end
 else
   Result := null;
end;

function TTasks.GetCount: integer;
begin
 Result := TasksList.Count;
end;

function TTasks.Add: TTask;
begin
 Result := TasksList.Add;
end;

procedure TTasks.Delete(const ID: integer);
var
 Index: variant;
begin
 Index := GetIndexById(ID);
 if Index <> null then
   TasksList.Delete(Index);
end;

procedure TTasks.DeleteAll;
begin
 TasksList.Clear;
end;

function TTasks.Get(const ID: integer): TTask;
begin
 Result := TTask(TasksList.FindItemID(ID));
end;

procedure TTasks.Update(const ID: integer; const Task: TTask);
var
 Index: variant;
begin
 Index := GetIndexById(ID);
 if Index <> null then
 begin
   TasksList.SetTask(Index, Task);
 end;
end;

procedure TTasks.LoadFromFile(Path: String);
var
 ms: TMemoryStream;
 fs: TFileStream;
begin

 fs := TFileStream.Create(path, fmOpenRead);
 ms := TMemoryStream.Create;
 try
   ObjectTextToBinary(fs, ms);
   ms.position := 0;
   ms.ReadComponent(Self);
 finally
   ms.Free;
   fs.free;
 end;
end;

procedure TTasks.SaveToFile(Path: String);
var
 ms: TMemoryStream;
 fs: TFileStream;
begin
 fs := TFileStream.Create(path, fmCreate or fmOpenWrite);
 ms := TMemoryStream.Create;
 try
   ms.WriteComponent(Self);
   ms.position := 0;
   ObjectBinaryToText(ms, fs);
 finally
   ms.Free;
   fs.free;
 end;
end;

end.


Я обновляю существующую запись таким образом:
   Task := TTask.Create(nil);
   Task.DayOfWeek := cbDayOfWeek.ItemIndex + 1;
   Task.Time1 := EncodeTime(HourOf(dtTime1.Time), MinuteOf(dtTime1.Time), 0, 0);
   Task.Time2 := EncodeTime(HourOf(dtTime2.Time), MinuteOf(dtTime2.Time), 0, 0);
   Task.TimeInterval := dtTime2.Checked;
   Task.Enabled := chkEnabled.Checked;
   Form1.Tasks.Update(EditID, Task); // Form1.Tasks это экземпляр класса TTasks


И получаю exception "Can`t assign a TTask to a TTask". Подскажите, в чём моя ошибка?


Игорь Шевченко   (2016-10-23 16:14:00) [21]


> Возможно это как-то связано с моей ошибкой: TForm1, TTasks/TTask
> и часть кода которая производит обновление находятся в разных
> модулях.


Часом не в DLL и EXE ?


Юрий Зотов   (2016-10-23 16:09:00) [22]

Сделате точно по этому образцу:
http://delphikingdom.com/asp/viewitem.asp?catalogid=215
и должно заработать.


sniknik   (2016-10-23 15:27:00) [23]

> а после Update выскакивает
и что? какая разница где выскакивает, ошибка однозначная (Can`t assign a TTask to a TTask)
ладно, по другому скажу
Form1.Tasks.Update(EditID, Task);
в описании Update используется из одного модуля, значение передается с типом из другого.


Artem78   (2016-10-23 13:59:00) [24]

Дубля быть не должно (только в самом делфи если нет класса с таким именем). Возможно это как-то связано с моей ошибкой: TForm1, TTasks/TTask и часть кода которая производит обновление находятся в разных модулях.

Добавление имени модуля не помогло.

Ошибка не после вызова Create, а после Update выскакивает. Добавил ещё в объявление TForm1, но тоже самое:
type
 TForm1 = class(TForm)
   // ...
   Tasks: UTasks.TTasks;
   // ...
 end;


sniknik   (2016-10-23 11:58:00) [25]

> Can`t assign a TTask to a TTask
2 объявления в разных модулях похоже. для гарантии проверь с указанием, типа  
var
Task: ИмяМодуля.TTask;

Task := ИмяТогоЖеМодуля.TTask.Create(nil);

ну или искорени дубли.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо