Идея с манипулированием форматом даты для неотображения пустых дат,как я понимаю, может быть защита разработчиком в саму программу.
Это сэкономит кучу строк кода.
...
Если же это не реализовано, то я хотел сделать так:
При запуске программы перебираю множество всех форм и получаю ни них все имена дата пикеров. Устанавливаю для них отображать пустой формат, если даты нет. Имена форм и датапикеров загоняю в глобальный массив.
Создаю функцию  FormatDTChahge, которая меняет формат датапикеров на переданой в нее имени формы. Она ищет нужные датапикеры по глобальному массиву.
Тогда останется на все OnChange датапикеров вручную повесить эту функцию с именем формы.
В этом случае не надо будет прописывать имя каждого датапикера в коде событий OnChange и на открытие форм не надо вешать обработчик.
У кого-нибудь есть идеи получше?

Дмитрий,
А как можно получить множество всех компонентов на форме, которые являются датами?
Тогда можно для всех них поменять формат, а не писать код для каждой даты.

Hi Derek,
This is a very original solution!
Thank you very much!

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

Application can not reconnect to MySQL server.
Error message:
Lost connection to MySQL server during query
Error on data reading from the connection:
������� ���������� ���������� ���� �����������, �.�. �� ������� ���������� �� ��������� ����� �� ������� ������ ������, ��� ���� ��������� ��� ������������� ���������� ��-�� ��������� ������� ��� ������������� ����������.

Socket Error Code: 10060($274C)

Т.е. программа нормально обрабатывает общение с mysql сервером, если он не доступен.
Но, в чем же тогда может быть причина  закрывания без выдачи каких-либо сообщений в момент когда идет обращение к серверу?

Нет, необычная дата на форме добавления новой записи не подходит.
У меня на форме поле даты заполняется не при создании записи, а тогда когда поступит информация от клиента о дате заключения договора.
Я уже устал объяснять новым пользователям, как работает отображение даты договора - типа "есть условность, что если галочка не стоит, то  дата в этом поле ничего не обозначает."
Наличие даты, которая меняется каждый день, реально сбивает с толку.
Надо, именно, чтобы дата не отображалась, если ее не указали.
Можно ли добавить хотя бы изменение цвета шрифта?
Т.е. чтобы срабатывало
if Form2.DateTimePicker1.Checked := False then Form2.DateTimePicker1.Font.Color := clWhite;

В мастере настройки таблицы есть возможность указания выравнивания столбца.
При этом, установленное выравнивание применяется как к заголовку столбца, так и к данным столбца.
В общем случае, наверно, это нормально.
Однако, если мы выравниванием цифры прижимая их к правой границе, то заголовок этого столбца, прижатый вправо, смотрится некрасиво (надо выровнять заголовок по центру).
Можете ли Вы доработать программу, чтобы выравнивание заголовков и данных было независимым.
Уж очень не хочется скриптом обрабатывать.

Спасибо!

DriveSoft wrote:

Имеете ввиду ключ реестра?


Проверяется другим способом:

function CheckExcelInstalled(AValue: String): boolean;
var
  FCLSID: TCLSID;
begin
  Result := (CLSIDFromProgID(PChar(AValue), FCLSID) = S_OK);
end;

        // auto
        if CheckExcelInstalled ('Excel.Application') then Grid.ExportToExcel()
        else if CheckExcelInstalled ('com.sun.star.ServiceManager') then Grid.ExportToLibreCalc()
        else MessageBox(TForm(TdbButton(Button).Owner).Handle, PChar(Lang.Your_computer_does_not_have_Excel_or_LibreOffice), PChar(Lang.Error), MB_OK+MB_ICONINFORMATION);

Этот код ищет в реестре программу с названием "Excel.Application".
Все ProgID должны располагаться в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Classes\
Но, в этой ветке на моем ПК нет строки "Excel.Application" (проверил вручную)
Зато есть в какой то другой ветке и без параметра CLSID
Может быть Ваш код  не учитывает отсутствие этой строки в данной ветке реестра или отсутствие у него CLSID?
И поэтому возникает ошибка.

DriveSoft wrote:

Режим auto не проверяет ассоциацию расширения xls, а только лишь проверяет, если установлен Excel, открываем в нем, если нету, то проверяет, установлен ли Libre Office.

Вопрос - к какому ключу идет обращение, чтобы понять установлен ли Excel?

У меня есть в скрипте функция
function OnSQLException(Sender: TObject; Msg: string; SQL: string): boolean;
в ней кроме обработки возможных известных ошибок есть и такой " универсальный" код:
        result := True; // предотвращает показ системной ошибки
        MessageBox(Msg, 'Необработанная ошибка базы данных! Модуль OnSQLException', MB_OK+MB_ICONWARNING);
        ShowMessage(SQL);
Должен ли он приводить к выводу сообщения об ошибке связанную с вылетанием программы?
Может программа не успевает вывести сообщение до вылета?

Программа работает на пользовательских ПК, но данные пишет в базу MySQL находящуюся на сервере предприятия в локальной сети.
Иногда, при закрытии окон программы она зависает на пару-тройку секунд, а потом приложение просто закрывается без выдачи каких-либо сообщений.
Скорее всего это проблемы с сервером предприятия, т.к. было замечено, что и при работе с 1С происходят иногда зависания на несколько секунд, показывая пиктограммку ожидания обновления данных.
Т.е. 1C умеет ждать пока сервер сможет обработать ее запрос.
Вопрос - как происходят INSERT и UPDATE в MVD?
Делаются ли они через Try?
Можно ли как-то обезопасить программу от тормозов сервера?

Нужно обратиться из скрипта к закладке на PageControl по ее имени.
Т.е. надо что-то такое:
Form_1.PageControl_1.TabSheet_name.Visible := false;

Приложить проект не могу, т.к. он на MySQL.
Но, прикладываю файл со сравнением одного и того же запроса, сформированного версией 5.3 и 5.5.
Из него видно, что в версии 5.3 данные из полей типа EDIT включались в запрос оператором LIKE и с апострофами,
а в версии 5.5 те же поля включаются в запрос оператором = и без апострофов.
Т.е. версия 5.5 почему-то считает, что в полях EDIT могут быть  только числовые данные.

Обновился с версии 5.3 на 5.5 бета
Перестали работать отчеты.
Выяснилось, что мастер отчетов неправильно создает SQL запрос  в секции WHERE для данных из полей типа Edit.
Т.е. если в мастере отчетов указать компонент Edit (участвующий в поиске) привязанный к Tbl_name.field_name, то создается запрос, в котором секция WHERE выглядит так.
WHERE 'Tbl_name'.'field_name' = какой то текст
Т.е. у текста нет кавычек.
А должно быть 'Tbl_name'.'field_name' LIKE 'какой то текст'
Например для полей MEMO мастер отчетов пишет правильно:
'Tbl_name'.'field_name' LIKE 'какой то текст'

Есть поле даты DateTimePicker.
Надо отображать в нем пустоту, если пользователь явно не указывал в нем дату.
А если он кликает по этому полю, то должен открываться стандартный диалог выбора даты.
Как это сделать?
А то у пользователей вызывает путаницу наличие текущей даты в этом поле, если явное указание даты не производилось..

На этом ПК у меня  Excel не стоял никогда.
Но, стоял WPS Office 2016.
И в него экспорт производился нормально при установке кнопки в auto.
В мое отсутствие на работе эту программу по ошибке деинсталлировали с ПК.
Возможно, сделали что-то неправильно.
Я уже поставил ее обратно, но в нее экспорт теперь уже не производится.
Т.е. возможно это проблема конкретного ПК, но надо бы добавить перехват и обработку этой ошибки.
А вообще, правильно было бы проверять ассоциацию  расширения файла и запускать привязанное по умолчанию приложение

92

(1 replies, posted in Russian)

Обновился с версии 5.3 на 5.5 бета.
Слетел автоподбор высоты строки в таблице при многострочном отображении текста в ячейках таблицы.
Теперь высота строки раз в 10 больше, чем нужно.
Нижняя граница не поджимает снизу последнюю строку текста, а улетела куда вниз, как будто к содержимому ячейки добавили несколько сотен пробелов.
...
Код, который прекрасно работал в версии 5.3 такой:
...
procedure Form1_TableGrid_MainWall_OnChange (Sender: TObject);
var
    ii, c: integer;
begin
   // автоматический подбор высоты строк
   Form1.TableGrid_MainWall.Options := Form1.TableGrid_MainWall.Options or goRowResizing;
    c := Form1.TableGrid_MainWall.Columns.Count - 1;
    for ii := 0 to c do
    begin
        Form1.TableGrid_MainWall.Columns[ii].VerticalAlignment := taAlignTop;
        Form1.TableGrid_MainWall.Columns[ii].WrapKind := wkWordWrap;
    end;

    c := Form1.TableGrid_MainWall.RowCount - 1;
    for ii := 0 to c do Form1.TableGrid_MainWall.BestFitRow(ii);

end;

Получается такая картина:
1. Если на ПК установлен Excel и Libre Office, то экспорт нормально срабатывает в любое приложение (если в кнопке явно указать конкретное приложение - Excel или OpenOffice(Calc) )
Однако, при указании в кнопке значения "auto", открывается Excel, а не то приложение, с которым ассоциировано расширение файла xls.
Т.е. настройка "auto" - 'это не  "auto", а "Excel".
2. Если на ПК установлен только Excel, то экспорт в него работает корректно, а при попытке послать экспорт в OpenOffice(Calc), сообщает, что эта программа не установлена.
Т.е. все ОК.
3. Если на ПК Excel не установлен, а только Libre Office, то экспорт в него делается нормально, а экспорт в "Excel" или "auto" подвешивает программу где-то на минуту, а затем появляется сообщение об ошибке:  Ошибка при выполнении приложения-сервера, ProgID: "Excel.Application".
Проверить, как это работает на других ПК без установленного Excel пока не могу.
...
Очевидно, ошибка возникает в момент создания объекта Excel.Application, поскольку его на ПК нет.
...
Таким образом, во-первых, кнопка экспорта в режиме auto должна открывать то приложение, с которым ассоциировано расширение xls.
И второе - если Excel не установлен (или ошибка создания объекта), то сообщать, что Excel не установлен.

Есть кнопка со стандартным действием "Экспорт в Excel".
В настройках кнопки указано свойство "Auto".
Для работы с таблицами установлен LibreOffice Calc. Excel не установлен.
При нажатии кнопки "Экспорт в Excel" выпадает ошибка: Ошибка при выполнении приложения-сервера, ProgID: "Excel.Application".
Если же в свойствах кнопки указать вместо auto вывод в LibreOffice Calc, то вывод работает нормально.
Как победить ошибку при установке вывода в "auto"?
У меня сетевое приложение и у разных пользователей стоят разные программы  для работы с таблицами.
Т.е. мне нужно действительно "auto" определение в какое приложение выводить данные.
Если нельзя или долго устранять ошибку, то может быть как-то можно в самом скрипте проверять, какое приложение используется на данном ПК для работы с таблицами и посылать данные в него?

У меня есть одна особенность: я использую SQL запрос с инструкцией CASE, чтобы выводить проекты со всеми статусами, если комбобокс статусов в журнале проектов стоит невыбранный.
Полный запрос в секции WHERE такой:
...
(CASE WHEN ({ComboBox_Project_Status} < 0) THEN 1=1 ELSE ( Tbl_Projects.id_Tbl_Project_Statuses = '{Edit_StatusForSQL}' ) END)
...
Но,оказывается, если у комбобокса включено свойство MultiSelect, то независимо от выбора значения комбобокса, он возвращает -1.
Т.е. надо в скрипте обязательно перебирать весь список значений комбобокса и находить выбранные пользователем.
...
А есть ли попроще способ получить значение прямо в SQL окне , обозначающее, что в комбобоксе ничего не выбрано?
Т.е. типа  "WHEN ({ComboBox_Project_Status} < 0)"  но для случая с мультиселект?

Кому интересно:
ошибка List index out of bounds (12) возникала из-за того, что в скрипте устанавливалась ширина столбцов таблицы до того момента, как таблица формировалась SQL запросом.

Есть проект, у которого может быть один из статусов (Отправлен, Согласован, Получен и т.п.). Статус устанавливается комбобоксом.
Вывожу в таблицу список проектов и делаю возможность отбора проектов по их статусу.
Т.е. на форме журнала проектов есть комбобокс, в котором можно установить отображение проектов с конкретным статусом.
Таблицу заполняю SQL запросом (автонажатие на кнопку SQL запроса при изменении комбобокса).
Отбор по статусу реализован в секции WHEREтак:
Tbl_Projects.id_Tbl_Project_Statuses = '{ComboBox_Project_Status}'
Все работает как положено.
...
Однако, возникла потребность отображать проекты сразу по нескольким статусам.
Для этого включил у комбобокса MultiSelect.
Но, теперь ничего не отображается.
Догадываюсь, что причина в том, что {ComboBox_Project_Status} содержит несколько ID и, поэтому, текст условия SQL запроса не корректный.
...
Как получить для SQL запроса выбранные пользователем ID нескольких статусов?

Умнику с ником vovka3003 скажу, что сообщение об ошибке  "выход за пределы массива" не является "максимумом".
Максимумом является сообщение "выход за пределы массива, который имеет имя такое то".
У меня реальное бизнес-приложение в 12000 строк кода.
Работают уже год в сетевом режиме десять пользователей.
Форма, которая стала выдавать ошибку имеет несколько таблиц с запросами, созданными вручную, а не конструктором.
Так что для поиска ошибки мне надо много строка закомментить, чтобы найти проблему.
Поэтому и вопрос появился - можно ли узнать имя массива, который ошибку вызывает.

Приложить проект не могу. Он на MySql. Да и свои ошибки предпочитаю находить самостоятельно.
Вопрос то был про другое - что обозначает цифра в сообщении об ошибке и можно ли получить информацию о месте возникновения ошибки.
У меня очень большой проект и ошибка может оказаться в нескольких местах. Чтобы ускорить поиск было бы неплохо в сообщении об ошибке выводить номер строки в коде или компонент, который выдает ошибку.

На рабочей базе при открытии формы со списком проектов появляется сообщение об ошибке:
List index out of bounds (12)
...
Как узнать, выполнение какого кода приводит к ошибке?
Что означает цифра 12 в скобках?