Вверх ↑
Этот топик читают: Гость
Ответов: 262
Рейтинг: 6
#1: 2006-10-19 07:27:50 ЛС | профиль | цитата
Задача: Выдать через onEvent данные в виде MT содержащие размер таблицы(компонент SQLite_info): т.е. количество столбцов+кол-во строк. Казалось бы просто -
columns.lData:=@rows;
_hi_onEvent(_event_onTblSize,columns);
Понятно - за lData получим взбучку от Dilma. Смотрим процедуру AddMtData. При передаче ей указателей @columns,@rows получаем назад forFree<>nil которую по логике должны уничтожить. Вопрос, что же мы уничтожим? И зачем такие сложности в конкретном примере? Предложение: Добавить в share процедуру для соединения существующих TData в цепочку.
 procedure LinkMTData(data: array of PData);
var i: Integer;
begin
for i := 0 to High(data)-1 do
data[i]^.lData:=data[i+1];
end;
Использовать же в компонентах примерно так
linkMTData([@columns,@Rows,@Mydata]);
_hi_onEvent(_event_onTblSize, Columns);
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#2: 2006-10-20 15:09:06 ЛС | профиль | цитата
AddMTData - процедура расчитанная на все случаи жизни и кроме всего прочего не линкует данные, а копирует их. Процедуру линковки стоит сделать так же универсальную. Оператор High кстате возвращает верхний индекс массива, а не количество элементов в нем.
карма: 27
0
Ответов: 262
Рейтинг: 6
#3: 2006-10-21 14:22:31 ЛС | профиль | цитата
Dilma,На счет High. Я знаю, что это не count. Если если передано три переменных, то цикл должен сделать два повтора от 0 до 1.
а копирует их
и как же это происходит копирование например data_bitmap? И как потом удалять две TData с указателем на один битмап? Я делал процедуру для полного копирования МТ цепочек. Правда еще не все типы там описаны.
ЗЫ: А универсальность часто порождает громоздкий и медленный код.

[size=-2]------ Добавлено в 14:20
сорри..
code_466

[size=-2]------ Добавлено в 14:22
почему то не удаляет вложения, хотя есть кнопка удалить.
карма: 0

0
файлы: 2code_465.txt [840B] [379], code_466.txt [839B] [373]
Ответов: 9906
Рейтинг: 351
#4: 2006-10-21 14:34:21 ЛС | профиль | цитата
подтверждаю: не удаляет
карма: 9

0
Администрация
Ответов: 15295
Рейтинг: 1519
#5: 2006-10-26 20:59:02 ЛС | профиль | цитата
Никаких копирований data_bitmap быть не должно. Только передача указателей.
карма: 27
0
Ответов: 9906
Рейтинг: 351
#6: 2006-10-26 23:22:05 ЛС | профиль | цитата
Dilma, а мне показалось, что коллега продемонстрировал нам, что копирование данных не всегда спасает от отсутствия счетчиков ссылок ...

Все ж таки неработоспособность такой схемы:
Add(Button,1534248,105,140)
{
Left=110
Top=130
link(onClick,16426518:doEvent1,[])
}
Add(Bitmap,13521402,217,91)
{
}
Add(Img_Copy,8832857,217,140)
{
link(onCopy,4567176:doValue,[])
link(Source,13521402:Bitmap,[])
}
Add(Memory,4567176,273,140)
{
}
Add(Hub,16426518,161,140)
{
link(onEvent1,8832857:doCopy,[])
link(onEvent2,16254992:doLoad,[(210,153)(210,195)])
}
Add(Image,16254992,273,189)
{
Left=290
Top=210
link(Bitmap,4567176:Value,[])
}
- не настолько очевидна для юзера. Тем более, что она может и заработать... По недоразумению

[size=-2]------ Добавлено в 23:22
BTW: кстати, у TObj счетчики-то есть. Вот не пользуемся мы ими...
карма: 9

0
Ответов: 262
Рейтинг: 6
#7: 2006-10-27 05:12:39 ЛС | профиль | цитата
Dilma писал(а):
Никаких копирований data_bitmap быть не должно

