Доброго дня. А зачем городить отдельную таблицу? Проще добавить ячейку с флагом "занято". При открытии флаг ставим, при закрытии - снимаем. Не забываем нагружать во всех клиентах добавить автообновление грида по таймеру (чтобы видеть изменения в основной таблице). Это при условии что нужно только знать что строка занята, а не кем занята.

K245, Sparrow, я Вам очень благодарен за помощь!

k245 wrote:

Компонент медленный, ничего не поделаешь.


Другие варианты:


1. Загружать по мере надобности. То есть сначала грузятся только узлы верхнего уровня. При клике на раскрытие узла подгружаются порция записей в дерево. Нужен скрипт для добавления записей в дерево.


2. Вместо компонента дерева (TdbTreeView) использовать компонент таблицы (TdbStringGridEx), загружать SQL-запросом, а вложенность эмулировать отступом (пробелами) в названии первой колонки. Также понадобится скрипты для сворачивания/разворачивания "узлов" путем изменения свойства видимости строк.

Можете подсказать как через скрипт заполнять дерево? Основная проблема это задать id записей. До этого совсем уж костыли приходилось делать через скрытые столбцы...

Коллеги, добрый день!
Подскажите как решить такую проблему: у меня есть таблица (каталог) с глубиной ветвления порядка 4х вложений. Количество строк 13600.
Если я настраиваю компонент TreeView на отображение дерева, то получаю ОЧЕНЬ долгий запуск приложения.
Как ускорить процесс построения дерева в компоненте? Или, может быть, есть другой способ?
Прикладываю sql файл для создания соответствующей таблицы БД с большим количеством строк

Огромное спасибо! Идеально!

З.Ы. Я бы с удовольствием пошел от обратного, но у вкладок нет кнопочки "Закрыть".

Еще можно попробовать через postmessage наверно, но как создать свой обработчик не понятно (Application.OnMessage не доступен)

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

В примере: Запускаем, идем на вкладку Проекты -> Жмем "плюс" -> Появляется новая вкладка. На той форме есть кнопка закрыть. Если ее нажать вкладка станет пустой, а надо ее удалить.

Для того чтобы закрыть вкладку в которую программа была встроена. Не оставлять же ее пустой.

Всем добрый день! Подскажите есть возможность поймать событие закрытия встроенного таким способом окна?

9

(11 replies, posted in General)

I think it's difficult to create with mvd on clear fast script. I prefer to create a python script and convert it to exe file. Then start script with OpenFile function.

Спасибо! Задача решена. Мне нужно было рабочее решение, не до элегантности.
Но пару вопросов добавлю:
1. Где нужно было искать код WM_CHAR? (Это для общего развития)
2. Можно как-то отловить окончание выполнения задачи в консоли?

