Вверх ↑
Этот топик читают: Гость
Ответов: 262
Рейтинг: 6
#1: 2006-09-27 12:05:22 ЛС | профиль | цитата
Dilma, есть два пожелания:
1. Сделать на Палитре элементов (elements) настраиваемое меню по правому клику наподобии el_menu.txt. Точнее два. Одно для вкладок другое для самих элементов. Н-р: pl_vkl_menu.txt и pl_el_menu.txt.
2. Сделать переключение между окнами проектов по ctrl+tab, ctrl+shift+tab.

[size=-2]------ Добавлено в 12:05
А это шаблон плагина для HiAsm к моему первому пожеланию code_323
V 3_62b159b2
карма: 0

0
файлы: 1code_323.txt [3KB] [497]
Администрация
Ответов: 15295
Рейтинг: 1519
#2: 2006-09-27 12:07:29 ЛС | профиль | цитата
1. А сейчас-то это зачем?
2. Alt+(1..9)
карма: 27
0
Ответов: 262
Рейтинг: 6
#3: 2006-09-27 12:24:18 ЛС | профиль | цитата
Dilma 2. Класс. Только где же был хелп? Или глаза мои ;)
1. Не понятно. Вопрос снимается совсем и его больше не задавать ?
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#4: 2006-09-27 12:34:06 ЛС | профиль | цитата
2. Хелп к сожалению отстает в своем развитие от возможностей среды...
1. Добавлено
карма: 27
0
Ответов: 262
Рейтинг: 6
#5: 2006-09-27 12:59:55 ЛС | профиль | цитата
Dilma,
1. Добавлено

как быстро! т.е. можно писать плагин?
Если это так, то как лучше сделать? :
1. компонентом обернуть elmen.dll и hitools.dll и работать через него (пока для меня самый понятный и логичный вариант)
2. напрямую через SQLite - elements.db (в будущем проблемы совместимости. )
3. возможно есть третий вариант - через среду на подобии работы HiPlugs (я о нем не знаю)
ЗЫ: а можно добавленную версию
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#6: 2006-09-27 13:01:41 ЛС | профиль | цитата
Лучше всего вариант 1.
карма: 27
0
Ответов: 262
Рейтинг: 6
#7: 2006-09-29 16:08:22 ЛС | профиль | цитата
Вот первый вариант плагина. Работают три комманды: Установить элемент, Удалить элемент и Информация об элементе.
Как назло первый казус. Вчера, ради эксперимента, сделал "Удалить элемент" для HiElem и удалил его безвозвратно Сегодня пришлось делать заново. Добавил второе предупреждение типа "а вы уверены?".
И появилась куча вопросов к Dilma.

[size=-2]------ Добавлено в 07:14
Если делать элемент обертку то тогда, я думаю не надо в нем описывать новые процедуры, а стоит их размещать в hitools.dll. Понадобятся такие процедуры:
function TabByElem(name:string):string;
procedure MoveTab(toNumber: integer);
procedure MoveEl(toNumber, toTab: integer); {если toNumber=-1 поместить в конец новой вкладки, если toTab=-1 перемещать внутри одной вкладки}
procedure DeleteTab(n:string);
procedure RenameTab(oldname,newname:string);
procedure BackupEl(name, BackUpFolder:string); {создать в BackUpFolder папку с именем name и скопировать туда файлы. Возможно стоит создать сразу hic файл. }
procedure BackupTab(name, BackUpFolder:string);

Все это для утверждения так сказать, поскольку касается самой среды.

[size=-2]------ Добавлено в 16:08
Следующая версия плагина. Добавил четыре комманды:
el_moveup-Элемент вверх
el_movedown-Элемент вниз
vkl_moveup-Вкладку вверх
vkl_movedown-Вкладку вниз
Пока процедуры по работе с elements.db находяться в самом плагине(проще для отладки), но я думаю перенести их в hitools.dll и elmen.dll можно будет позже.

вопрос к Dilma: бывает ли позиция,id вкладки или позиция элемента = 0? или первый всегда = 1?
Все дело в том, что после установки различных элементов, в Elements.db появились элементы со значением tab=0, а вот вкладки с id=0 нет. Зато есть вкладка в которой пустые name и info, а заданы только id и pos. От чего это произошло пока не ясно.
карма: 0

0
файлы: 2Elem.zip [33.5KB] [288], Elem02b.zip [40.3KB] [304]
Администрация
Ответов: 15295
Рейтинг: 1519
#8: 2006-09-29 16:48:53 ЛС | профиль | цитата
позиция может быть 0. Id нет. Вкладка с пустыми name и info это Hidden вкладка с проектными и внутрисервисными элементами. Элемент вкладки 0 может получиться только вследствие ошибки
карма: 27
0
Ответов: 262
Рейтинг: 6
#9: 2006-10-02 06:54:51 ЛС | профиль | цитата
Dilma, "позиция может быть 0" - однако в elements.db нет ни одной записи в которой pos=0. ни в таблице elements ни в groups, что однако непонятно, если минимальная позиция =0 тогда почему во всех вкладках pos начинается с 1? Нолик про запас чтоль оставлен ?
Соответственно если я сейчас перемещу первый элемент (pos=1) вверх, и его pos станет равной 0, то образуется разрыв позиций. SELECT pos FROM elements WHERE tab=1 ORDER BY pos даст результат: 0,2,3,4,5... что в принципе не хорошо. Зачем порождать хаос. Тут или таблицу пересобрать или принять "волевое решение" ;) что MIN(pos)=1.

