Вот подправленные компоненты 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]
Этот топик читают: Гость
Ответов: 5446
Рейтинг: 323
|
|||
карма: 1 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
hiArrayEnum.pas - а не так?
[code:1] dt := Item; eIndex := Ind; _hi_OnEvent(_event_onItem,dt); inc(Ind.idata); [/code:1] ArrayRW.ini - не вижу изменений. |
|||
карма: 27 |
|
Ответов: 9906
Рейтинг: 351
|
|||
"Dilma" писал(а): ArrayRW.ini - не вижу изменений.расцветка - iarspider прав, пусть цветит.... |
|||
карма: 9 |
|
Ответов: 5446
Рейтинг: 323
|
|||
2Dilma Извиняюсь... Именно так...
|
|||
карма: 1 |
|
Ответов: 5446
Рейтинг: 323
|
|||
Вопрос вдогонку: нельзя ли доьавить в ArrayEnum возможность работы с Matrix? Вопрос в том, есть ли возможность узнать,
что пришло на вход Array - именно Array или же Matrix? Порядок перебора элементов матрицы можно задавать через свойства. |
|||
карма: 1 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
ArrayEnum - изменения внесены.
Вопрос в том, есть ли возможность узнать,
что пришло на вход Array Есть конечно. Array это тип data_array в поле data_type, а матрица это data_matr. Однако если делать такой компонент, то не стоит совмещать его с ArrayEnum. |
|||
карма: 27 |
|
Ответов: 5446
Рейтинг: 323
|
|||
ok. Тогда сегодня попробую сделать...
|
|||
карма: 1 |
|
Ответов: 2290
Рейтинг: 678
|
|||
Понадобилось делать записи в разные массивы и захотелось событие onWrite для удобства схемопостроения. Так вот хотелось бы узнать:
1. Почему у ArrayRW нет события onWrite? 2. Будет ли преступлением это событие добавить? (могу попробовать сам). |
|||
карма: 11 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
sla8a писал(а): 1. Почему у ArrayRW нет события onWrite?sla8a писал(а): 2. Будет ли преступлением это событие добавить?ИМХО |
|||
карма: 25 |
|
Ответов: 2290
Рейтинг: 678
|
|||
[offtop]delete[/offtop]
|
|||
карма: 11 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
карма: 25 |
| ||
файлы: 1 | code_23338.txt [597B] [142] |
Ответов: 2290
Рейтинг: 678
|
|||
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 |
| ||
файлы: 1 | code_23340.txt [983B] [164] |
Ответов: 16884
Рейтинг: 1239
|
|||
sla8a, в любом случае
Tad писал(а): А проверять ( и брать событие) нужно с того компонента куда пишешь. |
|||
карма: 25 |
|
Ответов: 1304
Рейтинг: 405
|
|||
sla8a, может и не совсем понял суть вопроса, но тестовые схемы не есть истина, или создать массив а потом перезаписать или добавить элемент массива и тогда достаточно хаба для организации события onWrite
|
|||
карма: 3 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
MAV, я специально не подавал на doAdd, т.е. запись в массив не проходила. Хаб выдаст событие в любом случае - ты проверяешь карандаш, а я по Count проверяю лист бумаги - записано что-то или нет. Две БОЛЬШИЕ разницы.
|
|||
карма: 25 |
| ||
Голосовали: | Konst |