iacovlogica wrote:

На кнопки обычно вешаются основной функционал а в менюшках прячут второстепенные функции .

Я бы сформулировал так: в меню представлен весь функционал, а на кнопках - основной. Меню - это хорошая возможность быстро ознакомиться с функциональностью программы, не открывая мануал smile
Плюс горячие клавиши. Хорошее приложение для обработки символьной информации должно работать без мышки.

iacovlogica wrote:

....хотя когда-то появление волков-командера для меня было писком и пределом мечтаний . )))

До сих пор использую FAR - последний из выживших файловых менеджеров с текстовым интерфейсом.

iacovlogica wrote:

по поводу зависа  посмотрите циклы и условия в них (и количество нулей ))) было как то ... )

Скорее всего зацикливается библиотека FastScript, если нарывается на вышеописанную ошибку.

Проблема.

После ручного восстановления форм в следствии фатального сбоя http://myvisualdatabase.com/forum/viewtopic.php?id=3835 немного увлёкся и случайно удалил обработчик события MenuClickAbout, ссылка на которое используется в скрипте:

   frmMain.mniAbout.OnClick := @MenuClickAbout;   

Программа запускается, но при этом выдаёт ошибку:

http://f4.s.qip.ru/SwgAVRB3.png

а затем исчезает из таскбара, но продолжает интенсивно кушать ресурсы. Если запустить её ещё раз, то комп практически виснет

http://f6.s.qip.ru/SwgAVRB4.png

Ожидания
В случае, если пользователь ошибся и указал неправильную ссылку на обработчик, не запускать программу, а выдавать понятное сообщение с указанием строки, в которой произошла ошибка, как это обычно бывает при синтаксических ошибках в скрипте.
http://f3.s.qip.ru/SwgAVRB5.png

P.S. Очень жду встроенный механизм настройки меню. Планирую делать приложения с десятками, а то и сотнями форм и отчётов, с настройкой видимости пунктов меню по ролям  smile
Возможно, что я очень консервативен, и текстовое главное меню уже не популярно. Тогда что сейчас в тренде? Гламурный тулбар с огромными кнопками? smile

1,453

(3 replies, posted in Russian)

Пока нет штатного решения с бэкапами, сделал маленькое консольное приложение, которое сравнивает предыдущий бэкап с текущим и, если были изменения, создаёт новый. В бэкап включены три файла: forms.xml, script.pas и tables.ini

http://f4.s.qip.ru/SwgAVRAK.png

В файле настройки необходимо прописать путь к папке с проектом. Поместите ярлык программы в автозапуск для ежедневных бэкапов.
http://f6.s.qip.ru/SwgAVRAJ.png

https://www.dropbox.com/s/ghjwgt83u12v3 … e.zip?dl=0

Можно прописать в планировщик заданий для запуска через определённый интервал (например - 1 раз в час)

http://f3.s.qip.ru/SwgAVREl.jpg

1,454

(3 replies, posted in Russian)

В полку визуальных компонентов прибыло! Неожиданное, но приятное дополнение версии 4.0 - Google-карта.
http://f2.s.qip.ru/SwgAVRAG.png

1,455

(3 replies, posted in Russian)

Описание проблемы:
1. Создаю новую форму, по ошибке указываю уже существующее название. Создаётся вкладка с названием и выскакивает ошибка
http://f2.s.qip.ru/SwgAVRAz.png
2. Нажимаю кнопку сохранить проект. Получаю следующую ошибку
http://f2.s.qip.ru/SwgAVRAA.png
3. Закрываю проект без сохранения. Открываю. Из 25 форм остаются в живых только 6 sad
http://f2.s.qip.ru/SwgAVRAB.png
Таблицы и скрипт не поврежден. В файле forms.xml - только 6 форм.

P.S. В связи с вышеизложенным очень актуален бэкап, хотя бы простейший: перед переписыванием файлов проекта (forms.xml,tables.ini) делать их копии с расширением .bak  или  .<timestamp>.bak  в текущей папке или папке backups. Плюс бэкап по времени (при запуске, ежедневный)

Спасибо, Дмитрий!  Подправил форматирование,

TNxNumberColumn(frmMain.tgrDetail.Columns[3]).FormatMask := '#,##0.00; ; ';

и теперь всё выглядит великолепно, как я и хотел: ненулевые значения выводятся в денежном формате, а вместо нулевых - пустышки smile
http://f3.s.qip.ru/SwgAVRAn.png

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

( 
cast(
 (select sum(summ) from docDetail
  where docDetail.id_doc = doc.id) AS REAL)
)

   

не получается отобразить денежный формат:

http://f1.s.qip.ru/SwgAVRAe.png

внизу обычные поля с типом "ДЕНЬГИ"

Видимо, это из разряда "хотелок" : "Отображать нулевые значения как пустую строку". Именно отображать, потому что, если "пустышки" будут в наборе данных, то не будет работать функция SUM().


У стандартного компонента TDBGrid  есть два замечательных события,

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);

обработчики на которые легко справляются с подобными задачами по изменению способа отображения ячеек таблицы. Планируется ли что-либо подобное для TTableGrid ?


