![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка преобразования типов [D7]
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);
ну или искорени дубли.