Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как вставить элемент внутрь массива рекордов ? [D7]


Страницы:   1 2

Кто---то ©   (2004-11-12 01:25:00) 

Или можно ли как-нибудь работать с рекордами также удобно, как и со строками в StringList ? Ну, или что-нибудь подобное ? Что можно посоветовать ?


KilkennyCat   (2004-11-14 06:26:00) [1]


> GuAV ©   (14.11.04 03:09) [20]


а разве я не смогу узнать размер элемента? Зачем его передавать?


Кто---то   (2004-11-14 03:57:00) [2]

Когда мы пишем :
function InsertRec(var anArray : array of ...
Мы разве не просто ссылку на массив передаём ? И если ссылку, то какая Дельфи разница на массив чего ведёт эта ссылка ?

А если передаём не только ссылку, то что именно ещё передаём ?


KilkennyCat   (2004-11-14 03:47:00) [3]

хреново.


Кто---то   (2004-11-14 03:45:00) [4]

Удалено модератором
Примечание: Придешь тогда, когда ВСЕ проснутся


KilkennyCat   (2004-11-14 03:33:00) [5]

зато немастера не спят.

как можно такое написать:

SetLength(anArray, 3);

если anArray : Pointer ?

Это просто означает, что Вы тупо вставляете в свой код, все, что Вам здесь пишут, и даже ни капли не задумываетесь.
Неинтересно.


Кто---то   (2004-11-14 03:28:00) [6]

Удалено модератором


KilkennyCat   (2004-11-14 03:26:00) [7]

еще бы не ругался.

что такое Pointer?


Кто---то   (2004-11-14 03:25:00) [8]

 function InsertRec(anArray : Pointer ...

begin
   SetLength(anArray, 3); // Ругается на эту строчку


Пишет: Incompatible types


GuAV   (2004-11-14 03:09:00) [9]

Не, так круче:
BoleeUniversalInsert(Massiv: Pointer; Element: Pointer; Razmer_Elementa: Integer; Massiv_Base, Index: int64)


KilkennyCat   (2004-11-14 02:56:00) [10]


> Кто---то ©   (14.11.04 02:47) [18]


второе вернее.

UniversalInsert(Massiv: Pointer; Element: Pointer; Index: int64)


Кто---то   (2004-11-14 02:47:00) [11]


> KilkennyCat ©   (14.11.04 02:36) [17]
> > На какой массив ? Array of what ?
> @

Можешь написать полностью или сам не знаешь чего советуешь ?


KilkennyCat   (2004-11-14 02:36:00) [12]


> На какой массив ? Array of what ?


@


GuAV   (2004-11-14 02:23:00) [13]

можешь написать array of const, тока всё равно у тебя ничего не выйдет :-)


Кто---то   (2004-11-14 02:22:00) [14]


> KilkennyCat ©   (14.11.04 02:01) [14]
> передавай указатель на массив.

На какой массив ? Array of what ?

на это :
 function InsertRec(var anArray : array; Index : Integer): Boolean;
пишет :
[Error] Unit1.pas(111): 'OF' expected but ';' found


KilkennyCat   (2004-11-14 02:01:00) [15]

передавай указатель на массив.


Кто---то   (2004-11-14 01:50:00) [16]

Задумал написать функцию, которая бы вставляла элементы в массивы ЛЮБЫХ рекордов, но запнулся на том, как её озаглавить :
 function InsertRec(anArray : array of ... ; Index : Integer): Boolean;

array of что ? array of record не получается. А как быть ? Мне же надо, чтобы не под какую то конретную рекорду, а чтобы универсально было. Как же написать тогда ?


Кто---то   (2004-11-14 01:24:00) [17]


> TankMan ©   (12.11.04 15:15) [8]
> Вот...я работаю с такой вот оболочкой классом, вот уж не
> помню кого мне благодарить за пример :)
>
> А может сдесь есть явные недостатки, и я их не заметил?
> Может кто увидит чего? Может можно чего добавить/улучшить?


Хе ! Я думаю надо поблагодарить меня. Как ты вообще с ним работал то ? Не замечал ли случайно, что, что-то не так ?

> procedure TWorkList.Insert(index : Integer; Item : TRecord);
> var
>   i : Integer;
> begin
> SetLength(FItems, Length(fItems) +1);
> for i := Index to Length(FItems) -1 do
>   FItems[i +1] := Fitems[i];

