![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать поле для записи.
Валя © (2005-08-18 14:11:00)Как сделать, что бы, например, можно было записать OpenedReference[a].Saved:=True; при использовании следующего класса.
type
TOpenFileStruc = record
FullName:string;
ShortName:string;
Saved:boolean;
Year:string;
end;
TOpenedFiles = class(TObject)
private
FOpenedFiles: array of TOpenFileStruc;
function GetItem(Index: Integer): TOpenFileStruc;
procedure SetItem(Index: integer; Value: TOpenFileStruc);
public
property OpenedFiles[Index: Integer]: TOpenFileStruc read GetItem write SetItem; default;
end;
implementation
////////////////////////////////////////////////////////////////////////////////
function TOpenedFiles.GetItem(Index: Integer): TOpenFileStruc;
begin
Result := FOpenedFiles[Index];
end;
////////////////////////////////////////////////////////////////////////////////
procedure TOpenedFiles.SetItem(Index: integer; Value: TOpenFileStruc);
begin
FOpenedFiles[index] := Value;
end;
Валя (2005-08-18 14:52:00) [1]Спасибо, будем работать и расти над собой =)
Digitman (2005-08-18 14:50:00) [2]
> Валя (18.08.05 14:43) [6]
> Как-то мудрено
что "мудрено"-то ?
работу с указателями первый раз видишь что ли ?
> У меня, в принципе, в классе много чего еще и Add, и Delete,
> и IndexOf и т.д
при реализации моего предложения - да ... что вовсе не представляет никаких проблем
если же иначе - см. [7], он прав.
Ega23 (2005-08-18 14:45:00) [3]Сделай TOpenFileStruct не рекордом, а классом. Вместо array of используй TObjectList.
Проблем быть не должно.
Валя (2005-08-18 14:43:00) [4]Как-то мудрено =)
У меня, в принципе, в классе много чего еще и Add, и Delete, и IndexOf и т.д. и все надо переписать на работу с указателями, как вы предлагаете? При чтении @, а при записи ^
Digitman (2005-08-18 14:36:00) [5]
> Валя
сделай проще :
type
POpenFileStruc = ^TOpenFileStruc;
TOpenFileStruc = packed record
FullName:string;
ShortName:string;
Saved:boolean;
Year:string;
end;
TOpenedFiles = class(TObject)
private
FOpenedFiles: array of TOpenFileStruc;
function GetItem(Index: Integer): POpenFileStruc;
procedure SetItem(Index: integer; Value: POpenFileStruc);
public
property Items[Index: Integer]: POpenFileStruc read GetItem write SetItem; default;
end;
..
implementation
procedure TForm1.Button1Click(Sender: TObject);
begin
TOpenedFiles.Create[0].Saved := True;
end;
{ TOpenedFiles }
function TOpenedFiles.GetItem(Index: Integer): POpenFileStruc;
begin
Result := @FOpenedFiles[Index];
end;
procedure TOpenedFiles.SetItem(Index: integer; Value: POpenFileStruc);
begin
FOpenedFiles[index] := Value^;
end;
> Ega23 © (18.08.05 14:28) [3]
> Разве у SetItem не один параметр должен быть?
нет, не один.
1-й - индекс, 2-й - параметр-значение элемента с указанным индексом
Валя (2005-08-18 14:35:00) [6]Ega23 © (18.08.05 14:28) [3]
Нет, SeItem должен знать index и сам элемент, который он по этому индеку поставит. Так помоему.
Ega23 (2005-08-18 14:28:00) [7]2 Digitman © (18.08.05 14:20) [1]
procedure SetItem(Index: integer; Value: TOpenFileStruc);
и
property Items[Index: Integer]: TOpenFileStruc read GetItem write SetItem; default;
Разве так можно? Разве у SetItem не один параметр должен быть?
Валя (2005-08-18 14:24:00) [8]Спасибо, переделаю.
Но компилятор пишет: " [Error] Main.pas(549): Left side cannot be assigned to"
Digitman (2005-08-18 14:20:00) [9]а в чем проблема ?
так и пиши
OpenedFiles[такой-то].Saved:=True
где OpenedFiles: TOpenedFiles;
в целом же не есть гуд (если не сказать - неправильно) именовать св-во класса так же как сам класс
TOpenedFiles = class(TObject)
private
FOpenedFiles: array of TOpenFileStruc;
function GetItem(Index: Integer): TOpenFileStruc;
procedure SetItem(Index: integer; Value: TOpenFileStruc);
public
property Items[Index: Integer]: TOpenFileStruc read GetItem write SetItem; default;
end;