Закрыть Terrasoft

Можно как-то закрыть приложение Terrasoft командой из модального окна? Например есть задача - запускается Terrasoft и открывает в модальном режиме окно с которым будет работать пользователь, должно быть только две кнопки - Сохранить и Закрыть, по нажатию на кнопку Закрыть всё приложение должно закрыться.

Нравится

12 комментариев

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

Создайте обработчик события OnClose в Вашем окне, и вставьте в него такой текст:

var MainWindow = Connector.Attributes('MainWindow');
MainWindow.Close();

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

function wnd_ContactEditOnClose(Window) {
	wnd_BaseDBEditOnClose(Window);
	var MainWindow = Connector.Attributes('MainWindow');
	MainWindow.Close();
}

В скрипте scr_Main, в функции

1 function CloseMainForm() {
2    wndWorkspace.Window = System.EmptyValue;
3	var Keys = (new VBArray(Main.Workspaces.Keys()).toArray());	
4	for (var i in Keys) {
5		var Key = Keys[i];		
6		Services.SerializeItemToProfile(Main.Workspaces(Key), EmptyStr);		
7	}
8	ClearTemporaryFiles();	
9}

на 6-й строке выдает сообщение "Ошибка выполнения Microsoft JScript: Несоответствие типа"
При этом Key содержит строковое значение, которое является названием окна одного из разделов.

Попробуйте закрыть программу, очистить профиль и проверить снова. При реализации у меня такой проблемы не возникало.

а что значит - очистить профиль?

В строке "Выполнить" меня "Пуск" впишите %appdata%, войдите в директорию Terrasoft/версия и удалите папку Profile и Cache.

Удалить всё из папки Profile (обычно хранится в каталоге ..\Application Data\Terrasoft\ текущего пользователя, если профиль не хранится в базе) или всё, что касается текущего пользователя из таблицы tbl_ProfileData, если профиль хранится в базе данных.

не помогло...
попробую описать работу функции CloseMainForm(), так как мне смутно кажется эта работа подозрительной:

первая строка - wndWorkspace.Window = System.EmptyValue;
здесь wndWorkspace.Window = wnd_Workspace_1

строка два - var Keys = (new VBArray(Main.Workspaces.Keys()).toArray());
здесь Keys получает два элемента массива - [0] = wnd_Workspace_1 и [1] = wnd_Workspace_2

строка шесть - Services.SerializeItemToProfile(Main.Workspaces(Key), EmptyStr);
когда Key имеет значение wnd_Workspace_1 всё проходит нормально, когда Key получает значение wnd_Workspace_2 вылетает описанная выше ошибка...

Получается объекту wnd_Workspace_1 присвоено значение null, т.е. объект уничтожен, а объекту wnd_Workspace_2 значение null не присваивалось...

Прокомментируйте, пожалуйста, следующее:

"SSV" написал:здесь wndWorkspace.Window = wnd_Workspace_1

wnd_Workspace_1 - это объект, или строка? Насколько я понимаю, в последующем тексте Вы упоминаете wnd_Workspace_1 и wnd_Workspace_2 как строковые значения, а не объекты.

Данные разделы являются базовыми, или созданы Вами? Для них определены события OnProfileSerialize и OnProfileDeserialize?

Возможно, поможет переписать функцию следующим образом:

function CloseMainForm() {
    wndWorkspace.Window = System.EmptyValue;
       var Keys = (new VBArray(Main.Workspaces.Keys()).toArray());     
       for (var i in Keys) {
               var Key = Keys[i];
               var Workspace = Main.Workspaces(Key);
               if (Workspace) {
			Services.SerializeItemToProfile(Workspace, EmptyStr);
               }                
       }
       ClearTemporaryFiles();  
}

я вот думаю - без активизации моего модального окна всё работает, может это с ним что-то не так?

Спасибо, Олег, помогло изменение функции...

Показать все комментарии