Вверх ↑
Разработчик
Ответов: 26200
Рейтинг: 2137
#1: 2007-11-04 23:30:01 ЛС | профиль | цитата
Galkov писал(а):
Писать коды надо так, чтобы не употреблять "а вот тут" про другие методы.

Но вот не понял я, как я могу применять _Set к данным которыя я не добавил в _Add?
Galkov писал(а):
Последнее 768-е китайское предупреждение: ДО комментариев вышеозначенная причина для FreeData - БЫЛА.

Там, вроде про копию говорили, а не про FreeData.

------------ Дoбавленo:

Galkov, исправил, собственно, сам массив (параллельно нашел тупую ошибку в индексации списка ), выкинул переменные и оставил только работу со списком.

------------ Дoбавленo:

А вот пример для проверки динамической работы MTArray


#sha
Add(MainForm,5669892,224,259)
{
Left=20
Top=105
Width=200
Height=125
Position=1
link(onCreate,6105249:doWork2,[])
}
Add(Button,4235013,224,168)
{
Left=35
Top=10
TabOrder=-1
Caption="Add"
link(onClick,5188173:doFor,[])
}
Add(MT_Add,10600462,343,168)
{
Data=Integer(1)
link(onAdd,5703693:doAdd,[])
link(Data,2582865:Value,[])
}
Add(Memory,2582865,343,119)
{
Default=Integer(1)
}
Add(For,5188173,280,168)
{
End=50000
link(onEvent,10600462:doAdd,[])
link(onStop,8455873:doWork1,[(333,181)])
}
Add(MT_MTArrayRW,5703693,413,154)
{
link(Array,1664879:Array,[])
}
Add(MT_MTArray,1664879,413,70)
{
}
Add(Button,8980875,224,70)
{
Left=35
Top=60
TabOrder=-1
Caption="Clear"
link(onClick,14222601:doEvent1,[])
}
Add(Application,16410378,413,203)
{
}
Add(HubEx,6105249,329,287)
{
link(onEvent,1999727:doWork3,[(389,300)])
}
Add(DoData,12617003,413,252)
{
link(onEventData,6876267:doPart,[])
link(Data,16410378:AppFileName,[])
}
Add(FilePart,6876267,462,252)
{
NameWOExt=1
link(onName,10003327:doFindName,[])
}
Add(EnumProcess,10003327,525,238)
{
DebugPrivilege=0
Point(doFindName)
Point(doGetMemoryInfo)
Point(onGetMemoryInfo)
Point(onFind)
link(onGetMemoryInfo,1479358:doOperation,[])
link(onFind,10003327:doGetMemoryInfo,[(570,258)(570,293)(513,293)(513,272)])
}
Add(Hub,14222601,343,70)
{
link(onEvent1,1664879:doClear,[])
link(onEvent2,1999727:doWork1,[(389,83)])
}
Add(HubEx,1999727,385,245)
{
link(onEvent,12617003:doData,[])
}
Add(Edit,14728435,644,245)
{
Left=105
Top=35
Width=55
TabOrder=-1
Text=""
}
Add(Label,9810967,224,119)
{
Left=110
Top=15
Width=41
Height=17
Caption="Memory"
}
Add(Math,1479358,588,245)
{
OpType=3
Op2=1024
ResultType=0
link(onResult,14728435:doText,[])
}
Add(Button,6551973,224,217)
{
Left=35
Top=35
TabOrder=-1
Caption="Set"
link(onClick,9516121:doFor,[])
}
Add(For,9516121,280,217)
{
End=50000
link(onEvent,5703693:doWrite,[(398,223)(398,167)])
link(onStop,8455873:doWork2,[])
}
Add(HubEx,8455873,329,217)
{
Angle=1
link(onEvent,6105249:doWork1,[])
}


------------ Дoбавленo:


Galkov, что скажешь? Жду, жду ответа, а ты молчишь. Хорошо, если ткнешь пальцем, где чего не так.

------------ Дoбавленo:


Я еще пересмотрел код и добавил в _Set и _Add FreeData

#pas
unit hiMT_MTArray; { Компонент MT_MTArray (массив MT-потоков) ver 1.20 }

interface

uses Kol,Share,Debug;

type
ThiMT_MTArray = class(TDebug)
private
Arr:PArray;
FList:PList;
procedure _Set(var Item:TData; var Val:TData);
function _Get(Var Item:TData; var Val:TData):boolean;
function _Count:integer;
procedure _Add(var Val:TData);
public
constructor Create;
destructor Destroy; override;
procedure _work_doClear(var _Data:TData; Index:word);
procedure _var_Array(var _Data:TData; Index:word);
end;

implementation

constructor ThiMT_MTArray.Create;
begin
inherited;
FList := newlist;
end;

destructor ThiMT_MTArray.Destroy;
var i:integer;
begin
for i := 0 to FList.Count-1 do begin
FreeData(PData(FList.Items[i]));
dispose(PData(FList.Items[i]));
end;
FList.Free;
inherited;
end;

procedure ThiMT_MTArray._Set;
var ind:integer;
begin
ind := ToIntIndex(Item);
if(ind >= 0)and(ind < _Count)then begin
FreeData(PData(FList.Items[ind]));
CopyData(PData(FList.Items[ind]),@Val);
FreeData(@Val);
end;
end;

procedure ThiMT_MTArray._Add;
var dt:PData;
begin
new(dt);
CopyData(dt,@Val);
FreeData(@Val);
FList.Add(dt);
end;

function ThiMT_MTArray._Get;
var ind:integer;
begin
ind := ToIntIndex(Item);
if(ind >= 0)and(ind < _Count)then begin
Result := true;
FreeData(@Val);
dtNull(Val);
CopyData(@Val, PData(FList.Items[ind]));
end
else Result := false;
end;

function ThiMT_MTArray._Count;
begin
Result := FList.Count;
end;

procedure ThiMT_MTArray._var_Array;
begin
if Arr = nil then
Arr := CreateArray(_Set, _Get, _Count, _Add);
dtArray(_Data,Arr);
end;

procedure ThiMT_MTArray._work_doClear;
var i:integer;
begin
for i := 0 to FList.Count-1 do begin
FreeData(PData(FList.Items[i]));
dispose(PData(FList.Items[i]));
end;
FList.Clear;
end;

end.
карма: 22

0