Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.009 c
14-33742
Кен
2003-08-19 04:25
2003.09.11
Где находится центр тяжести вращающегося гироскопа ? В той точке


14-33736
Shopot
2003-08-23 20:39
2003.09.11
Картинки и иконки


14-33799
Nerv
2003-08-22 11:53
2003.09.11
Книги


14-33782
k-man
2003-08-18 19:22
2003.09.11
Железный трабл


14-33795
Vlad Oshin
2003-08-22 11:23
2003.09.11
Молоко. Из-под коровы или из магазина? Вы за какое?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский