226

(7 replies, posted in Russian)

Тогда во всех формах в событии открытия можно не указывать имя формы, а просто можно написать один и тот же код TAForm(Sender).OnMouseWheel := @OnMVDMouseWheel и получится:

procedure Form1_OnShow (Sender: string; Action: string);
begin
      TAForm(Sender).OnMouseWheel := @OnMVDMouseWheel;
end;

procedure OnMVDMouseWheel(Sender: TObject; isShift, isAlt, isCtrl: boolean; WheelDelta: Integer; X, Y: Integer; var Handled: Boolean);
begin
    if TAForm(Sender).ActiveControl is TdbComboBox then Handled := True;
end;

Спасибо!

Над широким полем ввода размещаю надпись. Чтобы разместить ее точно по центру растягиваю рамку надписи на всю ширину поля ввода. Т.е. начало рамки - у левого края поля ввода, конец рамки - у правого края поля ввода. Сам текст надписи намного короче, чем растянутая рамка надписи. Включаю у надписи свойство Aligment = taCenter. Надпись успешно встала по центру. Закрываю проект и открываю его вновь - текст надписи съехал влево, а рамка надписи уменьшилась до ширины текста. Т.е. при сохранении проекта левый край рамки сохранился, а ширина рамки надписи не сохранилась. Как решить проблему?

Просьба доработать программу, чтобы появилась возможность автосохранения разрабатываемого проекта через указываемый интервал времени. Т.е. программа сама должна выполнять действие, эквивалентное нажиманию на дискету в меню. По непонятной причине сегодня комп ушел в синий экран, а результат работы за полдня оказался не сохранен. Кстати, если будет автосохранение, то вместе с бесплатной программой xStarter, можно запросто организовать архивирование каждой стадии проекта, что дает возможность отката разработки назад.

230

(7 replies, posted in Russian)

Я перефразирую свой вопрос:

Есть скрипт, которым можно заблокировать прокрутку значений в ComboBox-ах:

procedure Form1_OnShow (Sender: string; Action: string);
begin
    Form1.OnMouseWheel := @OnMVDMouseWheel;
end;


procedure OnMVDMouseWheel(Sender: TObject; isShift, isAlt, isCtrl: boolean; WheelDelta: Integer; X, Y: Integer; var Handled: Boolean);
begin
    if Form1.ActiveControl is TdbComboBox then Handled := True;
end;

В процедуре OnMVDMouseWheel имя формы "Form1" указано в явном виде.
Есть ли способ, чтобы избавиться от явного указания имени формы "Form1"?
как послать в OnMVDMouseWheel переменную, которая содержит имя формы "Form1"?

Т.е. надо чтобы было так: if Переменная_с_именем_формы.ActiveControl is TdbComboBox then Handled := True;

231

(7 replies, posted in Russian)

Мне нужно в отдельную процедуру послать имя формы. Как получить имя формы?

Есть таблицы "Контрагенты" и "Контактные лица.
Для добавления и редактирования контрагента есть форма "Контрагент" с tablegrid контактных лиц.
Для добавления и редактирования контактного лица есть форма "Контактное лицо".
На форме "Контактное лицо" есть ComboBox с наименованием контрагента.
Добавляю нового клиента и не сохраняя его в БД нажимаю на кнопку "Добавить контактное лицо", чтобы сразу для этого нового клиента добавить новое контактное лицо.
Программа сама неявно (т.е. без доп.программирования) записывает нового контрагента в БД и открывает форму "Контактное лицо", где в комбобоксе контрагентов уже есть только что добавленный клиент, что позволяет записать новое контактное лицо этого контрагента. Однако, при открытии этой формы комбобокс контрагентов стоит в невыбранном положении и нужного контрагента надо выбрать из выпадающего списка.
Мне же надо, чтобы при открытии формы в комбобоксе был сразу выбран только что созданный контрагент. Каким  образом получить id неявно добавленного контрагента до открытия формы контактного лица, чтобы передать это значение в комбобокс контрагентов?