Я уже указывал http://hiasm.hexshock.com/xf/topic.php?p=37540#P37540, что копирование происходит в некоторых компонентах. Так вот если в TBitmapArray.DataToPointer написать просто SaveData. То все будет работать ок. Опять же в HIImage._work_doLoad происходит копирование data_bitmap, а можно использовать SetData. Я говорю о унификации процедур: Одна процедура в share сохраняет, одна загружает, одна создает, одна копирует и одна разрушает любой TData.
Вообще может отстраниться от программирования и продумать сначало идеологию работы с данными?
Есть компоненты "хранители" - это все Array и все Memory, Image и др., в них данные сохраняются полностью. Есть компоненты "передатчики" - все Hub-ы, и пр. которые хранят используют и передают только TData. И прямо в хелпе к компоненту указывать его "категорию".

[size=-2]------ Добавлено в 05:12
Galkov, а счетчики ссылок... ну не знаю. Зачем они? Компонент "Хранитель" всегда сам следит за своими данными и все. А у прочих голова не болит
карма: 0

0
Ответов: 9906
Рейтинг: 351
#8: 2006-10-27 09:07:58 ЛС | профиль | цитата
Chesh писал(а):
Компонент "Хранитель" всегда сам следит за своими данными и все.

Не все.
Никаках гарантий того, что какой-нибудь элемент не запомнит "хвостатые" данные без копирования. А потом даст их на улицу, и т.д..
Можно сегодня брать и находить такие элементы.
Скажем, ChangeMon ...
И, наверняка, не один он такой...
карма: 9

0
Ответов: 262
Рейтинг: 6
#9: 2006-10-27 13:14:28 ЛС | профиль | цитата
Galkov писал(а):
Никаках гарантий того, что какой-нибудь элемент не запомнит "хвостатые" данные

Такое ощущение, что компоненты пишет дядя Билл Главное - четкая и понятная теория, а значит база, а компонент который работает вне ее, неисправен.
"Хвостатые"-это МТ я так понял. Ок. Но TData же не появиляются из воздуха, их кто то добавил, кто то хранит. Так вот каждый за свое и отвечает.
Предлагаю рассматривать "хвостатых" как просто переменную типа records в паскале. то есть:
А равно - int = 5
B равно - int = 3 > str = 'abc' > real = 2.5
С равно - name = 'img.jpg' > bmp = data_bitmap
символ > это ldata.
так вот. зачем нужен MT_Memory, если есть Memory, который сохранит и А и B и C. Memory все равно:
1. он знает что он "хранитель" поэтому просто вызывает SetData и делает копию данных. Ему все равно сколько в цепочке данных: один, два или десять.
2. он удаляет эти данные из памяти при присвоении новых. DeleteData.
3. отдает данные, но не копирует их, при запросе. Первый TData.
карма: 0

0
Ответов: 9906
Рейтинг: 351
#10: 2006-10-27 15:01:26 ЛС | профиль | цитата
Chesh писал(а):
Главное - четкая и понятная теория

Излагай.
Можешь не сомневаться о моем участии в обсуждении.
Коллега tsdima, однажды намекал, что не фиг изобретать велосипед - в COM-технологии уже все продумано. Особенных возражений ему я пока не придумал ...

Chesh писал(а):
он знает что он "хранитель" поэтому просто вызывает SetData и делает копию данных. Ему все равно, сколько в цепочке данных: один, два или десять.

Копировать сами объекты TData - еще куда не шло. Хотя, на сегодняшний день, кодами элементов до конца это не делается. И мне не очень понятно, следует ли вообще очень усердно двигаться в этом направлении. Вот тебе и дядя Билл... Или Борман...
Но, копировать "метровые" Stream-ы и Bitmap-ы - не есть верх человеческого интеллекта. ИМХО

Ты вот скажи конкретно: достойно ли уважающих себя челов, такое поведение в вышестоящем примере
карма: 9

0
Администрация
Ответов: 15295
Рейтинг: 1519
#11: 2006-11-01 21:00:59 ЛС | профиль | цитата
Да счетчик ссылок видимо надо вести. Однако без коррекции элементов всеравно не обойтись
карма: 27
0
Ответов: 9906
Рейтинг: 351
#12: 2006-11-01 21:04:51 ЛС | профиль | цитата
Однако без коррекции элементов всеравно не обойтись

Слишком мягко сказано, ИМХО
Пахнет концептуальными изменениями...
НО , в данном случае, про спираль - соглашусь
карма: 9

0
12
Сообщение
...
Прикрепленные файлы
(файлы не залиты)