[size=-2]------ Добавлено в 06:54
По этой же причине следует в elmen.dpr
procedure DeleteElement(name:PChar); stdcall;
begin
exec('delete from elements where id = ''' + name + '''');
end;
изменить на
procedure DeleteElement(name:PChar); stdcall;
Var r: pointer;
tab,pos:integer;
begin
r := query('select tab,pos from elements where id = ''' + name+ '''');
sqlite3_step(r);
tab := sqlite3_column_int(r,0);
pos := sqlite3_column_int(r,1);
sqlite3_finalize(r);
exec('delete from elements where id = ''' + name + '''');
exec('UPDATE elements SET pos=pos-1 WHERE pos>'+Int2Str(Pos)+' and tab='+Int2Str(tab));
end;
т.е. уменьшить позицию всех элементов во вкладке после удаленного.
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#10: 2006-10-02 14:51:13 ЛС | профиль | цитата
Chesh, вопрос звучал как
бывает ли позиция,id вкладки или позиция элемента = 0?

а не "Почему позиция начинается с 1, а не с 0". Знакомясь с кодом elmen.dpr можно было увидеть, что данное поле используется исключительно для сортировки элементов внутри вкладки. Поэтому основное ограничение тут - это избежание ситуаций, когда два элемента на ожной вкладке имеют одинаковое значение pos. При удаление элемента ничего декрементировать не надо: какой в этом смысл Внешние ф-ции по управлению позицией будут такие:
MoveToUp - переместить элемент вверх на одну позицию
MoveToDown - переместить элемент вниз на одну позицию
карма: 27
0
Ответов: 262
Рейтинг: 6
#11: 2006-10-02 15:18:39 ЛС | профиль | цитата
Dilma, Сейчас я сделал процедуры для elmen.dll
procedure MoveEl(id: pchar; nPos:Integer);
procedure MoveTab(name: pchar; nPos:Integer);
перемещают элемент и вкладку на указанную позицию.

И процедуры для hitools.dll:
procedure ShiftTab(name, fdir:pchar; ShiftPos:Integer);
procedure ShiftEl(ElId, fdir:pchar; ShiftPos:Integer);

ShiftPos знаком указывает направление сдвига.
В принципе сделать из двух четыре процедуры несложно.

[size=-2]------ Добавлено в 15:18
Dilma писал(а):
При удаление элемента ничего декрементировать не надо: какой в этом смысл

а как тогда разрулить ситуацию: pos=1,2,3,4,5,6 удалили 3 и 4 получили pos=1,2,5,6. Теперь необходимо сдвинуть 5 на одну позицию вверх. т.е 5-1=4? или 5-х=2. Получаются лишнии проверки и запросы к базе на поиск предыдущего. Разумней следить за соблюдением неразрывности значений позиций при удалении и перемещении.
карма: 0

0
Ответов: 2125
Рейтинг: 159
#12: 2006-10-02 15:35:16 ЛС | профиль | цитата
Разумнее сделать процедуру с указанием какие конкретно позиции нужно обменять, тогда можно обойтись и одним update:
update elements set pos=(@pos1+@pos2)-pos where pos in (@pos1,@pos2) [/code]
карма: 1

0
Администрация
Ответов: 15295
Рейтинг: 1519
#13: 2006-10-02 15:57:54 ЛС | профиль | цитата
Я представляю себе интерфейс менеджера по изменению позиции компонент как некоторый список с двумя кнопками "Сдвинуть вверх" и "Сдвинуть вниз". При таком интерфейсе задачи поменять два элемента местами нет, как нет тут необходимости в знание позиций этих элементов в числах. А раз так, то и заботится о внутренней структуре БД при согласование интерфейса смысла не имеет.
карма: 27
0
Ответов: 262
Рейтинг: 6
#14: 2006-10-02 17:21:58 ЛС | профиль | цитата
Dilma, абсолютно согласен на счет двух кнопок. по порядку.
1. После выбора пользователем комманды "Сдвинуть вниз", среда возвращает плагину комманду(el_MoveToDown) и имя элемента через точку _var_Desktop (Hub:например).
2. Плагин через _work_doMoveToDown обертки вызывает процедуру hiTools.dll - ShiftEl('hub','delphi',1)
3. ShiftEl пользуясь процедурами из elmen.dll
a. откроет базу
б. получит Pos Huba (1) по его имени
в. получит Pos элемента стоящего после него. (2)
г. все таки видимо вызовет процедуру которая обменяет значение Pos этих элементов. Нельзя же просто Pos Hub-а приравнять 2. Получиться два элемента с одинаковим значением Pos.
д. закроет базу.

PS: Я думаю названия процедур не принципиальны
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#15: 2006-10-02 17:45:29 ЛС | профиль | цитата
Да именно так и будет.
карма: 27
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)