Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1100332550
Vaitek
2004-11-13 10:55
2004.11.28
SPAM BLIN DOSTAL


8-1093699861
Кирилл
2004-08-28 17:31
2004.11.28
Ошибка командной строки


4-1097859065
GanibalLector
2004-10-15 20:51
2004.11.28
GetDiskFreeSpace


3-1099061248
Kergma
2004-10-29 18:47
2004.11.28
внешний ключ хочю.................


1-1100114788
Cardinal
2004-11-10 22:26
2004.11.28
Работа с потоками. Помогите!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский