Текущий архив: 2003.09.11;
Скачать: CL | DM;
Вниз
array of Найти похожие ветки
← →
Alibaba (2003-08-28 12:11) [0]Привет, Мастера!
Такой вопрос.
Существуют три разных типа:
Type
TMyType1 = record
P1: integer;
P2: string[255];
end;
TMyType2 = record
P1: integer;
P2: string[255];
P3: integer;
end;
TMyType3 = record
P1: integer;
P2: string[255];
P3: integer;
P4: string[100];
end;
Есть три динамических массива, елементы которых - соответствующих типов:
Var
arT1: array of TMyType1;
arT2: array of TMyType2;
arT3: array of TMyType3;
Есть задача: вставлять, удалять елементы из динамических массивов
Для одного массива.
Вставить в n-тую позицию:
procedure InsertIntoArrayT1(n: integer);
var i: integer;
begin
SetLength(arT1,Length(arT1)+1);
for i:=High(arT1) downto n+1 do
arT1[i]:=arT1[i-1];
end;
Удалить n-тую позицию:
procedure DeleteFromArrayT1(n: integer);
var i: integer;
begin
for i:=n to High(arT1)-1 do
arT1[i]:=arT1[i+1];
SetLength(arT1,Length(arT1)-1);
end;
//-------------------------------------------------------------
Для двух других типов (TMyType2,TMyType3)
необходимо писать еще четыре поцедуры.
СОБСТВЕННО ВОПРОС:
Можно ли сделать универсальную процедуру вставки/удаления для различных типов?
С уважением, Сергей.
← →
Skier (2003-08-28 12:15) [1]Можно.
Если будешь использовать Move(...) и SizeOf(...)
← →
Юрий Федоров (2003-08-28 12:18) [2]Если вместо динамических массивов использовать TList, то писать вообще ничего не понадобится - все уже написано :-)
← →
Alibaba (2003-08-28 12:25) [3]>Skier © (28.08.03 12:15) [1]
А можно применительно к конкретной задаче...
>Юрий Федоров © (28.08.03 12:18) [2]
Согласен. Это решение.
Просто TList - содержит ссылки на обьекты.
Это значит, что необходимо будет отказаться от записей (record)
и создавать обьекты (Object).
Это - облом. :))
Но, если решений не будет - воспользуюсь таким подходом.
← →
Юрий Федоров (2003-08-28 12:27) [4]Alibaba © (28.08.03 12:25) [3]
в TList можно хранить ссылки на рекорды
type
PMyType3 = ^TMyType3;
var X : PMyType3;
new(X)
List.add(X);
при удалении из списка вызывать dispose
← →
Skier (2003-08-28 12:30) [5]
> Просто TList - содержит ссылки на обьекты.
Ошибочка ! :)
TList работает с нетипизированными указателями, именно этим он и хорош...
← →
Alibaba (2003-08-28 12:35) [6]>Skier © (28.08.03 12:30) [5]
Cсылка на обьект
и
Нетипизированный указатель
это одно и тоже.
Если не одно и тоже.
То я имелл ввиду Нетипизированный указатель
← →
Skier (2003-08-28 12:38) [7]Упрощённо так :
TList может хранить как указатели на дин. структуры, так
и объекты.
← →
Alibaba (2003-08-28 12:39) [8]>Юрий Федоров © (28.08.03 12:27) [4]
Это мне немножко не нравится.
Потому что необходимо следить за тем, чтобы выделять и освобождать память для указателя.
В случае:
Type
TMyType1 = class
P1: integer;
P2: string[255];
end;
Var
lstType1: TList;
Begin
lstType1:=TList.Create;
.........
Работаем
.........
lstType1.Free;
End
В начале - создал, в конце - удалил.
Все проще.
← →
Skier (2003-08-28 12:41) [9]
> Все проще.
Что проще ? Объект TMyType1 не надо освобождать ?!
← →
Alibaba (2003-08-28 12:49) [10]>Skier © (28.08.03 12:41) [9]
lstType1:=TList.Create;
//Создаем обьект и одновременно указатель на него запихиваем в TList
lstType1.Add(TMyType1.Create);
//Работаем с обьектом
TMyType1(lstType1[0]).P1:=1;
//Удаляем обьект
TMyType1(lstType1[0]).Free;
//Удаляем список
lstType1.Free;
← →
AlexSV (2003-08-28 12:51) [11]> Alibaba © (28.08.03 12:11)
Привет Alibaba.
Вот тебе пример использования TList для record"a TMyType1.
Для остальных - аналогично. Без коментариев, но надеюсь что не сложно.
Упростил из рабочего варианта, так что дополнишь по вкусу:
interface
uses
Classes;
type
PMyType1 = ^TMyType1;
TMyType1 = record
P1: integer;
P2: string[255];
end;
TMyType1List = class(TList)
protected
procedure Notify(Ptr: Pointer; Action: TListNotification); override;
function GetItem(ItemID: Integer): PMyType1;
procedure SetItem(ItemID: Integer; MyType1: PMyType1);
public
function Add: Integer; overload;
function Add(MyType1: PMyType1): Integer; overload;
function Remove(MyType1: PMyType1): Integer;
function IndexOf(MyType1: PMyType1): Integer;
procedure Insert(ItemID: Integer; MyType1: PMyType1);
property Items[ItemID: Integer]: PMyType1 read GetItem write SetItem; default;
end;
implementation
{ TMyType1List }
function TMyType1List.Add(MyType1: PMyType1): Integer;
begin
Result := inherited Add(MyType1);
end;
function TMyType1List.Add: Integer;
begin
Result := Add(new(PMyType1));
end;
function TMyType1List.GetItem(ItemID: Integer): PMyType1;
begin
Result := PMyType1(inherited Items[ItemID]);
end;
function TMyType1List.IndexOf(MyType1: PMyType1): Integer;
begin
Result := inherited IndexOf(MyType1);
end;
procedure TMyType1List.Insert(ItemID: Integer; MyType1: PMyType1);
begin
inherited Insert(ItemID, MyType1);
end;
procedure TMyType1List.Notify(Ptr: Pointer; Action: TListNotification);
begin
if Action = lnDeleted then Dispose(PMyType1(Ptr));
inherited Notify(Ptr, Action);
end;
function TMyType1List.Remove(MyType1: PMyType1): Integer;
begin
Result := inherited Remove(MyType1);
end;
procedure TMyType1List.SetItem(ItemID: Integer; MyType1: PMyType1);
begin
inherited Items[ItemID] := MyType1;
end;
end.
← →
Skier (2003-08-28 12:54) [12]Такая структура не устроит ?
TMyCommonType = record
mctDataType : Byte;
mctData : Pointer; //указатель на TMyType1 или на TMyType2, или на
//TMyType3
end;
Работаешь с mctData в зависимости от поля mctDataType
← →
Alibaba (2003-08-28 12:59) [13]>Skier © (28.08.03 12:54) [12]
Это близко к тому что я ожидал...
Спасибо.
Буду пробовать.
← →
Alibaba (2003-08-28 13:03) [14]>AlexSV © (28.08.03 12:51) [11]
uice?
← →
AlexSV (2003-08-28 13:04) [15]> Alibaba © (28.08.03 13:03) [14]
Да, а что?
← →
Alibaba (2003-08-28 13:09) [16]>AlexSV © (28.08.03 13:04) [15]
http://delphimaster.net/view/15-1062061714/
Страницы: 1 вся ветка
Текущий архив: 2003.09.11;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.009 c