Мало того, что ты затираешь каждое последующее значение предыдущим, так ещё и выходишь за пределы массива.
Поправь сам.


> panov ©   (12.11.04 20:17) [11]

Но тут нет сабжа. То есть инсерта.

Кстати, массив рекордов - это лишь массив ссылок на рекорды, как я понял ? И тогда их можно просто тасовать как заблагорассудится ? Или нет ?


panov   (2004-11-12 20:17:00) [18]

Ну если есть желание - вот еще пример работы с любым массивом, хоть объектов, хоть записей, хоть тривиальных типов.
Только что сделал для работы в многопоточном режиме.
Не добавлен только метод вставки.


unit uSafeArray;

interface

uses
 windows;
type

 TSafeArray=class
 private
   FCS: RTL_CRITICAL_SECTION;
   FArray: array of Pointer;

   procedure Lock;
   procedure Unlock;
   function GetItem(const Index: Integer): Pointer;
   procedure SetItem(const Index: Integer; const Value: Pointer);
 public
   constructor Create;
   destructor Destroy; override;

   function Add(const Item: Pointer): Integer;
   function IndexOf(const Item: Pointer): Integer;
   function Count: Integer;
   procedure Delete(const Index: Integer);
   procedure Clear;

   property Items[const Index: Integer]: Pointer read GetItem write SetItem;default;
 end;

implementation

{ TSafeArray }

function TSafeArray.Add(const Item: Pointer): Integer;
begin
 Lock;
 Result := Length(FArray);
 SetLength(FArray,Result+1);
 FArray[Result] := Item;
 Unlock;
end;

procedure TSafeArray.Clear;
begin
 Lock;
 SetLength(FArray,0);
 Unlock;
end;

function TSafeArray.Count: Integer;
begin
 Result := Length(FArray);
end;

constructor TSafeArray.Create;
begin
 InitializeCriticalSection(FCS);
end;

procedure TSafeArray.Delete(const Index: Integer);
var
 i: Integer;
 Len: Integer;
begin
 Len := Length(FArray);
 if Index<0 then Exit;
 if Index>Len-1 then Exit;
 Lock;
 for i := Index+1 to Len-1 do
 begin
   FArray[i-1] := FArray[i];
 end;
 SetLength(FArray,Len-1);
 Unlock;
end;

destructor TSafeArray.Destroy;
begin
 DeleteCriticalSection(FCS);
 SetLength(FArray,0);
 inherited;
end;

function TSafeArray.GetItem(const Index: Integer): Pointer;
begin
 Lock;
 Result := FArray[Index];
 Unlock;
end;

function TSafeArray.IndexOf(const Item: Pointer): Integer;
var
 i: Integer;
begin
 Result := -1;
 Lock;
 for i := 0 to Length(FArray)-1 do
 begin
   if Item=FArray[i] then
   begin
     Result := i;
     break;
   end;
 end;
 Unlock;
end;

procedure TSafeArray.Lock;
begin
 EnterCriticalSection(FCS);
end;

procedure TSafeArray.SetItem(const Index: Integer; const Value: Pointer);
begin
 if (Index<0) or (Index>Length(FArray)-1) then Exit;
 Lock;
 FArray[Index] := Value;
 Unlock;
end;

procedure TSafeArray.Unlock;
begin
 LeaveCriticalSection(FCS);
end;

end.


GuAV   (2004-11-12 20:13:00) [19]

TankMan ©   (12.11.04 15:11) [7]
Улучшить ? да запросто. Здесь TRecord это фактически class, поэтом можно не изобретать велосипед, а взять TObjectList, что было предложено в [1].
Если же требуется работа с этой "записью" без typecast (хотя имхо излишество, прихоть), то можно написать своего наследника от TObjectList, сделав по аналогии с TClassList как наследником TList.

begin...end ©   (12.11.04 15:29) [9]
Тогда, может быть, - SetLength(FItems, 0) ?

А зачем так сразу, пусть помучается ! :-)


begin...end   (2004-11-12 15:29:00) [20]

TankMan ©   (12.11.04 15:15) [8]

> А может сдесь есть явные недостатки, и я их не заметил?


>procedure TWorkList.Clear;
>var i:integer;
>begin
>for i:=Length(Fitems) downto 1 do
> begin
> SetLength(FItems,i-1);
> end;
> end;

Цель - очистить массив? Тогда, может быть, - SetLength(FItems, 0) ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо