Форум: "Основная";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
ВнизКак вставить элемент внутрь массива рекордов ? Найти похожие ветки
← →
Кто---то © (2004-11-12 01:25) [0]Или можно ли как-нибудь работать с рекордами также удобно, как и со строками в StringList ? Ну, или что-нибудь подобное ? Что можно посоветовать ?
← →
GuAV © (2004-11-12 01:48) [1]Кто---то © (12.11.04 1:25)
Или можно ли как-нибудь работать с рекордами также удобно, как и со строками в StringList ?
Нет.
Кто---то © (12.11.04 1:25)
Что можно посоветовать ?
TList
TObjectList + Классы заместо Recordов
← →
jack128 © (2004-11-12 01:52) [2]GuAV © (12.11.04 1:48) [1]
Кто---то © (12.11.04 1:25)
Или можно ли как-нибудь работать с рекордами также удобно, как и со строками в StringList ?
Да. Нужно лишь написать соответсвующую оболочку.
← →
Кто---то © (2004-11-12 05:06) [3]
> GuAV © (12.11.04 01:48) [1]
> TList
> TObjectList + Классы заместо Recordов
Посмотрел, но что-то не очень понял ... Посмотрю ещё.
> jack128 © (12.11.04 01:52) [2]
> Да. Нужно лишь написать соответсвующую оболочку.
Я типа буду первый в мире, кто это сделает и поделится со всеми ?
← →
ЮЮ © (2004-11-12 05:17) [4]>Я типа буду первый в мире, кто это сделает и поделится со всеми ?
Ну если не хочешь пользоваться существующим и всеми используемыми TList
← →
Думкин © (2004-11-12 06:17) [5]Почитай Бакнелла. Помогает.
← →
TankMan © (2004-11-12 09:07) [6]>>Кто---то
У меня тоже раньше вставал такой вопрос, и мне сдесь помогли - дали примерчик класса, можно сказать типа TStringList только вместо массива строк - запись TRecord... Очень удобно получается.
Прийду домой - напишу пример...
← →
TankMan © (2004-11-12 15:11) [7]type
TRecord=class
public
AppPath,Params,WorkDir,StartTime:string;
Enabled:Boolean;
end;
TWorkList=class
private
FItems:array of TRecord;
function GetItems(Index: integer):TRecord;
procedure SetItems(Index: integer; const Value: TRecord);
public
property Items[Index:integer]:TRecord read GetItems write SetItems; default;
function Count:integer;
procedure Add(Item:TRecord);overload;
procedure Add(AppPath:string;Params,WorkDir,StartTime:string;Enabled:boolean);overload;
procedure Clear;
procedure Delete(Index:integer);
procedure Insert(index:integer;Item:TRecord);overload;
procedure Insert(index:integer;AppPath,Params,WorkDir,StartTime:string;Enabled:boolean);overload;
procedure Exchange(index1,index2:integer);
destructor Destroy; override;
end;
var
tsCaption:TStrings;
implementation
destructor TWorkList.Destroy;
var i:integer;
begin
for i:=Length(Fitems)-1 downto 0 do
FItems[i].Free;
end;
function TWorkList.GetItems(Index: integer):TRecord;
begin
if (index+1)>length(FItems) then exit;
Result:=Fitems[index];
end;
procedure TWorkList.SetItems(Index: integer; const Value: TRecord);
begin
if (index)>length(FItems) then exit;
FItems[index]:=Value;
end;
function TWorkList.Count:integer;
begin
Result:=Length(FItems);
end;
procedure TWorkList.Add(Item:TRecord);
begin
SetLength(FItems,Length(FItems)+1);
FItems[Length(FItems)-1]:=Item;
end;
procedure TWorkList.Add(AppPath,Params,WorkDir,StartTime:string;Enabled:boolean);
var Item:TRecord;
begin
item:=TRecord.Create;
Item.AppPath:=AppPath;
Item.Params:=Params;
Item.WorkDir:=WorkDir;
Item.StartTime:=StartTime;
item.Enabled:=Enabled;
Add(item);
//item.Free;
end;
procedure TWorkList.Clear;
var i:integer;
begin
for i:=Length(Fitems) downto 1 do
begin
SetLength(FItems,i-1);
end;
end;
procedure TWorkList.Delete(Index:integer);
var i:integer;
item:TRecord;
begin
if index=length(FItems) then exit;
item:=FItems[index];
if index<length(FItems)-1 then begin
For i:=index to Length(FItems)-1 do
FItems[i]:=Fitems[i+1];
end;
item.Free;
SetLength(FItems,Length(fItems)-1);
end;
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];
FItems[index]:=Item;
end;
procedure TWorkList.Insert(index:integer;AppPath,Params,WorkDir,StartTime:string;Enabled:boolean);
var i:integer;
item:TRecord;
begin
item:=TRecord.Create;
item.AppPath:=AppPath;
item.Params:=Params;
item.WorkDir:=WorkDir;
item.StartTime:=StartTime;
Item.Enabled:=Enabled;
SetLength(FItems,Length(fItems)+1);
For i:=index to Length(FItems)-1 do
FItems[i+1]:=Fitems[i];
FItems[index]:=Item;
end;
procedure TWorkList.Exchange(index1,index2:integer);
var i:integer;
Item:TRecord;
begin
if index1>length(FItems)-1 then exit;
if index2>length(FItems)-1 then exit;
if index1=index2 then exit;
item:=FItems[index1];
fItems[index1]:=FItems[index2];
FItems[index2]:=item;
end;
← →
TankMan © (2004-11-12 15:15) [8]Вот...я работаю с такой вот оболочкой классом, вот уж не помню кого мне благодарить за пример :)
А может сдесь есть явные недостатки, и я их не заметил? Может кто увидит чего? Может можно чего добавить/улучшить?
← →
begin...end © (2004-11-12 15:29) [9]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) ?
← →
GuAV © (2004-11-12 20:13) [10]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) ?
А зачем так сразу, пусть помучается ! :-)
← →
panov © (2004-11-12 20:17) [11]Ну если есть желание - вот еще пример работы с любым массивом, хоть объектов, хоть записей, хоть тривиальных типов.
Только что сделал для работы в многопоточном режиме.
Не добавлен только метод вставки.
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.
← →
Кто---то © (2004-11-14 01:24) [12]
> 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]
Но тут нет сабжа. То есть инсерта.
Кстати, массив рекордов - это лишь массив ссылок на рекорды, как я понял ? И тогда их можно просто тасовать как заблагорассудится ? Или нет ?
← →
Кто---то © (2004-11-14 01:50) [13]Задумал написать функцию, которая бы вставляла элементы в массивы ЛЮБЫХ рекордов, но запнулся на том, как её озаглавить :
function InsertRec(anArray : array of ... ; Index : Integer): Boolean;
array of что ? array of record не получается. А как быть ? Мне же надо, чтобы не под какую то конретную рекорду, а чтобы универсально было. Как же написать тогда ?
← →
KilkennyCat © (2004-11-14 02:01) [14]передавай указатель на массив.
← →
Кто---то © (2004-11-14 02:22) [15]
> 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
← →
GuAV © (2004-11-14 02:23) [16]можешь написать array of const, тока всё равно у тебя ничего не выйдет :-)
← →
KilkennyCat © (2004-11-14 02:36) [17]
> На какой массив ? Array of what ?
@
← →
Кто---то © (2004-11-14 02:47) [18]
> KilkennyCat © (14.11.04 02:36) [17]
> > На какой массив ? Array of what ?
> @
Можешь написать полностью или сам не знаешь чего советуешь ?
← →
KilkennyCat © (2004-11-14 02:56) [19]
> Кто---то © (14.11.04 02:47) [18]
второе вернее.
UniversalInsert(Massiv: Pointer; Element: Pointer; Index: int64)
← →
GuAV © (2004-11-14 03:09) [20]Не, так круче:
BoleeUniversalInsert(Massiv: Pointer; Element: Pointer; Razmer_Elementa: Integer; Massiv_Base, Index: int64)
← →
Кто---то © (2004-11-14 03:25) [21]
function InsertRec(anArray : Pointer ...
begin
SetLength(anArray, 3); // Ругается на эту строчку
Пишет: Incompatible types
← →
KilkennyCat © (2004-11-14 03:26) [22]еще бы не ругался.
что такое Pointer?
← →
Кто---то © (2004-11-14 03:28) [23]Удалено модератором
← →
KilkennyCat © (2004-11-14 03:33) [24]зато немастера не спят.
как можно такое написать:
SetLength(anArray, 3);
если anArray : Pointer ?
Это просто означает, что Вы тупо вставляете в свой код, все, что Вам здесь пишут, и даже ни капли не задумываетесь.
Неинтересно.
← →
Кто---то © (2004-11-14 03:45) [25]Удалено модератором
Примечание: Придешь тогда, когда ВСЕ проснутся
← →
KilkennyCat © (2004-11-14 03:47) [26]хреново.
← →
Кто---то © (2004-11-14 03:57) [27]Когда мы пишем :
function InsertRec(var anArray : array of ...
Мы разве не просто ссылку на массив передаём ? И если ссылку, то какая Дельфи разница на массив чего ведёт эта ссылка ?
А если передаём не только ссылку, то что именно ещё передаём ?
← →
KilkennyCat © (2004-11-14 06:26) [28]
> GuAV © (14.11.04 03:09) [20]
а разве я не смогу узнать размер элемента? Зачем его передавать?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.036 c