Показать сообщение отдельно
Старый 15.08.2006, 20:39   #2  
Владимир Максимов_imported is offline
Владимир Максимов_imported
Участник
 
33 / 10 (1) +
Регистрация: 20.01.2004
Возможно то, о чем я здесь напишу и так все знают, но я столкнулся с некоторыми проблемами при использовании данного метода.

1) Если в качестве параметра передается объект TextBuffer в который вообще ничего не записано (не пустая строка, а именно вообще ничего), то получим исключение на команде PastSpecial. Поэтому стоит добавить проверку на размер TextBiffer

2) Насколько я понимаю, логика работы с буферами в Windows примерно следующая: если в данный момент осуществляется заполнение буфера обмена, то команда, данная из другого приложения на заполнение буфера обмена будет проигнорирована.

На практике, это означает примерно следующее:

-) Пользователь запустил отчет и пока отчет готовит данные переключился на другое приложение.
-) В этом другом приложении он дал команду на копирование буфера (Ctrl+C)
-) В этот момент AXAPTA начала выполнять метод insertText() и попытка что-то добавить в буфера обмена была отвергнута
-) Последующая команда PastScpecial вызвала исключение и отчет не был сформирован

В качестве решения, я "зациклил" попытку вставки. В результате, получился примерно такой код

Код:
public void insertText(BookMark _bookMark, TextBuffer _text, int _workSheet = 1)
{
	COM		 XLSWorkSheet, XLSrange;
	TextBuffer  tempBuffer;			 // To store clipboard contents
	int		 nextI,
				maxI = 3;
   ;

	// Если содержимое TextBuffer вообще не введено, то PastSpecial даст ошибку,
	// а если заведена пустая строка, то нет смысла делать PastSpecial
	if (! _text.size())
	{
		return;
	}

	// Initializing XLSWorkSheet object
	XLSWorkSheet	= this.getWorkSheet(_workSheet);
	if (!XLSWorkSheet)
	{
		throw error("@DIS6043");
	}

	// Initializing XLSRange object
	XLSrange		= this.findRange(_bookMark,_workSheet);
	if (!XLSrange)
	{
		throw error("@SYS27391");
	}
	XLSrange.select();

	for (nextI = 1; nextI <= maxI; nextI++)
	{
		try
		{
			// Storing clipboard contents
			tempBuffer = new TextBuffer();
			tempBuffer.fromClipboard();

			// Preparing text to be inserted
			_text.toClipboard();

			// Inserting text from clipboard
			XLSWorkSheet.pasteSpecial(1); // 1 - "Text only" mode

			// Restoring clipboard contents
			tempBuffer.toClipboard();

			// В случае успеха, прерываю цикл
			break;
		}
		catch(Exception::Error)
		{
			// в случае ошибки удаляю последнюю строку infolog,
			// которая генерится автоматически ошибкой COM
			if (infolog.line())
			{
				infolog.clear(infolog.line()-1);
			}
			// предпринимаю очередную попытку сделать вставку через буфер
		}
	}   // for (nextI)

	// Если выход из цикла for произошел "штатно", то значение счетчика будет больше максимально допустимого значения
	if (nextI > maxI)
	{
		throw error("Ошибка при копировании данных через буфер обмена.");
	}
}