Обработчик нужно подключить, тоже скриптом:

begin
  frmMain.OnCloseQuery := @frmMain_OnCloseQuery;
end.
vit007 wrote:

А такой

procedure frmMain_OnCloseQuery (Sender: TObject; var CanClose: Boolean);

процедуры нет в свойствах формы версии 5,5...

Не все существующие обработчики событий присутствуют в редакторе свойств компонент.


Данную процедуру нужно добавить не через свойства формы, а непосредственно в редакторе скриптов.

Первый момент:

procedure frmAddNote_Button4_OnClick (Sender: TObject; var Cancel: boolean);
begin
    //Проверка на заполнение полей
    if (frmAddNote.Edit1.Text='') then 
    begin
      ShowHint(frmAddNote.Edit1, 'Обязательное поле');
      Cancel := False;
    end
    else
      //Сохранение
      frmAddNote.Button1.Click;
end;

Для предотвращения закрытия главной формы нужно использовать другой обработчик, добавьте этот код в скрипт:

// обработчик запроса на закрытие формы
procedure frmMain_OnCloseQuery (Sender: TObject; var CanClose: Boolean);
begin
  if MessageBox('Вы действительно хотите выйти?','Подтверждение',MB_YESNO+MB_ICONQUESTION) = IDNO then
    CanClose:= False;
end;
Pr0shka wrote:

Здравствуйте.
Меняю платформу с windows на Macc OS. Не хочу заморачиваться сторонним софтом, наподобии виртуальных машин с виндой и т.д.
Хочу перенести всю базу программы (а в ней данные за несколько лет) в интернет.
Подскажите пожалуйста, Если есть возможность то с инструкциями по пунктам, как это можно осуществить?

Попробуйте Wine. На MacOS не проверял, но под линуксом MVD нормально работает через эту прослойку.

Все формы проекта создаются при запуске автоматически, в одном экземпляре. Также автоматически они разрушаются при завершении приложения. В процессе работы приложения меняется только видимость форм.

1,206

(14 replies, posted in General)

Make this change in your project:

procedure Form1_TableGrid1_OnCellClick (Sender: TObject; ACol, ARow: Integer);
begin
  ShowMessage(Form1.TableGrid1.Cells(1,ARow));
end;

1,207

(5 replies, posted in General)

You can change the transparency of the main form when opening child ones. Configure the button to open the window, and then add the code:

procedure MainForm_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
  MainForm.AlphaBlendValue := 125;
  MainForm.AlphaBlend := true;
end;

procedure MainForm_Button1_OnAfterClick (Sender: TObject);
begin
  MainForm.AlphaBlend := false;
end;

http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=5729&download=0

1,208

(9 replies, posted in Russian)

abc52 wrote:

Спасибо  Dmitry.

А как тогда можно определить номер первой (или последней)

не выделенной строки  на текущей странице в TableGrid  ?

Номер первой отображаемой строки находится в свойстве VertScrollBar.Position, нумерация с нуля.

sibprogsistem wrote:

ошибка, может я не правильно сохраняю документ?

procedure FrmHelp_RichEdit1_OnChange (Sender: TObject);
begin
  SQLEXecute('UPDATE  help SET richDescription= "'+FrmHelp.RichEdit1.TextRTF+'" WHERE id=' + FrmHelp.TreeView1.sqlValue);
end;

http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=5698&download=0

Какого типа поле "help.richDescription" ?  Судя по вашему запросу - TEXT. В этом случае вам понадобится экранирование служебных символов, содержащихся в свойстве TRichEdit.TextRTF - функция Escape_special_characters()


Если тип поля FILE (BLOB), то вам понадобится ваше же решение, через Form1.SQLConnection.Execute(sSQL, Params);  - http://myvisualdatabase.com/forum/viewt … 080#p32080


Но, как мне кажется, проще использовать для сохранения стандартные возможности MVD - компонент TRichEdit  и правильно настроенную кнопку "СОХРАНИТЬ"

sibprogsistem wrote:

нужна возможнасть создание собственных гиперссылок на компоненты в RichEdit

вижу это так

procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
  Form1.RichEdit1.HiperLinkWrite(Form1.RichEdit1.GetSelText,Form1.TreeView.SelectedRow:=1;)
end;

где
1.Текст к которому присваевается ссылка
2.Действие ссылки

Тогда уж лучше добавить обработчик на событие

Form1_RichEdit1_OnHyperLinkClick( Sender: TObject; Link: string )

в котором можно делать то, что нужно.

Или что-то подобное уже реализовано?

1,211

(8 replies, posted in Russian)

sibprogsistem wrote:

что за Results?

Экземпляр TDataSet. Это  для примера.

Важно:

1. Очистка параметров:

Form1.frxReport.Variables.Clear;

2. Добавление параметра и его  значения:

Form1.frxReport.Variables['Name'] := '''Value''';

1,212

(8 replies, posted in Russian)

как передать компонент поиска скриптом?

Form1.frxReport.Variables.Clear;
// группа параметров
Form1.frxReport.Variables[' ' + 'Seller'] := Null; 
// параметры и значения
Form1.frxReport.Variables['Name'] := ''''+ Results.FieldByName('Name').AsString +''''; 
Form1.frxReport.Variables['AddressLegal'] := ''''+ Results.FieldByName('AddressLegal').AsString +'''';

1,213

(6 replies, posted in Russian)

Возможно, при установке сервера вы не использовали опцию "Use Legasy Autentication Method..."


http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=5653&download=0


Тут можно посмотреть пошаговую инструкцию установки сервера: https://docs.google.com/document/d/1jch … -MR4Q/edit

Добавлю свои пять копеек про радиогруппы: да, в дизайнере самих радиокнопок не будет видно, как не видно заполненного выпадающего списка у ComboBox.  По сути, это тот же выпадающий список, только он выпадает сразу и остаётся выпавшим навеки )))).  А вместо чек-бокса у него радиобатон.  Настройки такие же, как у Combobox.

http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=5634&download=0


On July 9, 1816, Argentina declared independence from Spain. In honor of this significant date, the cost of the basic course was reduced to $79.


https://vk.com/createmyvisualdatabaseap … 09%2Fquery

Редкое сочетание: пират-чайник ))))

https://images4-b.ravelrycache.com/uploads/HandMadeAwards/32078375/PIRATE-TEA-026_medium2.jpg

Но это легко исправить! Воспользуйтесь летним предложением: купите лицензию и получите базовый курс обучения в подарок:

https://vk.com/createmyvisualdatabaseap … 1642664_54

Отношение "Многие-ко-многим" строится через кросс-таблицу.

http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=5627&download=0


Рекомендую пройти базовый курс обучения: https://vk.com/@createmyvisualdatabasea … nyi-uroven Данная тема рассматривается на третьем занятии ("Реляционные базы данных")

vovka3003, Кому костыль, а кому - решение ))) 


Раньше не обращал на это внимание, да и клиенты не жаловались, но, признаюсь, решение повышает удобство работы. Возьму к себе в копилочку. Спасибо!


P.S. пожалуй, надо добавить проверку свойства TdbDateTimePicker.Kind,  так как данный компонент используется и для ввода времени.  В этом случае либо не устанавливать обработчик, либо добавить формат для времени.

mikhail_a wrote:

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


Form1.TabSheet1.Visible := false;

т.е. в скрипте задаётся путь не по Parent, а по Owner, а все компоненты принадлежат форме

Andrei wrote:

Спасибо работает.