P.S. Почитал про типы данных SQLite http://xbb.uz/db/Tipy-dannyh-v-SQLite-versii-3 , теперь многое становится понятным в поведении визуальных компонентов, в частности  - возможность в одной колонке отображать данные различных типов.

Вместо нулей - пустышки:
http://f4.s.qip.ru/SwgAVRzM.png

Дмитрий, спасибо за вариант с CAST, сумма отображается верно!

Однако, хотелось бы иметь такой результат:

http://f3.s.qip.ru/SwgAVRzL.png

Про нулевые значения:  первоначальные настройки вычисляемых полей были такими:

(
select cast( amount as REAL) from docDetail as dd
left join doc on doc.id = docDetail.id_doc
left join docType on docType.id = doc.id_docType
where docType.isIncrement and (dd.id = docDetail.id)
)  

а результат очень странный:

http://f5.s.qip.ru/SwgAVRzJ.png

Если первая запись содержала null, то данные начинали отображаться, как текст ( 100.45 ), а сумма не считалась.

Хотя так правильней, пришлось заменять пустые строки нулями, хотя это  перегружает экран.  Вопрос был в том, можно ли как-нибудь избавиться от нулей, но чтобы отображение и суммирование работало корректно?

Изначально я хотел использовать вычисляемые поля без отображения нулей

(            
select amount from docDetail as dd
left join doc on doc.id = docDetail.id_doc
left join docType on docType.id = doc.id_docType
where docType.isIncrement and (dd.id = docDetail.id)
)

но тогда не работает автоматическое вычисление итогов:
http://f1.s.qip.ru/SwgAVRzC.png

а числа с плавающей запятой отображаются, как строки, если первая ячейка в колонке пустая.

Вопросы:
1. Можно ли как-то явно определить желаемый формат отображения данных в колонке?
2. Можно ли подавить отображение нулевых значений в выбранной колонке?

Меняем сортировку в детальной части и меняется формат отображения:
http://f4.s.qip.ru/SwgAVRzB.png

Обратил внимание, что формат отображения данных в таблице зависит от того, какую информацию содержит 1-я строка выборки. Пример с отображением количества

Тип данных - вещественное число
Вычисляемое поле Приход:

(ifnull((            
select amount from docDetail as dd
left join doc on doc.id = docDetail.id_doc
left join docType on docType.id = doc.id_docType
where docType.isIncrement and (dd.id = docDetail.id)
),0 ))  

Вычисляемое поле Расход:

(ifnull((      
select amount from docDetail as dd
left join doc on doc.id = docDetail.id_doc
left join docType on docType.id = doc.id_docType
where not docType.isIncrement and (dd.id = docDetail.id)
),0))     

Если первое число ноль, то вся колонка отображается, как целые числа
http://f6.s.qip.ru/SwgAVRzA.png

Метод  Add() класса TList, по идее, должен возвращать индекс добавленного элемента, но сейчас он всегда возвращает ноль:

http://f3.s.qip.ru/SwgAVRyi.png

http://f2.s.qip.ru/SwgAVRyh.png

Обновил программу, однако новая функция не поддерживается:  http://f5.s.qip.ru/SwgAVRyg.png

Добрый день. Нигде не нашел описания, что именно находится в этом параметре. В обычном Delphi там передаётся объект, у которого возникло это событие; в скриптах MyVisualDatabase, видимо, тоже, но в виде строки, содержащей число.

Можно ли использовать это значение, например, для создания одного обработчика для нескольких элементов интерфейса?

Первоначальная задумка была такая: для отображения в меню форм справочников у меня используется куча однотипных процедур, которые я хотел заменить одной. По задумке я хотел сохранить в Tag ссылку на форму, что обычно легко удаётся в Delphi.

procedure MenuItemClick (Sender: string);
var
  form:TForm;
begin
  form := TForm( TMenuItem(sender).tag );
  form.ShowModal;
end;

Но ничего не вышло, так как компилятор не захотел выполнять приведение типов:

var
   miItems: TMenuItem;

begin
  miItems := TMenuItem.Create (frmMain.MainMenu);
  miItems.Tag := Integer(frmItem);

Остались вопросы:

1. Как правильно использовать параметр sender для получения доступа к элементам интерфейса?

2. Как запихать в Tag ссылку на объект? 
(Пока вижу только одно решение: создаётся глобальный ObjectList:TList, в него добавляются объекты, а доступ к ним - по индексу, который хранится в Tag)

Отлично, всё работает, как надо! Теперь красоту в интерфейсах наводить будет проще smile  Спасибо!

DriveSoft wrote:

...Например вы установили ограничение UNIQUE для какого либо поля в БД...

Не нашёл такой возможности в конструкторе (v. 3.6).  Как добавить уникальность к полю БД?  Возможность проверки перед сохранением с помощью скриптов видел в ветке  http://myvisualdatabase.com/forum/viewtopic.php?id=1062

TButton.Action [ПОИСК] . Осуществлять поиск по вхождению, либо сделать это опцией

Компонент TLabel

Убрал чекер со свойства Transparent, меняю свойство Color в редакторе свойств. Результата нет.
http://f1.s.qip.ru/SwgAVRvh.png

Color всегда равно Parent.Color ?