![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как вставить элемент внутрь массива рекордов ? [D7]
Кто---то © (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) ?