Вот только все таки хотелось бы результаты id выполнения процедуры frmAddSch1_Button1_OnAfterClick при создании новой записи ( '+IntToStr(frmAddSch1.Button1.dbGeneralTableId)
получить в переменную, которую в дальнейшем использовать для расчетов.


procedure frmAddSch1_Button1_OnAfterClick (Sender: TObject); 
var
  tmpNewID:integer; // переменная для хранения добавленного значения
begin 
    if frmAddSch1.Tag = 1 then // условие выполняется при создании новой записи
    begin 
        tmpNewID := frmAddSch1.Button1.dbGeneralTableId;
        SQLExecute ('INSERT INTO res (id_sch) VALUES ( '+IntToStr(tmpNewID));    
        // далее - ваш код
    end;
end;

Возможно, нужное вам решение есть в примерах, описанных в цикле статей о программировании в MVD:  https://vk.com/@createmyvisualdatabasea … mmirovanie

L10n. Internationalization


https://sun9-28.userapi.com/c852224/v852224098/1447a4/Z95cCs4rrSA.jpg


Continuation of the article "L10n. Origin"dedicated to the localization of the application.https://vk.com/@createmyvisualdatabasea … nalization


Dear readers!


I would appreciate your comments. It is very important for me to know your opinion on both the content of the articles and the orientation of the development of the educational project. Please, write in the comments what you think of this article. What more would you like to know about MVD programming? In the next article, I plan to consider an alternative internationalization option for a project in which localized resources are located in a database. Or is there more relevant information on the localization tool for existing projects? Waiting for your answers smile

1,223

(7 replies, posted in Russian)

Не первая тема на эту тему и, видимо, не последняя )))  Выходит, что правильней всего не хранить пароль подключения к базе в самой программе. Но тогда встаёт вопрос создания и управления пользователями на сервере MySQL силами приложения, созданного в MVD, правами доступа и всё такое )))

LL10n. Origin


https://pp.userapi.com/c855036/v855036155/6575a/uCBmaUb2Dlc.jpg


If you want to create universal applications, sooner or later, you will think about its location. Since My Visual Database does not have built-in tools for this purpose, you will need to develop your own system to get the desired result.


The system must be simple and not need to modify the applications for its implementation. One of the key requirements is also the ability to change languages at any time.


Thus, in addition to the language resource preparation tool, we need a script that will load these resources.

Read the full article: https://vk.com/@createmyvisualdatabasea … 10n-origin

У меня есть пример создания меню из данных, хранимых в БД. Пример довольно сложный, описание здесь: https://vk.com/@createmyvisualdatabaseapp-menu  в конце описания - ссылка для скачивания проекта.

Собственно, построение меню идёт в процедуре LoadMenu(). Меню создаётся на форме frmMain.

procedure LoadMenu;
var
  tmpMainMenu: TMainMenu;
  tmpDataSet:TDataSet;
  tmpSQL:string;
  tmpMenuItem: TMenuItem;
  tmpParentStack: array[1..MAX_MENU_LEVEL+1] of TMenuItem; // стек для хранения родительских элементов при создании главного меню
  tmpLevel: integer;
begin
  tmpMainMenu := TMainMenu.Create(frmMain);
  frmMain.Menu := tmpMainMenu;
  // запрос формируется с учётом прав пользователя
  tmpSQL :=
  ' select menu_.* , object_.name as object_name '+
  ' from menu_'+
  ' left join object_ on object_.id = menu_.id_object_';
  // если роль указана, то добавляем фильтр по роли:
  if RoleID <> 0 then
    tmpSQL := tmpSQL +
    ' left join role_object_ on role_object_.id_object_ = object_.id'+
    ' where (menu_.id_object_ is null) or (role_object_.id_role_ = '+inttostr(RoleID)+' )';
    // сортировка обеспечивает правильность сборки дерева
  tmpSQL := tmpSQL + ' order by order_num';
  //
  SQLQuery(tmpSQL,tmpDataSet);
  while not tmpDataSet.EOF do
  begin
    tmpMenuItem := TMenuItem.Create (tmpMainMenu);
    tmpMenuItem.Caption := tmpDataSet.FieldByName('name').asString;
    tmpMenuItem.Tag := tmpDataSet.FieldByName('id').asInteger;
    // если указан объект, то подключаем обработчик
    if not tmpDataSet.FieldByName('id_object_').isNull then
      tmpMenuItem.OnClick := @MainMenuClick;
    tmpLevel := tmpDataSet.FieldByName('level').asInteger;
    //
    if tmpLevel = 0 then
    begin
      tmpMainMenu.Items.Add(tmpMenuItem);
    end
    else
    begin
      tmpParentStack[tmpLevel].Add(tmpMenuItem);
    end;
    // записываем в стек текущий элемент как родителя для следующего уровня
    tmpParentStack[tmpLevel+1] := tmpMenuItem;
    // переходим к следующей записи
    tmpDataSet.Next;
  end;
  tmpDataSet.Free;
end;