Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

Как вставить элемент внутрь массива рекордов ?   Найти похожие ветки 

 
Кто---то ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.024 c
14-1099993719
PURGEN
2004-11-09 12:48
2004.11.28
TImage...


3-1098870506
Mishenka
2004-10-27 13:48
2004.11.28
Есть ли для баз данных компонент типа ListView ?


6-1095672033
kot_phg
2004-09-20 13:20
2004.11.28
Как уменьшить время ожидание пакета в компоненте TcpClient?


4-1097254182
Artin
2004-10-08 20:49
2004.11.28
Delphi: Чтения бит с CD диска


14-1099927764
ИМХО
2004-11-08 18:29
2004.11.28
Локомотив - чемпион?