Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.017 c
3-33474
Borealis
2003-08-18 22:55
2003.09.11
Версии MDAC


14-33735
Knight
2003-08-21 09:30
2003.09.11
Клиент форума


11-33529
access_violation
2003-01-05 13:20
2003.09.11
help


14-33775
dimodim
2003-08-23 10:08
2003.09.11
Mysql i php


1-33566
Chlavik
2003-08-28 20:39
2003.09.11
Debugger и GetLastError