Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Обновление объекта АктивИкс (число прочтений - 1459 )
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 247
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Обновление объекта АктивИкс
25. Марта 2019 :: 05:52
Печать  
Разрабатывается Класс "СтатусБар" где предусмотрена возможность наличия графического элемента "СкроллБар". Требуется визуальное наблюдение процесса. Обычно некий цикл некого действия, например:

Код
Выбрать все
// заполнить таблицу значениями из книги
	Sheet = Excel.Sheets.GetValue(1);
	ВсегоСтрок = Sheet.Cells(1, 1).SpecialCells(11).Row;
	СтатусБар.РазмерШкалы = ВсегоСтрок;
	for i = 2 to ВсегоСтрок do
		TzData.NewLine();
		for ii = 1 to ColList.GetListSize() do
			ExcelValue = Sheet.Cells(i, ColList.GetValue(ii).NomColumn).Value;
			if ii = 1 then
				if EmptyValue(ExcelValue) = 1 then
					TzData.DeleteLine();
					break;
				endif;
			endif;
			TzData.SetValue(TzData.LinesCnt(), ColList.GetValue(ii).ID, ExcelValue);
		enddo;
		СтатусБар.УстановитьПрогресс(i);
	enddo;
	СтатусБар.ЗакрытьПрогресс();
 


В этом примере мы обращаемся к книге Excel и всё в порядке, всё красиво и все видим, но если в этом цикле закомментировать само обращение к листу Excel, то, всё, обновления отображения прогресса не происходит. Т.е. если мы поставим скроллбар к заполнению некой таблицы значений или базы данных визуального обновления объекта не происходит и прогресса не видно. Не помогают ни Форма.Обновить(), ни РасширениеФормы.Обновить().

Сам процесс прогресса в классе выгядит следующим образом:

Код
Выбрать все
// +++- recop --- 190322 --------------------------------------------------------------
procedure УстановитьПрогресс(Value) export
	var Width,Percent;

	if Value < РазмерШкалы then
		Width = Окр((IVr.ProgressBar.Width * Value) / РазмерШкалы);
		Percent = Окр((100*Value) / РазмерШкалы); 
	else
		Width = IVr.ProgressBar.Width;
		Percent = 100;
	endif;

	IVr.ProgressBar.GflAX.NewBitmap(IVr.ProgressBar.Width, IVr.ProgressBar.Height, ЦветФона);
	IVr.ProgressBar.GflAX.DrawFillRectangle(0, 0, Width, IVr.ProgressBar.Height);
	IVr.ProgressBar.GflAX.TextOut(String(Percent)+"%", Int(IVr.ProgressBar.Width/2-20), 1, ЦветШрифта);
	objProgressBar.ПоказатьКартинку(IVr.ProgressBar.GflAX, "");

endprocedure // УстановитьПрогресс()
 


Может кто подскажет как решить эту проблему?
« Последняя редакция: 25. Марта 2019 :: 21:26 - recop »  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Обновление объекта АктивИкс
Ответ #1 - 25. Марта 2019 :: 13:01
Печать  
Попробуй класс от chessman - http://www.1cpp.ru/forum/YaBB.pl?num=1302601464/0#0
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 247
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: Обновление объекта АктивИкс
Ответ #2 - 25. Марта 2019 :: 21:04
Печать  
alyuev писал(а) 25. Марта 2019 :: 13:01:
Попробуй класс от chessman - http://www.1cpp.ru/forum/YaBB.pl?num=1302601464/0#0

Что-то не могу запустить:  Ошибка выполнения Microsoft VBScript: Несоответствие типа: 'Wrap.SendMessage'.
Может на Win7 не идет?

В общем, по моим наблюдениям, обращение к форме происходит после завершения работы процедуры в котором это обращение инициализировано. Обновление исключено или не предусмотрено (в рамках 1с77) во время выполнения процедуры (много раз в этом убеждался), т.е. все обращения к форме откладываются на конец выполнения всех операций в процедуре. Обращаясь к "Excel.Application, каким-то образом, сей принцип нарушается. и во-время или сразу после выполнения Sheet.Cells происходит обращение к вызывающей форме.
Я извиняюсь, выше писал что РасширениеФормы.Обновить() не помогает. Очень даже помогает, но форма начинает мелькать так, что становитя темно-серым изображением, но не всегда. Очень-очень редко мелькания пропадают, что говорит о нестабильности метода.

РасширениеФормы.Обновить():


Excel.Application:
« Последняя редакция: 26. Марта 2019 :: 05:43 - recop »  
Наверх
 
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 247
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: Обновление объекта АктивИкс
Ответ #3 - 26. Марта 2019 :: 06:42
Печать  
Короче решил так. Положил в папку конфигурации пустой файл excel и на протяжении всего цикла читаю значение 1 колонки 1 строки:
                         ExcelValue=Excel.Sheets.GetValue(1).Cells(1,1).Value;
Всё! Очень довольный хотя я думаю, что есть более достойное решение.

Результат:
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Обновление объекта АктивИкс
Ответ #4 - 26. Марта 2019 :: 07:55
Печать  
Можно попробовать использовать метод ЗапретитьОбновлениеОкна() при загрузке. По окончании загрузки разрешить обновление и обновить форму.
Только осторожней с этим методом.
  

FormEx developer
Наверх
www  
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 247
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: Обновление объекта АктивИкс
Ответ #5 - 26. Марта 2019 :: 09:03
Печать  
АЛьФ писал(а) 26. Марта 2019 :: 07:55:
Можно попробовать использовать метод ЗапретитьОбновлениеОкна() при загрузке. По окончании загрузки разрешить обновление и обновить форму.
Только осторожней с этим методом.


Не совсем понял суть, но все равно попробовал без результатно.
  
Наверх
 
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 247
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: Обновление объекта АктивИкс
Ответ #6 - 27. Марта 2019 :: 17:04
Печать  
Что-то я раздувался и решил не читать значение, а записывать в созданный и, ещё, не сохраненный файл. Получилось!

Код
Выбрать все
  ...
  Excel=СоздатьОбъект("Excel.Application");
  Excel.DisplayAlerts=0;
  Книга=Excel.WorkBooks.Add();
  Лист=Книга.WorkSheets(1);
  ...
  for ii=1 to Текст.КоличествоСтрок() do
    ...
    Лист.Range("A1").Value=1;
    ...
  enddo;
  ... 
 



Работает! Форма обновляется в цикле при каждом обращении к методу Range(). При этом нет нужды создавать файл пустышку. Эх, не хватило мозгов разработчикам при  создании метода Обновить() при работе с формой.
Единственный недостаток иметь установленный MS Excel.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать