продолжаем детектив... если в примере test2 от sibprogsistem повесить события на OnClick, то происходит вылет программы с неизвестной ошибкой
таким образом, у меня складывается впечатление, что есть какой-то баг в MVD...

фигня война... пошел целый детектив... судя по всему, я случайно заюзал имена какой-то MVD-шной переменной... после переименования checkbox'ов вылеты и сообщения об ошибках исчезли. и даже на OnClick все заработало:

procedure frmMeasurement_cbAllMeasurement_OnСlick (Sender: TObject; var Cancel: boolean);
begin
  frmMeasurement.cbAllMeasurement.State := cbChecked;
  frmMeasurement.cbMonthMeasurement.State := cbUnchecked;
end;

procedure frmMeasurement_cbMonthMeasurement_OnClick (Sender: TObject; var Cancel: boolean);
begin
  frmMeasurement.cbMonthMeasurement.State := cbChecked;
  frmMeasurement.cbAllMeasurement.State := cbUnchecked;
end;

однако... стоит выбрать второй чек-бокс, который cbAllMeasurement, то как ты ни нажимай на cbMonthMeasurement, больше галочка со второго чек-бокса не снимается, при этом снимается-ставится последовательно галочка на самом cbMonthMeasurement

sibprogsistem wrote:

попробуйте удалить базу данных и dll от него, мне тногда помогает

не помогло

А если реализовывать через CheckBox.State, то кусок кода:

procedure frmMeasurement_cbAllTime_OnMouseUp (Sender: TObject; var Key: Word; Shift, Alt, Ctrl: boolean);
begin
  frmMeasurement.сbForMonth.State := cbUnchecked;
  frmMeasurement.cbAllTime.State := cbChecked;
end;

procedure frmMeasurement_сbForMonth_OnMouseUp (Sender: TObject; var Key: Word; Shift, Alt, Ctrl: boolean);
begin
  frmMeasurement.cbAllTime.State := cbUnchecked;
  frmMeasurement.сbForMonth.State := cbChecked;
end;

вызывает следующее сообщение с ошибкой:

Сигнатура проблемы:
  Имя события проблемы:    APPCRASH
  Имя приложения:    Monitoring.exe
  Версия приложения:    1.0.0.0
  Отметка времени приложения:    5b6ac81b
  Имя модуля с ошибкой:    ntdll.dll
  Версия модуля с ошибкой:    6.1.7601.23572
  Отметка времени модуля с ошибкой:    57fd02d3
  Код исключения:    c0000005
  Смещение исключения:    0002ed2a
  Версия ОС:    6.1.7601.2.1.0.256.1
  Код языка:    1049
  Дополнительные сведения 1:    e8ad
  Дополнительные сведения 2:    e8adce1c2b9e7be834b4063ac3c53863
  Дополнительные сведения 3:    e8ad
  Дополнительные сведения 4:    e8adce1c2b9e7be834b4063ac3c53863

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
  http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0419

Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
  C:\Windows\system32\ru-RU\erofflps.txt

теперь какой-то
---------------------------
Monitoring
---------------------------
List index out of bounds (5)
---------------------------
ОК   
---------------------------
выскакивает при нажатии на эти чек-боксы... меня уже клинит...

какой список? какие индексы на чек-боксе? хз...

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

интересно... а зачем еще и на MouseUp вешать?..

82

(17 replies, posted in Russian)

хм... интересно... спасибо за костыль)

83

(17 replies, posted in Russian)

так в том-то и дело, что в грид у меня настраивается вывод данных по умолчанию через свойства в инспекторе объектов в самой IDE... а фильтра уже меняют его состояние и наполнение. в том числе - меняют местами столбцы и даже другие столбцы добавляют. в том-то весь и прикол - вернуть грид в состояние "по умолчанию".

есть на форме два взаимосвязанных чек-бокса, смысл: выбран может быть только один из двух. реализовано это так через OnClick:

procedure frmMeasurement_cbAllTime_OnClick (Sender: TObject);
begin
  frmMeasurement.сbForMonth.Checked := False;
  frmMeasurement.cbAllTime.Checked := True;
end;

procedure frmMeasurement_сbForMonth_OnClick (Sender: TObject);
begin
  frmMeasurement.cbAllTime.Checked := False;
  frmMeasurement.сbForMonth.Checked := True;
end;

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

85

(17 replies, posted in Russian)

то есть надо тогда заполнять грид в исходное состояние при помощи скрипта и SQL-запроса?

так... а если у меня кнопка не имеет никакого действия?..

при формировании отчета через кнопку с действием "отчет" предлагается выбор в чем открыть сформированный отчет - в превью, в дизайнере, в экселе, в ворде, в опен офисе, выгнать в pdf или html или даже в картинку формата tiff или jpeg
собственно, вопрос: как можно назначить то, в чем будет открыт отчет, средствами скрипта?

88

(17 replies, posted in Russian)

есть две формы - главная и вторичная. на второй форме есть грид. на событии OnShow второй формы висит код типа:

 var tgMeasurementSQLQuery: string;
...
tgMeasurementSQLQuery := frmMeasurement.tgMeasurement.dbGetSQLStatement;
ShowMessage(tgMeasurementSQLQuery);

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

89

(2 replies, posted in Russian)

О как... Не знал, спасибо.

90

(2 replies, posted in Russian)

Че-то туплю совсем уже...
Есть строка формата "yyyy-MM-DD 00:00:00.0000" (например, "2018-03-23 00:00:00.0000"), так вот при выполнении этого кода:

settingDate := SQLExecute('SELECT settingDate FROM GroupPileList WHERE id=' + id_GroupPileList);  // получаем settingDate  // получили строку с датой
 //settingDate := StringReplace(settingDate, '-', '/');
fDate := StrToDateTime(settingDate);  // преобразовали строку в число TDateTime
settingDate := DateToString(fDate); // преобразуем в строку вида "1 января 1970"

выскакивает ошибка, мол, Invalid date and time... какого хрена-то? чего я не учёл?

Странно... После кучи манипуляций - заработало. Но я уже не берусь воспроизвести-рассказать то, что делал)))

DriveSoft wrote:

нет, уничтожение датасетов поставьте в самый конец процедуры

Я так и сделал, однако при выдаче отчета выдается следующее:

The following error(s) have occured:
Dataset "CommitteeSettingData" does not exist
Dataset "SensorsSettingData" does not exist

что говорит о том, что уничтожение датасетов влияет на передачу данных в отчет
А вот если закомментить строки уничтожения датасетов - то все ОК.

В таком вариант - должен.

    Form1.frxReport.Variables['My Variable 2'] := ''' + frmOrder.Label25.Text + ''';

О как! спасибо большое! сам че-то не додумался...

И последний тогда вопрос:
этот код использовать только при PREVIEW MODE?

frxDBDataset_Sensors.Free;
frxDBDataset_Committee.Free;

95

(31 replies, posted in Russian)

должно быть просто last_insert_id(), без всяких переменных внутри скобочек. база данных вернет id записи, последней внесенной в БД в принципе, и не важно, в какую таблицу.

Итак, исходя из поставленной задачи, у меня получилось так:

procedure Form2_OnShow (Sender: TObject; Action: string; Key: Char);
var
  arrString: array of string; // динамический массив строк, куда мы разберем по словам, используя пробелы как разделители, большую длинную строку
  flag_R, flag_ISOorMKE: boolean; // логические переменные-флаги по наличию буквы Р и ИСО/МКЭ в длинной строке
begin
    flag_R := false;
    flag_ISOorMKE := false;
...
   arrString := SplitString(Form2.Edit3.Text,' '); // разбиваем длинную строку на слова (отдельнная буква, с двух сторон у которой пробел - тоже будет считаться словом)
   // начинаем формировать шифр ГОСТа
   Form2.Edit9.Text := arrString[0]; // первое слово ГОСТ будет всегда и в принципе; нумерация в динамическом массиве идет с 0, а не с 1
   // пошла серия проверок
   if (pos('Р', Form2.Edit3.Text) > 0) and (pos('Р', Form2.Edit3.Text) < 7) // проверяем наличие буквы Р в первых 6 символах большой строки, так как Р должно идти сразу за ГОСТ
     then flag_R := true;
   if ((pos('ИСО', Form2.Edit3.Text) > 0) and (pos('ИСО', Form2.Edit3.Text) < 11)) or ((pos('МКЭ', Form2.Edit3.Text) > 0) and (pos('МКЭ', Form2.Edit3.Text) < 11)) // проверяем наличие ИСО или МКЭ в первых 11 символах большой строки, так как они должны идти сразу за ГОСТ Р
     then flag_ISOorMKE := true;
   // циферный код ГОСТа имеется всегда в документе и будет либо вторым, либо третьим, либо четвертым словом-блоком
   // теперь отрабатываем варианты
   if (not flag_R) and (not flag_ISOorMKE) // нет ни Р, ни ИСО/МКЭ
     then Form2.Edit9.Text := Form2.Edit9.Text + ' ' + arrString[1]; // дополняем Edit9 циферным кодом
   if flag_R and (not flag_ISOorMKE) // есть Р, нет ИСО/МКЭ
     then Form2.Edit9.Text := Form2.Edit9.Text + ' ' + arrString[1] + ' ' + arrString[2]; // дополняем Edit9 буквой Р и циферным кодом
   if flag_R and flag_ISOorMKE // есть Р, есть ИСО/МКЭ
     then Form2.Edit9.Text := Form2.Edit9.Text + ' ' + arrString[1] + ' ' + arrString[2] + ' ' + arrString[3]; // дополняем Edit9 буквой Р, ИСО/МКЭ и циферным кодом
   // всё, в Edit9.Text сформированный шифр ГОСТа
end;

в Form2.Edit3.Text у нас исходная строка, в  Form2.Edit9.Text - отработанная (нужная)

Тогда давайте сделаем так... У нас формат шифра ГОСТа такой: ГОСТ <Р> <ИСО|МЭК> <циферный шифр> <полное наименование документа>.
Собственно наша задача в простейшем виде - это выделить первые два-четыре блока "блока" из длинной строки - ГОСТ <Р> <ИСО|МЭК> <циферный шифр>.
Наша задача несколько облегчается тем, что все слова/буквы/шифры разделяются пробелом. Идея моя такова, что надо тупо порезать длинную строку на слова, а взять в работу только первые два-четыре "слова", которые и будут соответствовать нашим "блокам".
Задача несколько осложняется тем, что буква Р может быть в строке, а может и не быть. Например, сравни: "ГОСТ Р 7.0.6-2008 Международный стандартный номер издания музыкального произведения (ISMN). Издательское оформление и использование" и "ГОСТ 7.85-2003 Международный стандартный номер технического отчета". Также, насколько я успел изучить формирование шифра ГОСТов, возможны приставки к «ГОСТ Р» слов «ИСО» или «МЭК», означающие, что данный нормативный документ является переводом стандарта соответствующей международной организации. Но это тоже можно учесть при "резке" строки, так как такие приставки имеют фиксированную позицию относительно других слов-"блоков".
Такая постановка задачи вас устроит?

Понятно всё с вами)

Правильно ли я понимаю, что при открытии-показе формы в Edit'ах находятся уже данные записи из таблицы БД?

в таком случае, назовите мне Edit'ы (или строковые переменные), в котором есть исходный текст и в какой надо вывести результат substring'а

В моем примере режется кусок строки с датой формата dd.mm.yy:

var fDate: TDateTime;
arrDate: array of string;
sDate: string;
begin
...
arrDate := SplitString(sDate,'.'); // получаем в переменные YY - год, MM - месяц, DD - день из даты в строке данных
DD := arrDate[0]; MM := arrDate[1]; YY := arrDate[2];
fDate := EncodeDate(StrToInt(YY),StrToInt(MM),StrToInt(DD)); // кодируем дату для записи в БД
sDate := '"'+FormatDateTime('yyyy-MM-DD 00:00:00.000', fDate)+'"'; // форматируем дату для SQL, в кавычки заключать в запросе INSERT уже не надо
...
end;

Вам, соответственно, надо порезать строковую переменную из DataPicker1 с другим разделяющим символом (видимо, -)

Приведите тогда свой кусок кода, где это происходит, например, всю procedure, в которой все это происходит