Вверх ↑
Этот топик читают: Гость
Ответов: 5446
Рейтинг: 323
#1: 2005-01-24 17:40:47 ЛС | профиль | цитата
Вот подправленные компоненты ArrayRw и ArrayEnum
(у ArrayRW добавил "тип" для точек index и array,
у ArrayEnum добавил V-точку Index и тип для точки array)

hiArrayEnum.pas
[code:1] unit hiArrayEnum;

interface

uses Kol,Share,Debug;

type
THIArrayEnum = class(TDebug)
private
FStop:boolean;
Item:TData;
eIndex:TData;
public
_data_Array:THI_Event;
_event_onItem:THI_Event;
_event_onEndEnum:THI_Event;

procedure _work_doEnum(var _Data:TData; Index:word);
procedure _work_doStop(var _Data:TData; Index:word);
procedure _var_Item(var _Data:TData; Index:word);
procedure _var_Index(var _Data:TData; Index:word);
end;

implementation

procedure THIArrayEnum._work_doEnum;
var dt:TData;
Ind:TData;
Arr:PArray;
begin
FStop := false;
Ind.Data_type := data_int;
Ind.idata := 0;
Arr := ReadArray(_data_Array);
if Arr <> nil then
while not FStop and Arr._Get(Ind,Item) do
begin
dt := Item;
_hi_OnEvent(_event_onItem,dt);
inc(Ind.idata);
eIndex := Ind;
end;
_hi_OnEvent(_event_onEndEnum);
end;

procedure THIArrayEnum._work_doStop;
begin
FStop := true;
end;

procedure THIArrayEnum._var_Item;
begin
_Data := Item;
end;

procedure THIArrayEnum._var_Index(var _Data:TData; Index:word);
begin
_Data := eIndex;
end;
end.
[/code:1]

ArrayEnum.ini
[code:1] [About]
Version=1.0
Author=Dilma
Mail=hiasm@mail.ru

[Type]
Class=Element
Info=Перебор всех элементов массива

[Methods]
doEnum=Начинает перебор элементов массива|1|
doStop=Останавливает перебор элементов|1|
onItem=Выдает в поток очередной элемент массива|2|
onEndEnum=Событие происходит всякий раз после завершения перебора элементов массива|2|
Array=Массив, элементы которого требуется перебрать|4|arr
Item=Содержит текущий элемент массива после вызова события onItem|3|
Index=Содержит индекс текущего элемента массива после вызова события onItem|3|int
[/code:1]

ArrayRW.ini
[code:1] [About]
Version=1.0
Author=Dilma
Mail=hiasm@mail.ru

[Type]
Class=Element
Info=Запись и чтение из массива

[Property]
+Index=Индекс элемента массива по-умолчанию|3|


[Methods]
doRead=Читает элемент массива с индексом Index|1|
doWrite=Записывает в элемент массива с индексом Index значение из поля Value|1|
doAdd=Добавляет элемент в конец массива|1|
onRead=Событие происходит всякий раз после чтения элемента массива и выдает его значение в поток|2|
Item=Содержит элемент массива после выполнения метода doRead|3|
*Count=Содержит кол-во элементов массива|3|int
Array=Определяет идентификатор массива|4|arr
Index=Определяет индекс элемента массива|4|int
Value=Определяет значение для записи в массив|4|
[/code:1]
карма: 1

0
Администрация
Ответов: 15295
Рейтинг: 1519
#2: 2005-01-24 18:40:35 ЛС | профиль | цитата
hiArrayEnum.pas - а не так?

[code:1] dt := Item;
eIndex := Ind;
_hi_OnEvent(_event_onItem,dt);
inc(Ind.idata);
[/code:1]

ArrayRW.ini - не вижу изменений.
карма: 27
0
Ответов: 9906
Рейтинг: 351
#3: 2005-01-24 19:22:39 ЛС | профиль | цитата
"Dilma" писал(а):
ArrayRW.ini - не вижу изменений.

расцветка - iarspider прав, пусть цветит....
карма: 9

0
Ответов: 5446
Рейтинг: 323
#4: 2005-01-25 12:11:06 ЛС | профиль | цитата
2Dilma Извиняюсь... Именно так...
карма: 1

0
Ответов: 5446
Рейтинг: 323
#5: 2005-01-25 12:14:52 ЛС | профиль | цитата
Вопрос вдогонку: нельзя ли доьавить в ArrayEnum возможность работы с Matrix? Вопрос в том, есть ли возможность узнать,
что пришло на вход Array - именно Array или же Matrix?
Порядок перебора элементов матрицы можно задавать через
свойства.
карма: 1

0
Администрация
Ответов: 15295
Рейтинг: 1519
#6: 2005-01-25 14:00:26 ЛС | профиль | цитата
ArrayEnum - изменения внесены.

Вопрос в том, есть ли возможность узнать,
что пришло на вход Array

Есть конечно. Array это тип data_array в поле data_type, а матрица это data_matr. Однако если делать такой компонент, то не стоит совмещать его с ArrayEnum.
карма: 27
0
Ответов: 5446
Рейтинг: 323
#7: 2005-01-25 16:21:55 ЛС | профиль | цитата
ok. Тогда сегодня попробую сделать...
карма: 1

0
Ответов: 2290
Рейтинг: 678
#8: 2011-04-13 11:42:14 ЛС | профиль | цитата
Понадобилось делать записи в разные массивы и захотелось событие onWrite для удобства схемопостроения. Так вот хотелось бы узнать:
1. Почему у ArrayRW нет события onWrite?
2. Будет ли преступлением это событие добавить? (могу попробовать сам).
карма: 11

0
Ответов: 16884
Рейтинг: 1239
#9: 2011-04-13 15:11:32 ЛС | профиль | цитата
sla8a писал(а):
1. Почему у ArrayRW нет события onWrite?
Потому, что по состоянию ручки(карандаша) не узнаешь - уже написал или нет ? А ArrayRW при doWrite - это инструмент (ручка,карандаш). А проверять ( и брать событие) нужно с того компонента куда пишешь.
sla8a писал(а):
2. Будет ли преступлением это событие добавить?
Будет, даже не пробуй.
ИМХО
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2290
Рейтинг: 678
#10: 2011-04-13 15:18:10 ЛС | профиль | цитата
[offtop]delete[/offtop]
карма: 11

0
Ответов: 16884
Рейтинг: 1239
#11: 2011-04-13 15:29:02 ЛС | профиль | цитата
code_23338.txt
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1code_23338.txt [597B] [142]
Ответов: 2290
Рейтинг: 678
#12: 2011-04-13 15:40:24 ЛС | профиль | цитата
Tad, да не факт что записало: code_23340.txt
А если перед записью сделать проверку:
Arr := ReadArray(_data_Array);
Ind := ReadData(_Data,_data_Index,@_prop_Index)
if (Arr = nil) or (Arr._Count < Ind) then exit;
Еще наверное надо бы проверять какой массив (Int, Str, Real).
карма: 11

0
файлы: 1code_23340.txt [983B] [164]
Ответов: 16884
Рейтинг: 1239
#13: 2011-04-13 16:04:19 ЛС | профиль | цитата
sla8a, в любом случае
Tad писал(а):
А проверять ( и брать событие) нужно с того компонента куда пишешь.
как проверять - это уже детали


карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1304
Рейтинг: 405
#14: 2011-04-13 16:22:48 ЛС | профиль | цитата
sla8a, может и не совсем понял суть вопроса, но тестовые схемы не есть истина, или создать массив а потом перезаписать или добавить элемент массива и тогда достаточно хаба для организации события onWrite


Add(MainForm,10359428,119,147)
{
Width=560
Height=337
Position=1
}
Add(IntegerArray,16448504,231,147)
{
IntArray=[]
}
Add(ArrayRW,16724560,231,224)
{
link(Array,2841187:Var2,[])
link(Value,15700829:Position,[(251,212)(271,212)(271,276)(125,276)])
}
Add(Button,8471644,63,224)
{
Left=105
Top=145
link(onClick,15700829:doFor,[])
}
Add(For,15700829,119,224)
{
End=10
link(onEvent,12099426:doEvent1,[])
}
Add(ListBox,8824405,343,252)
{
Left=250
Top=70
Width=150
Height=165
}
Add(Hub,12099426,182,224)
{
OutCount=3
link(onEvent1,16724560:doAdd,[(215,230)(215,244)])
link(onEvent2,16724560:doWrite,[])
link(onEvent3,3467738:doRead,[(205,244)(205,258)])
}
Add(ArrayRW,3467738,294,252)
{
link(onRead,8824405:doAdd,[])
link(Array,2841187:Var3,[(300,194)])
}
Add(GetDataEx,2841187,231,189)
{
link(Data,16448504:Array,[])
}

карма: 3

0
Ответов: 16884
Рейтинг: 1239
#15: 2011-04-13 16:34:49 ЛС | профиль | цитата
MAV, я специально не подавал на doAdd, т.е. запись в массив не проходила. Хаб выдаст событие в любом случае - ты проверяешь карандаш, а я по Count проверяю лист бумаги - записано что-то или нет. Две БОЛЬШИЕ разницы.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:Konst
Сообщение
...
Прикрепленные файлы
(файлы не залиты)