Есть таблица "Пользователи" с полем "Фамилия".
Есть таблица "Сообщения" с полями "Отправитель" и "Получатель".
Оба этих поля имеют связь с таблицей "Пользователи".
Т.е. в таблице "Сообщения" имеются две связи на одну и ту же таблицу "Пользователи", чтобы записывать отдельно отправителя и отдельно получателя.
При составлении сообщения Фамилия отправителя и фамилия получателя выбираются из двух разных комбобоксов.
Соответственно, в таблице "Сообщения" сохраняются только id пользователей (отдельно для отправителя и отдельно для получателя).
При настройке вывода в TableGrid надо вывести фамилию и отправителя и получателя. Для этого, кроме вывода таблицы сообщений, добавляю вывод фамилии из таблицы Пользователей.
Однако, в TableGrid выводится только одна фамилия (отправителя), а для получателя вывести фамилию не получается.
Т.е. мастер вывода данных в TableGrid отрабатывает только одну связь с таблицей Пользователи, а вторую связь с той же таблицей не обрабатывает.
Как решить эту проблему?

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

procedure OnMVDMouseWheel(Sender: TObject; isShift, isAlt, isCtrl: boolean; WheelDelta: Integer; X, Y: Integer; var Handled: Boolean);
begin
    if Form1.ActiveControl is TdbComboBox then Handled := True;
end;

Есть форма "Список контрагентов" и "Карточка контрагента". "Список контрагентов" содержит TableGrid со списком организаций. При двойном клике на строку этого списка открывается форма "Карточка контрагента".
Наличие процедуры открытия окна карточки контрагента система обеспечивает самостоятельно автоматически. В явном виде эта процедура не указана в перечне событий для  двойного клика.
Однако, по двойному клику мне нужно выполнить другую процедуру, а не открытие карточки контрагента.
Если я подключаю к событию двойного клика мою процедуру, то сначала отрабатывается она, а потом происходит открытие формы карточки контрагента.
Можно ли отключить встроенную отработку этого события, чтобы по двойному клику отрабатывалось только моя процедура, которую я явно указал для события двойного клика?

Шикарно работает ! Спасибо !

Сохраняю файл в БД через компонент DBFile.
Однако, при выводе значения этого поля в TableGrid вместо ожидаемого названия файла ничего не отображается.
Если навести курсор на это поле в TableGrid, то появляется всплывающая подсказка с содержимым файла!
Очевидно, компонент  TableGrid выводит содержимое файла, хотя должен выводить имя файла.
А при сохранении в БД ссылки на файл или директорию - в TableGrid вообще ничего не отображается.
Просьба поправить.

Решил задачу получения пути сетевого диска из реестра с помощью класса TRegistry.
Публикую решение - может кому-нибудь окажется полезным пример работы с реестром:

procedure Form1_Btn_Read_Reg_OnClick (Sender: string; var Cancel: boolean);
  var
      Reg: TRegistry;
      RegKeyName: string;
      DiskName: string;
      RemotePath: string;
begin
  DiskName:= 'Q'; // буква имеющегося сетевого диска
  RegKeyName:= '\Network\' + DiskName; \\ ветка реестра, где лежит путь этого сетевого диска
  Reg := TRegistry.Create();
  Reg.Access:= Key_read;
  Reg.RootKey := HKEY_CURRENT_USER;
  Reg.OpenKey(RegKeyName, false);

  if (Reg.KeyExists(RegKeyName)) then
  begin
      ShowMessage ('Путь сетевого диска ' + DiskName + ' = ' + Reg.ReadString('RemotePath'));
  end
  else
  begin
      ShowMessage ('Сетевого диска с буквой ' + DiskName + ' не существует');
  end;
  Reg.CloseKey;
  Reg.free;
end;

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

1. При сохранении на локальный диск файлов вложений иногда выпадает ошибка windows из-за неправильного имени файла. Т.е. имя полученного файла недопустимо для Windows.
Как обрабатывать такую ошибку или как избежать ее появления?

2. Все 160 сообщений в моем почтовом ящике имеют ContentType: multipart/report  или multipart/related или multipart/mixed. Это означает, что тело сообщения состоит из нескольких частей - как минимум одна часть тела письма в текстовом виде, а вторая - в HTML виде. Текущая версия программы корректно получает все эти части сообщений. Однако, в одном сообщении тело сообщения в текстовом виде идет первой частью, а HTML вид - второй частью, а в другом сообщении порядок может поменяться наоборот.  Получается, что  получить, например, только текстовые виды сообщений исходя из порядка частей сообщения нельзя.
Каким образом получать тело сообщения в нужном виде (например, только в текстовом)?


3. При записи сообщений в БД надо экранировать текст почтового сообщения от нежелательных символов. Экранирует ли MVD данные самостоятельно или об этом надо самим заботиться?

4. Где можно почитать про этот компонент? Хотелось бы понять, какие еще реквизиты полученного письма можно получить.

Ругается на строке   IdPOP3: TIdPOP3; 
Пишет "Unknown type: 'TIdPOP3' at 7:18.
Очевидно библиотеки не хватает. Где ее взять и как подключить?

Есть функция GetFilesList, которая получает список файлов из директория с результатом в виде одной строки. Каким образом вывести этот список в TableGrid с отображением по одному файлу на каждой строке таблицы?

Пользователи работают в сетевой версии написанной программы. В базу сохраняют ссылки на файлы, лежащие в локальной сети на сервере. У каждого из пользователей этот сервер подключен как сетевой диск, но буквы сетевого диска у пользователей не совпадают. Т.е. у одного пользователя имеется диск "S" с путем \\10.0.0.1\Sales, а у другого пользователя этот же путь подключен под буквой "Q". Когда один пользователь сохранил в БД ссылку "S:\Filedir1", то другой пользователь открыть эту папку не может, т.к. такого сетевого диска у него нет. Вопрос: как получить абсолютный путь сетевого диска? Если это невозможно скриптом, то может быть можно получить данные из ветки реестра HKEY_CURRENT_USER\Network, где указаны все сетевые диски пользователя и пути к ним?

Да, отлично все работает!

Можно ли как-то в ComboBox отключить прокрутку списка значений колесом мыши, когда ComboBox закрыт? Если фокус стоит на комбобоксе, то стоит случайно прокрутить колесо мыши и значение меняется. Если комбобоксов на форме несколько, то уследить за их случайным изменением невозможно. Очень неудобно. Приходится пользователям объяснять, что надо "не дышать" на комбобоксы. В 1С, например, в выпадающих списках прокрутки вообще нет. Просто кликаешь на выпадающий список, он открывается, а затем кликаешь на нужное значение и список закрывается с установкой выбранного значения. Очевидно, к ComboBox надо добавить свойство "MouseWheel" или добавить события  OnMouseWheelDown
OnMouseWheelUp, чтобы можно было скриптом побороть прокрутку (хотя первый вариант более простой в использовании).

Да, лицензию я сегодня приобрел после того, как Вы пообещали в течение недели реализовать получение почты smile  Кстати, просьба обратить внимание на необходимость корректно обрабатывать различные кодировки писем и случаи, когда письмо в HTML формате.

Да, вопрос актуален. Также, он касается и вывода чисел "деньги" в таблице. Однако, пока Вы были в отпуске у меня закончился триальный период. Можно как-то дней на 10 еще продлить пробный период? Пока еще не все моменты ясны, чтобы понять, подойдет ли это ПО для наших задач. Кстати, есть ли возможность получать письма по протоколу POP3? Отправка писем понятна, а вот получение - проблема. Очень нужна такая возможность, даже если много кода написать придется.

Каким образом в Combobox сделать так, чтобы числа (Деньги) отображались с разделением разрядов (пробел) и с двумя знаками после запятой? Например, число 92234.10 отображается как "92234.1", а надо "92 234.10"