У меня есть скрипт (уже скомпилирован в ехе), которому нужно при запуске передать параметры. Просто OpenFile(cmd) не срабатывает /cmd это строка содержащая путь к скрипиу и параметры
Если делаю OpenFile('cmd.exe'), то открывается консоль куда можно строку вставить из буфера и выполнить.
Собственно задача передать команду в консоль посимвольно. Примеры в интернете указывают что нужно в PostMessage использовать WM_CHAR вместо WM_KEYDOWN, но WM_CHAR в среде разработки нет (возможно можно нет алиаса текстового, но тогда нужено знать позицию WM_CHAR в массиве параметров (для WM_KEYDOWN позиция 255)

Доброго времени суток!
Подскажите как мне отправить текст в консоль?

cmd := 'строка которую требуется отправить в консоль';
Wcmd := FindWindow('', 'c:\windows\system32\cmd.exe');
    for i := 1 to Length(cmd) do
    begin
        PostMessage(Wcmd,WM_KEYDOWN,Ord(cmd[i]),0);
        Sleep(50);
    end;
    //PostMessage(Wcmd,WM_KEYDOWN,VK_RETURN,0);

Этот код работает, но в консоль приходит не то, что я отправляю. Предполагаю что должен быть не WM_KEYDOWN, а WM_CHAR, но на такое решение ругается компилятор.

Для себя на память, да и может быть кому пригодится: Если включено управление ролями, то блок подключения к основной базе MySQL следует выкинуть в отдельную процедуру, а ее вызов определить в главном блоке "begin - end."
Автозаполнение гридов и деревьев проще через цикл сразу после "UpdateDatabase(''); // to fill ComboBoxes":

for i:= 0 to fMain.ComponentCount-1 do
         begin
             if fMain.Components[i].ClassName = 'TdbTreeView' then TdbTreeView(fMain.Components[i]).dbUpdate;
             if fMain.Components[i].ClassName = 'TdbStringGridEx' then TdbTreeView(fMain.Components[i]).dbUpdate;
         end;

Если правильно понял Ваш вопрос, то скорее всего это то что Вам нужно:
http://myvisualdatabase.com/forum/viewt … 613#p45613

Возможно. Для начала составить запрос SQL и вывести его в TableGrid. Потом Обработать Grid скриптом для придания ему ножного оформления. Без структуры БД составление запроса - как гадание на кофейной гуще.

Событие ComboBox'а OnCloseUp имеет доступ к тому тексту, который был введен. Подхватываете его и обрабатываете скриптом (просто вносите новую строку в TableGrid или создаете запись в БД - это Ваше решение).

На данный момент разрабатываю для себя софт для составления расчетов и ведения строительных объектов.
Существующие на рынке продукты (та же гранд-смета) не устраивают по ряду причин.
Сейчас готов модуль для навигации по базе ФСНБ 2022 года с последними изменениями.

К расценке выводится состав работ, трудозатраты рабочих и механизаторов,  машин и механизмов, потребность в материалах.

По ссылке можно получить доступ на версию с усеченной нормативной базой.
По полной версии базы - в личку.

Ссылка: https://disk.yandex.ru/d/XRxIkJbyKC4Puw

Спасибо за ссылки!

k245 wrote:

SELECT * FROM  <алиас базы>.<таблица>

то есть перед именем таблицы добавляется алиас базы данных.


если подключение было таким

ATTACH DATABASE 'c:\base2.db' as 'base2' 

то выборка делается так

SELECT * FROM  base2.mytable

Подскажите пожалуйста как быть если часть баз (или все) будут не SQLite, а MySQL?

k245 wrote:
indigen wrote:

ОФФ. Как добавить строки в TreeView так, чтобы MVD видела id привязанных к ним записей (заполняла sqlValue)?

Нужно указывать свойство ID у строки:

tmpGrid.Row[tmpRow].ID := <id записи>

Это касается как таблиц, так и деревьев.

В таблицах проще, там нужно что бы в выборке был столбец id и она его сама по строкам раскидывает, а вот деревья - не хотят...
За подсказку огромное спасибо!

Подскажите, как указывать из какой базы делается выборка?
У меня в проекте логически требуется подключение к 3 базам, 2 из которых не содержат файлов, поэтому проблема BLOB тут не поднимется, а элементы форм все равно заполняются программно.

ОФФ. Как добавить строки в TreeView так, чтобы MVD видела id привязанных к ним записей (заполняла sqlValue)?

Доброго времени суток!
Подскажите пожалуйста как заполнить скриптом компонент TreeView?
В таблице базы есть поля id, Code, Caption, ParentID

23

(18 replies, posted in Russian)

k245 wrote:

Про триггеры слышали? Вот они как раз для этого.
Или на крайний случай хранимая процедура - её проще отлаживать smile

Про триггеры слышал что они есть, а вот как их есть - не знаю. Для меня потолок это JOIN и вложенный SELECT.

24

(22 replies, posted in Russian)

k245 wrote:

Поддерживаю по всем пунктам.


Решаю на своём уровне:
1)  делаю "Справочник разработчика" - база знаний по My Visual Database.
2) использую OLE  MSXML2.DOMDocument 
3) пишу кучу скриптов
4) думаю над своим генератором PHP-кода .

1 - видел, но еще не пробовал. Идея мне нравится. Сам собираю потихоньку расчетно-сметный софт для себя на основе открытых данных минстроя.
2 - без нормального туториала для меня сложно. Проще на питоне обработать сырые данные и загрузить их в базу

А в целом было бы круто иметь возможность самим накидывать функционал MVD с помощью плагинов или модулей. (это бы наверное решило часть проблем)

25

(18 replies, posted in Russian)

Я думаю тут выход один:
1) Открываешь форму -> проверяешь переменную Action -> если == 'NewRecord', то генеруриуешь новое значение счетчика и сохраняешь запись без закрытия формы.
2) Узнаешь id вновь созданной записи и присваиваешь его кнопке сохранения (чтобы новую запись не создала, а отредактировала нужную) или сохраняешь все через скрипт.