FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9112
Вход
Resizer - автомат. изменение размеров объектов на форме.

Автоматическое изменение размеров и позиций объектов (ЛЮБОЕ КОЛ-ВО, ЛЮБАЯ ВЛОЖЕННОСТЬ) пропорционально изменениям размера формы. Установка РАЗМЕРОВ ФОРМЫ в зависимости от РАЗРЕШЕНИЯ ЭКРАНА. Есть настройки. Разработано в VFP7, SP1.


 
Прислал: ElenaB   Категория: Интерфейс


Разработано в VFP7, SP1.
Последняя сборка – VFP8, SP1.

Класс Resizer библиотеки классов Resizer способен пересчитывать размеры и позиции ВСЕХ объектов ЛЮБОЙ ВЛОЖЕННОСТИ, находящихся на форме.


Возможности:

1. Установление зависимости размеров формы от размеров экрана монитора.

2. Сохранять или не сохранять пропорции формы (соотношение высоты и ширины) при изменении размеров формы.

Resizer1.Lock_proportion = .T.       && Сохранять
Resizer1.Lock_proportion = .F.       && Не сохранять

3. Можно задать минимальную высоту формы при Resizer1.Lock_proportion = .T.

Resizer1.min_height = Минимальная высота      && (По умолчанию = 0)

4. Есть возможность выбора - при изменении размеров объектов пересчитывать FontSize или нет.

Resizer1.font_size = .T.       && Пересчитывать
Resizer1.font_size = .F.       && Не пересчитывать

5. Можно задать список базовых классов (через пробел), для которых запрещено масштабирование. По умолчанию масштабируются все базовые классы.

Resizer1.FixSizeBaseClass = 'image column'

6. Можно задать список объектов, запрещенных для масштабирования (через пробел). Будет изменяться только месторасположения этих объектов. Размер и содержимое объектов изменяться не будут.
Resizer1 . ObjNotMove = ‘container1’

7. Восстановление первоначальных размеров формы

Resizer1.Reset()


Как использовать:

1. Поместить объект класса Resizer на форму (напр., Resizer1)

2. В Init() формы написать:

      * Если задаем список объектов, запрещенный для масштабирования:
Thisform.ObjNotMove = ‘container1’

      * Без привязки к размерам экрана
Thisform.Resizer1.get_sizes()
или
      * С привязкой к размерам экрана
m.kW = 90       && Желаемый размер вашей формы относительно размера экрана, %.
Thisform.Resizer1.ToScreen(m.kW)

Примечание:

Коэффициент m.kW будет применен к той стороне формы, для которой коэффициент пропорциональности выше, например:
      Ширина формы = 500
      Высота формы = 400
      Ширина экрана = 640
      Высота экрана = 480

      Кш = 500/640=0,78125
      Кв = 400/480=0,83333

     Кв > Кш => пропорции расчитываются, исходя из значения высоты формы.


3. В Resize() формы написать - Thisform.Resizer1.set_sizes()


Дополнительная информация по использованию класса:

1. После программного добавления или удаления объектов формы писать - Thisform.Resizer1.get_sizes()

2. При использовании ресайзера в версиях VFP ниже седьмой необходимо откорректировать класс следующим образом:
  • в классе использовано свойство объекта Header (в колонках грида) - HeaderHeight, которое появилось только в VFP7. Поэтому, надо убрать код, относящийся к этому свойству:

    Метод ADDTOARRAY, строки:

    IF TYPE("oControl.HeaderHeight") = "N"
       .aControlStats[nLen,6] = oControl.HeaderHeight
    ENDIF


    Метод SET_SIZES, строки:

    * Работаем с заголовками гридов
    IF TYPE("oControl.HeaderHeight")="N"
       oControl.HeaderHeight = THIS.aControlStats[nPos,6]
    ENDIF


  • Для VFP5 (для шестой версии - не тестировалось) обнаружено, что команда oControl # Thisform выдает несовпадение типа оператора. Для обхода глюка корректируем следующие коды:

    1.в методе Get_sizes вместо This.Recurs(Thisform) написать This.Recurs(Thisform, 0)

    2. в методе Recurs добавить параметр nn - LPARAMETERS oControl, nn

    3. строку метода Recurs IF oControl # Thisform заменить на IF nn = 1;

    4. конструкцию (тот же метод)

    IF TYPE("."+aMems[m.i]) = "O"
       this.recurs(oControl)
    ENDIF


    заменить на
    IF TYPE("."+aMems[m.i]) = "O"
        nn = 1
        this.recurs(oControl, nn)
    ENDIF


Глюки:

1. Vladimir V. Ten: "При смене RecordSource в гриде слетают Caption введенные заранее руками, а востанавливаются те которые относяться к RecordSource."

Да, оказалось, что ресайзер как-то неадекватно реагирует на изменение RecordSource в гриде. И причина возникает где-то еще при самой первой рекурсии, что из Init'а формы. Даже если дальше нигде не писать Thisform.Resizer1.set_sizes().

Почему - не знаю, ресайзер при сборе данных об объектах вроде ничего в форме менять не должен. Ошибка - после смены RecordSource реальные объекты в гриде как бы не соответствуют тем данным о них, которые содержатся в массиве ресайзера. На форме они отражаются правильно, а обратиться программно к ним не получается. Любители шарад и ребусов, подключайтесь - Родина вас не забудет!

Вообще, от многих слышала, что динамические изменения RecordSource чреваты непредсказуемостями. Лично я предпочитаю при открытии необходимых таблиц присваивать им конкретный псевдоним и указываю его в качестве источника один раз.

Но для этого случая, все-таки хоть и огородами, но выход есть (в проекте пример прилагается - форма pr1_r). Может, со временем, будет что-нибудь более элегантное.


Условия использования и распространения:

Ресайзер опубликован на сайте Visual Foxpro Club в знак глубокой признательности этому сайту и его посетителям за массу ценнейшей информации, идей и советов, полученных и успешно примененных автором этого класса.

Использование класса - бесплатное, распространение - свободное. Следовательно, автор не несет никакой ответственности за последствия применения ресайзера и не гарантирует его идеальной работоспособности :).


Доработки и обновления:

  29.01.02 Публикация решения.
  27.02.02 Пересмотрена и оптимизирована большая часть кода. Получена возможность работы ресайзера со всеми объектами любой вложенности. Особая благодарность Василию Поторочину за невольную помощь (путем изучения работы его решения "ресайзинг формы") в написании рекурсии.
18.04.02 Добавлено описание метода пересчета размеров формы в зависимости от разрешения монитора.
20.05.02 Устранены недочеты работы ресайзера с колонками гридов. Пропорциональное изменение их ширины теперь достигается в любых условиях. (За выявление недочета спасибо Дмитрию Петрову)
21.05.02 Оптимизированы некоторые коды, добавлены комментарии к методам, добавлен список базовых классов, для которых запрещено масштабирование. (За идеи, подсказку и критику спасибо Владимиру Максимову)

При работе ресайзера с заголовками гридов (более одной строки) организован пересчет высоты заголовков. (Пожелание Саши из форума)
05.06.02 Выявлен недочет: при установке формы с фреймами в очень маленькие размеры возникала ошибка, что высота фрейма некорректна.
Недочет исправлен путем проверки новых размеров фреймов при изменении размеров формы. Если новая высота (ширина) фрейма меньше допустимой, размеры формы пересчитываются из расчета минимально допустимой высоты (ширины) самого маленького фрейма на форме.
26.08.02 Расчет зависимости размеров формы от размеров экрана оформлен как метод.

Коэффициент m.kW теперь применяется к той стороне формы, для которой коэффициент пропорциональности выше (пожелание Николая, дополнение пользователей)
06.09.02 Добавлено описание корректировки класса для версий VFP ниже, чем седьмая (поднял проблему и протестировал класс в VFP5 Олег Славутин).
25.10.02 Откорректированы недочеты:

   -  при установке формы с гридами в очень маленькие размеры возникала ошибка, что высота гридов некорректна. Исправлено. Если новая высота (ширина грида меньше допустимой, размеры формы пересчитываются из расчета минимально допустимой высоты (ширины) самого маленького грида на форме. Минимально допустимые значения - 30х30 пикселей. (Обнаружил Dmitry Shvaika)

   -  при изменении размера формы высота строк в гриде принимала какое-то странное неизвестно откуда взявшееся значение, одинаковое для любых изменений. Сейчас высота строк в гриде почему-то все-равно не изменяется пропорционально размерам формы, но хотя бы держатся заданные размеры.

   -  При большом увеличении надписи с приличным размером фонтов пересчитывались некорректно. Видимо, это связано с общим ограничением размера шрифта = 127. Допустимые для установки размеры шрифтов = [4,127].

   -  В методе toscreen введена переменная, по которой предварительно запоминается, а потом восстанавливается свойство Visible формы. Это имеет смысл, если такая форма содержится в наборе форм и мы до поры до времени не хотим ее показывать. (Предложение Валерия.)
10.09.03 Исправлен глюк, возникаюший при переключении режимов экрана. (Решение Малышева Д.А.)
26.10.03 Добавлена возможность запрещать масштабирование конкретных объектов и их содержимого. (Идея решения Влада)


Пример использования класса прилагается.

Е.В.Белюкова


 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (4.977) Вложение [52.85]kb
Дополнения пользователей
Resizer - автомат. изменение размеров объектов на форме.
[+][?]
Yuri Abramenkov
29.01.02 22:45:45

Хотелось бы узнать чем вызвано такое большое количество редактирований за один день (8 раз !!!).

Белюкова Е.В.
30.01.02 10:36:07

Тем, что в этот день было проведено большое количество тестирований класса на разных формах, в
разных условиях, с разным набором объектов.

Иногда казалось уже все, работает хорошо...публиковалось... 

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

Также, не сразу пришла в голову идея о сохранении пропорций формы при ресайзе.

Опубликованый выше вариант, думаю, достаточно стабилен.
Admin note RE:
Просто я подумал, что были проблемы с загрузкой :)
Белюкова Е.В.
01.02.02 18:10:22

Админу:
С загрузкой тоже что-то странное в начале было. После того, как первый раз стала публиковать
откорректированный вариант, почему-то он записался, как еще одно решение. Оно и сейчас болтаемся у
меня в моих решениях (может, уберете его?). А так-как не знала, какое из них реально опубликуется,
на всякий случай обновляла оба.
Поэтому и кол-во 8, может, двойной результат...
Михаил
04.02.02 10:16:15

Приветы!

Ну рэсайзит конечно неплохо но есть недароботки :)

1. Не работает на форме с кучей вложенных PageFrame - надо рекурсию писать :)

2. Надо устанавливать минимальный и максимальный размер для объектов - а не изменять их размеры до
бесконечности

Ну а остальное мелочи
Белюкова Е.В.
06.02.02 21:38:28

\1. Не работает на форме с кучей вложенных PageFrame - надо \рекурсию писать 

Да, пока не работает.
Схема работы - см. выше.


\2. Надо устанавливать минимальный и максимальный размер \для объектов - а не изменять их размеры
до
\бесконечности

Не совсем поняла. 
Размеры объектов изменяются пропорционально размерам формы.
Форма же не может укрупняться до бесконечности - обычно ее размеры ограничивают размером
(разрешением) экрана.
Минимальный размер формы может быть задан, если Lock_proportion = .T.
Михаил
08.02.02 12:41:15

Если есть желание пообщаться - я переделал рэсайзер из примера - в класс samples.vcx

Теперь работает с любой влюженностью PageFrame

Фонты не ресайзю принципиально. Замысел такой - на всех формах устанавливается однотипный фонт и
размеры, который можно поменять в настройках программы.

Поэтоми и устанавливаю минимальные и максимальные значения некоторых объектов.
Белюкова Е.В.
10.02.02 20:28:28

Михаилу:

/Если есть желание пообщаться - я переделал рэсайзер из примера - в класс samples.vcx

/Теперь работает с любой влюженностью PageFrame

А посмотреть можно?


Воробьев Максим
18.02.02 01:52:44

В методе Set_Sizes для объектов типа GRID
наверное следует изменить следующий код:
oControl.Column&ii..Width = oControl.Column&ii..Width * m.k,
так как колонки могут иметь имя, отличное от ColumnXXXX

oControl.Columns(m.i).Width = oControl.Columns(m.i).Width *;
                              m.k



Белюкова Е.В.
18.02.02 11:52:43

Воробьеву Максиму:
OK, исправлено (18.02.02).
Василий
18.02.02 20:57:25

* Рекурсивный метод, приведен в качестве примера
* только для 4-х свойств. Остальное дело фантазии
* каждого. Кроме этого метода на форму необходимо
* поместить: Свойства: amas[1,1] - массив, для первонач.размеров
*                                  всех элементов формы
*                      kolm - фактическая его размерность
*                      LASTHEIGHT - первоначальные
*                      LASTWIDTH  - размеры формы   
*                      lkofh  - коэффициенты высоты
*                      lkofw  - и длины изменения
*
* В метод Init поместить:
	THISFORM.lastheight=THISFORM.height
	THISFORM.lastwidth=THISFORM.width
	THISFORM.kolm = 0
	THISFORM.recurs (THISFORM,0)
* И в Resize :
	THISFORM.lkofh = THISFORM.HEIGHT/THISFORM.LASTHEIGHT
	THISFORM.lkofw = THISFORM.WIDTH/THISFORM.LASTWIDTH
	thisform.kolm = 0
	THISFORM.recurs(THISFORM,1)
*
* и все...
*
*  Результат тот же, а насколько проще.
*  У меня кроме этих 4-х свойств помещено
*  так же FontName, FontSize, FontStyle,
*  причем, FontSize изменяется, в том 
*  случае, если надпись не входит в отведенное поле
*  в Label и CheckBox


lparameters oForm, nP
LOCAL aMems,nTotMem,i,wi,oMem,aMems[1],bool,m1
m1 = 7
bool = nP = 0 
  WITH oForm
	if thisform.name # .name or thisform.baseclass # .baseclass
  	if type("oForm.top") = "N" or type("oForm.height") = "N";
  		or type("oForm.left") = "N" or type("oForm.width") = "N"
   	thisform.kolm = thisform.kolm + 1
	if bool
		dimension thisform.amas[thisform.kolm,m1]

  		if type("oForm.top") = "N"
   			thisform.amas[thisform.kolm,1] = oForm.top
  		endif
  		if type("oForm.height") = "N"
  			thisform.amas[thisform.kolm,2] = oForm.height
  		endif
  		if type("oForm.left") = "N"
  			thisform.amas[thisform.kolm,3] = oForm.left
 		endif
  		if type("oForm.width") = "N"
			thisform.amas[thisform.kolm,4] = oForm.width
  		endif
	else 
		if type("oForm.top") = "N"
			oForm.top = thisform.amas[thisform.kolm,1]*THISFORM.lkofh
  		endif
  		if type("oForm.height") = "N"
   			oForm.height = thisform.amas[thisform.kolm,2]*THISFORM.lkofh
  		endif
  		if type("oForm.left") = "N"
   			oForm.left = thisform.amas[thisform.kolm,3]*THISFORM.lkofw
  		endif
  		if type("oForm.width") = "N"
 			oForm.width = thisform.amas[thisform.kolm,4]*THISFORM.lkofw
  		endif
	endif
	endif
	endif
	nTotMem = AMEMBERS(aMems,oForm,2)
		FOR i = 1 TO m.nTotMem 
  		oForm = EVAL("."+aMems[m.i])
			IF TYPE("."+aMems[m.i]) = "O" 
				thisform.recurs(oForm,nP)
			ENDIF
		ENDFOR
ENDWITH

Василий
18.02.02 21:30:41

*  Еще дополнительно
*  
*
*
*


  if type("oForm.headerheight") = "N"
	thisform.amas[thisform.kolm,5] = oForm.headerheight
  endif
  if type("oForm.rowheight") = "N"
	thisform.amas[thisform.kolm,6] = oForm.rowheight
  endif


  if type("oForm.headerheight") = "N"
   oForm.headerheight = thisform.amas[thisform.kolm,5]*THISFORM.lkofh
  endif
  if type("oForm.rowheight") = "N"
   oForm.rowheight = thisform.amas[thisform.kolm,6]*THISFORM.lkofh
  endif

Василий
19.02.02 00:26:31

*
*    Ну и само собой...
*
*
 



 if type("oForm.fontsize") = "N"
	thisform.amas[thisform.kolm,7] = oForm.fontsize
  endif



  if type("oForm.fontsize") = "N"
      if (thisform.amas[thisform.kolm,7]*THISFORM.lkofh) > 4
    oForm.fontsize = (thisform.amas[thisform.kolm,7]*THISFORM.lkofh
    else
    oForm.fontsize = 4
   endif
  endif

Василий
19.02.02 15:40:37

Рейтинг решения растет. Значит посетители есть.
Неплохо бы услышать отзыв от кого-нибудь.
ЕленаВ, что скажешь ? Ты знакома с этой проблемой
не по наслышке. 
Белюкова Е.В.
20.02.02 11:31:39

Ну что сказать-то...

Люди работают в разных условиях, у каждого свой стиль, свои приемы. 
Я тестировала класс на своих программах - пока он меня вполне устраивает. Кто-то, может быть,
строит интерфейс программы как-то по-другому и, вполне возможно (даже очень вероятно), какие-то
моменты для таких разработчиков мною не учтены.

Поэтому, конечно хотелось бы получить какие-то отзывы, замечания, пожелания...

P.S.
Кстати, прежде чем написать этот класс, пробовала применить к моим программам несколько чужих
ресайзеров. В каждом что-то да не устраивало. Это я к тому, что многое зависит от конкретных задач
и методов их решения. Авторы-то писали классы 'под себя'.



Василий
24.02.02 09:51:01

Сходите сюда: http://nsvisual.com/fox2/sol/index.php?act=view&id=222 и убедитесь, что никаких
классов не нужно, чтобы добиться такого же результата. Вещь универсальная, на все случаи жизни.
Белюкова Е.В.
27.02.02 20:08:16

Благодаря Василию (изучая листинг его рекурсивного метода) несколько усовершенствовала класс -
теперь класс ресайзит  на форме ВСЕ объекты ЛЮБОЙ ВЛОЖЕННОСТИ.

О всяких схемах, как было до этого, можно забыть! :))


Василию:

Твое решение хорошее.
Но все-таки, я считаю, классом пользоваться удобнее. Ничего не надо дополнительно создавать
(методы, массивы) и копировать.
Субъективно, как-то быстрее и легче.
Шлепай готовый класс на формы и ни о чем не задумывайся. Ну если не считать двух необходимых строк
в Init и Resize. :)

Василий
02.03.02 20:23:05

Как правило, все программисты пользуются одним, созданным для себя классом формы, ИМХО(по крайней
мере я так делаю), и если поместить то, что я поместил в это решение, то никаких проблем с данной
проблемой (каламбур) больше не будет. Надо ли еще что-то придумывать в решении этой задачи? Ведь
решение это - раз и навсегда закрывает проблему, или не так ?
Василий
02.03.02 20:42:41

ЕленеВ:

Елена, не надо упираться в то, что ты создала. Поверь мне, то  что ты создала заслуживает
уважения. Не каждый программист может выдавать такие вещи, как подсказывает мой опыт(тем более
женщина). Но проблема решена раз и на всегда. Добавочно хочу сказать, что я - руководитель
нескольких проектов, которые живут и сегодня. Тебя я взял бы в свою команду не задумываясь.

Василий
02.03.02 21:49:45

Скажем так, я испытываю дефицит в нормально мыслящих людях.
Белюкова Е.В.
03.03.02 22:39:48

Василию:

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

С тех пор, как я перешла от процедурного программирования к объектному, мне кажется, что разница в
их возможностях как между небом и землей.

Про универсальность твоего метода:

Маленькое отступление.
Возникновение моего класса ресайзера обязано не просто желанию удовлетворить прихоть пользователя
по изменению размера формы, а поиску решения конкретной проблемы - автоматом заставить приложение
красиво выглядеть на мониторах с самым разным разрешением, от 640х480 до 1280х1024.

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

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

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

В итоге, я потеряла сервис в виде автоматического снятия и выставления размеров и позиций для
добавляемых на форму объектов (у тебя и в тестированных мною классах он есть), но приобрела более
для меня ценное - полный контроль над этими процессами.

Вот и все.
А в остальном, твой рекурсивный метод и мой ресайзер (в последней его версии) не так уж и
отличаются.


P.S. На счет женщин. 
Хоть я и не феминистка и, к тому же, мне могут могут сказать, что программист - профессия больше
мужская, да и форум, в основном, представлен мужчинами (и будут, черт побери, правы) - как-то оно
воспринимается ... несколько снисходительно.
Это я так, о женском восприятии мужских комплиментов...

Василий
04.03.02 08:17:19

ЕленеВ:

...не просто желанию удовлетворить прихоть пользователя
по изменению размера формы, а поиску решения конкретной проблемы - автоматом заставить приложение
красиво выглядеть на мониторах с самым разным разрешением, от 640х480 до 1280х1024...


Я никогда не иду (по крайней мере, стараюсь не идти) на поводу у пользователя (не благодарное это
дело - выслушивать советы и предложения порою космической глупости у дилетантов, мнящих себя
большими спецами). И не делаю ничего "лишь бы делать". Проблема И ДЛЯ МЕНЯ только В ЭТОМ и
состояла. Заглянув на сайт, обнаружил, что народ все еще бъется над ней, причем, отклонившись
"слегка" в сторону. Я никогда не считал, что выдал законченный вариант решения - важна идея, а
нюансы каждый навешает для себя сам, вот и ты, в частности, использовала ее в своем решении, чего
и радует.
Что касается восстановления первоначальных размеров, у меня они восстанавливаются несколько другим
способом и в другом месте. Более того, все размеры и положения окон у меня запоминаются по их
закрытию и в следующем сеансе работы открываются точно в тех же местах и с теми же размерами, что
и в прошлом сеансе (возможно отключение данного режима, что приводит к восстановлению
первоначального состояния).
Все эти возможности заложены в главный класс формы, поэтому и решение публиковалось за несколько
приемов, пришлось вырывать его из класса по кусочкам.

Белюкова Е.В.
04.03.02 08:48:24

Василию

Дополнение.
Извиняюсь, в предыдущем сообщении поторопилась сгрупировать твое решение с другими ресайзерами
из-за похожести структуры кода.

У твоего есть отличие, также позволяющее корректно добавлять объекты по ходу выполнения программы
- в методе 'Recurs' lparameters lP (В одном из ресайзеров, о которых писала выше все было похоже,
но анализ того, что делать не задавался параметром, а велся автоматически - проверялось наличие
новых объектов).

Т.о., чтобы корректно поставить объект (разработанный для формы определенного размера), используя
твой метод, можно написать:

WITH THISFORM
 .LockScreen = .T.
 .Visible = .F.
 m.Width = .Width   && Сохраняем текущие значения высоты и ширины формы
 m.Height= .Height

 .Width = 760        && Размеры формы, соотв-щие разм-ам доб. объектов
 .Height = 570       && -//-
 .Resize()
 .addObject(...) 

   .... Устанавливаем размеры и местоположение объекта

 .firstheight=.height 
 .firstwidth=.width 
 .nkolm = 0 
 .ndelta = 0 
 .recurs (THISFORM,.F.) 

 .Width = m.Width   && восстанавливаем размеры формы
 .Height= m.Height
 .Resize()

 .Visible = .T.
 .LockScreen = .F.
ENDWITH


Тоже самое для моего класса:

WITH THISFORM
 .LockScreen = .T.
 .Visible = .F.
 m.Width = .Width
 m.Height= .Height

 .Resizer1.Get_sizes()
 .Width = 760
 .Height = 570
 .Resizer1.Set_sizes()
 .Resizer1.Get_sizes()

 .addObject(...) 
  .... Устанавливаем размеры и местоположение объекта

 .Resizer1.Get_sizes()
 .Width = m.Width 
 .Height = m.Height 
 .Resizer1.Set_sizes()

 .Visible = .T.
 .LockScreen = .F.
ENDWITH

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

Но прежде, чем его использовать, все-таки переработала бы его в класс. Потому что все-таки считаю,
что оформление, хранение и использование некой функциональности удобнее в виде классов.

А так - все OK!
Удачи.

Белюкова Е.В.
04.03.02 10:21:17

Василию:

/ ...не просто желанию удовлетворить прихоть пользователя
...
/Я никогда не иду (по крайней мере, стараюсь не идти) на поводу у пользователя ..

Да я и не тебя вовсе имела в виду, а цель создания класса. Тебе, Василий, от меня только
благодарность. Без твоего решения я бы еще неизвестно когда усовершенствовала свое.:)


Василий
04.03.02 13:52:10

ЕленеВ:

Мне показалось, что по некоторым вопросам мы "разговариваем" на разных языках. 

...Но прежде, чем его использовать, все-таки переработала бы его в класс. Потому что все-таки
считаю,
что оформление, хранение и использование некой функциональности удобнее в виде классов...

По-моему - это истина, не требующая дополнительных разъяснений, тем более оспорения (наследование
свойств и методов - великая вещь). И если я выдал решение никак не оформленное, то только потому,
чтобы не загромождать главную идею, а в класс его оформит, если потребуется, любой, даже
начинающий "фоксист". Мне думалось и это не требует разъяснений.

И, если я высказался типа:
...Я никогда не иду (по крайней мере, стараюсь не идти) на поводу у пользователя...

то имел ввиду только то, что не нужно так подробно описывать причины, побудившие заниматься
проблемой. Мне они более, чем понятны. Иначе, ради прихоти пользователей, я бы и сам не стал ею
заниматься.


Василий
04.03.02 21:41:37

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



А что для тебя значит "более приятно" ?

Можно вопрос на отвлеченную тему ?
У меня в собственности (на мое имя) квартира в Москве, правда не в центре, 15 минут ходьбы от
стации М.Домодедовская, но все же. Здесь я нахожусь волею судьбы. А,знаешь, когда я сообщаю свое
имя, то не все женщины адекватно реагируют на это. Некоторые откровенно говорят, что это имя им не
нравится и поэтому я им не подхожу ни в каком плане. Неужели имя играет такую роль, скажи мне,
если захочешь. Тем более, что я свое имя ни в коем случае не желаю вуалировать.

Белюкова Е.В.
06.03.02 13:36:52

Да, согласна - скорее всего уже толчем воду в ступе.
 
Про классы - конечно истина. 
Мне и показалось странным, что человек, написавший такой сложный и оригинальный код (а значит, уж,
наверное, прекрасно знаком со всеми особенностями программной среды), говоря, что "никаких классов
не нужно, чтобы добиться такого же результата", вроде как предлагает по возможности обходиться без
них.

Ну, извини, если превратно поняла.

**

"...не просто желанию удовлетворить прихоть пользователя
по изменению размера формы..."

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

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

Хотя, ничего плохого в таком применении ресайзера я не вижу. Для программы и программиста, ее
написавшего, это только плюс.

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

**

"А что для тебя значит "более приятно"?"

Мне интересны (и приятны) многие вещи. Предоставляю полную свободу для твоей фантазии.

**

Про имя.
Наверное, сейчас скажу какую- нибудь правильную банальнось. Но я действительно так думаю.

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

Я тогда ответила, что по мне - был бы человек хороший, а имя
не настолько уж важно. И потом, имя-то ведь нормальное. Ни какой- нибудь Евфнутий или Спиридон.
Если вслушаться, и звучит-то красиво - Ва-си-лий.
Скольких царей и князей так звали - и русских и болгарский.
А женский вариант, Василиса - вообще сказочный.

Или я говорила не достаточно убедительно, или комплекс у парня был слишком сильный (уж не знаю,
откуда он такой мог возникнуть), но, кажется, не поверил. Котов, говорит, так называют.
Ну и что? У меня деда звали Василием и коты у него в доме не переводились. Встречались и тезки. Но
деду и в голову не приходило делать из этого проблему.

Васе этому было тогда лет двадцать и было это больше 10 лет назад.

У нашего поколения действительно не очень богат был выбор на имена. Саши, Андрюши, Вовы, ...,
Лены, Светы, Иры... Что-то другое, может и правда, бросалось в глаза.

Но сейчас-то, посмотри: и Егоров полно, и Архипов, и Филиппов (что во времена нашей юности, вообще
- нонсенс). Неужели еще кто-то придает этому такое значение?

Я, Вась, не знаю, сколько тебе лет. Тот Вася, может, еще в силу своего возраста так к этому
относился.
И не знаю, что за женщины оценивают человека только через призму имени. Может, еще ветер в голове
- придумали себе идеал, и хотят, чтобы все совпало, вплоть до имени.
А может, твое имя вызвало какую-то неприятную ассоциацию с кем-то. Но это дело тогда уже не в
имени.
А если основной аргумент - не нравится сочетание букв, ну и плюнь ты тогда на них! Уже все ясно.

Я думаю, не стоит серьезно к этому отноститься. В самом твоем имени ничего зазорного нет. Василий
в переводе то ли с византийского, то ли еще с какого-то древнего, значит царственный.
А к звучанию имени, как и к внешности, привыкают. И тогда уже все равно, как зовут любимого
человека или какими внешними данными наделила его природа.
Главное, как сказал отец Скарлетт о'Харра, чтобы оба были из одного теста. 
Так оно и есть...

А вуалировать имя и не надо. Его стыдиться нечего. Это тем, кто реагирует неадекватно, должно быть
стыдно. За свою дремучесть.
VASIL
08.05.02 16:52:38

Мелкие(не по существу) замечания
Можно SET DECIMALS убрать - влияет на точность только при выводе на экран
Сравнения IF переменная = .T. можно заменить на
      IF переменная
Александр
16.07.02 09:12:02

Елене:

Попалась следующая ошибка:
при установке следующих параметров
m.kW = 100 или 95 в методе Init при открытии происходит завал части формы в правый нижний угол
экрана, установка нормального размера и положения происходит только после щелчка мышью на форме.
Николай
29.07.02 13:44:52

Хорошее и удобное решение. Давно было нужно, но как-то руки не доходили. Спасибо.
Но есть замечание по инициализации формы с привязкой к размеру экрана.

1)  следует выбирать коэффициент допустимого увеличения формы как меньший из 2-х коэффициентов:
k1=ширина_экрана / ширина_формы
k2=высота_экрана / высота_формы

k=IIF(k1
Белюкова Е.В.
15.08.02 11:26:40

Александру и Николаю:

Извиняюсь за долгую задержку с ответом - была в отъезде.
Постараюсь по возможности найти время заняться означенными проблемами.
Vladimir
26.08.02 12:36:21

Столкнулись с проблемой :
При смене RecordSource в гриде слетают Caption введенные заранее руками, а востанавливаются те
которые относяться к
RecordSource.

Белюкова Е.В.
26.08.02 14:13:28

Владимиру:

Если я правильно поняла Вашу проблему, то она должна возникать у Вас и без применения ресайзера.
Она связана не с его использованием, а со сменой источника данных для грида. При этом Фокс
считывает заголовки полей из новой таблицы и подставляет их в Caption колонок грида.
 
Чтобы заголовки колонок грида были для всех Ваших таблиц одинаковыми:
 
1. Создайте новый метод, например - CaptionGrid1.
2. Напишите в нем в соответствии с порядком следования колонок (само собой, таблицы должны быть
одной структуры и порядок следования полей в них д.б. одинаковым):
 
     WITH Thisform.Grid1
      .Column1.Header1.Caption = 'Cap1'   &&  нужное название
      .Column2.Header1.Caption = 'Cap2'
      ...
      .ColumnN.Header1.Caption = 'CapN'
     ENDWITH
 
3. В методе Init формы напишите:
      Thisform.CaptionGrid1()        && это вместо того, чтобы названия колонок прописывать в
дизайнере формы руками.
 
4. В том месте, где Вы меняете значение для RecordSource (и для всех таких случаев), следующей
строкой:
     Thisform.CaptionGrid1()
 
Все. Должно сработать.

Белюкова Е.В.
26.08.02 14:36:19

Александру, про значения m.kW = 100 и завал формы вниз:

Какая у вас форма - as top-leven, in top-leven, in screen?
При загрузке формы видна ли виндузовая полоска с кнопкой "Пуск"?

Попробовала запустить форму (in screen) с m.kW = 95: да, нижней части не видно как раз из-за
виндузовой полоски и заголовка screen вверху. Но в этом случае восстанавливаться как-будто нечему,
можно только m.kW сделать меньше ("установка нормального размера и положения происходит только
после щелчка мышью на форме").

Можно Вашу форму для изучения? Если нетрудно, самый минимум: форма (без объектов) и программка с
ее запуском. Мое мыло: belena1@mailru.com
Белюкова Е.В.
26.08.02 14:36:41

Александру, про значения m.kW = 100 и завал формы вниз:

Какая у вас форма - as top-leven, in top-leven, in screen?
При загрузке формы видна ли виндузовая полоска с кнопкой "Пуск"?

Попробовала запустить форму (in screen) с m.kW = 95: да, нижней части не видно как раз из-за
виндузовой полоски и заголовка screen вверху. Но в этом случае восстанавливаться как-будто нечему,
можно только m.kW сделать меньше ("установка нормального размера и положения происходит только
после щелчка мышью на форме").

Можно Вашу форму для изучения? Если нетрудно, самый минимум: форма (без объектов, кроме ресайзера)
и программка с ее запуском. Мое мыло: belena1@mailru.com
Олег Славутин
28.08.02 17:28:15

Может быть мой вопрос покажется Вам тривиальным,но все же..
По определенным причинам у нас все работает на VFP5.Я через классброузер перетащил Ваш класс,НО
форма ломается на методе RECURS :
oControl # Thisform,выдает несовпадение типа оператора.

Есть соображения по этому поводу ?(М.б. в VFP5 нельзя сравнивать обьекты ? Где-то я уже на это
налетал)
Белюкова Е.В.
29.08.02 11:24:28

Олегу Славутину:

К сожалению, ничего про сравнение объектов в пятерке не могу Вам сказать - не сталкивалась с этим.

А вообще, про понижение версий: в классе использовано свойство объекта Header (в колонках грида) -
HeaderHeight, которое появилось только в VFP7. Поэтому, при понижении надо убрать код, относящийся
к этому свойству:

Метод ADDTOARRAY, строки:

IF TYPE("oControl.HeaderHeight") = "N"
   .aControlStats[nLen,6] = oControl.HeaderHeight
ENDIF

Метод SET_SIZES, строки:

*	Работаем с заголовками гридов
IF TYPE("oControl.HeaderHeight")="N"
   oControl.HeaderHeight = THIS.aControlStats[nPos,6]
ENDIF

Протестировать класс в версиях ниже седьмой возможности у меня нет, поэтому, может, есть и еше
какие "подводные камни". Если их кто-нибудь выявит - прошу откликнутся.
Олег Славутин
29.08.02 15:50:23

Как же его (класс) тестировать ниже семерки,если он тут же слетает из-за того, что ,если например
такой код коректен:
sele db_test
scatter name aa
bb=aa
gather name bb

а такой нет 

sele db_test
scatter name aa
skip
scatter name bb
if bb=aa && Эта строка не проходит
wait wind 'Совпал'
else
wait wind 'Не совпал'
endif
метод RECURS не работает
Белюкова Е.В.
30.08.02 10:49:42

Это в пятерке такое? Или и в шестерке тоже?

Ну, тогда, к сожалению, придется признать, что класс работает только с седьмой версии...
Олег Славутин
30.08.02 14:07:25

В пятерке. За шестерку не знаю.
А вообще как в том анекдоте, когда мужик сидит и орехи раскалывает, а они все пустые, а он все
надеется.Расколол последний, а оттуда червяк вылезает и спрашивает 'Обидно да ?'.

Так вот обидно
Белюкова Е.В.
30.08.02 15:46:00

Можно попробовать избежать строки oControl # Thisform, например, так:

1.в методе Get_sizes вместо This.Recurs(Thisform) написать This.Recurs(Thisform, 0)

2. в методе Recurs добавить параметр nn - LPARAMETERS oControl, nn

3. строку метода Recurs IF oControl # Thisform заменить на IF nn = 1;

4. в конструкцию
IF TYPE("."+aMems[m.i]) = "O" 
this.recurs(oControl) 
ENDIF 

Белюкова Е.В.
30.08.02 15:48:54

Пардон, отправилось нечаянно...

4. конструкцию
IF TYPE("."+aMems[m.i]) = "O" 
  this.recurs(oControl) 
ENDIF

заменить на 
IF TYPE("."+aMems[m.i]) = "O" 
 nn = 1 
 this.recurs(oControl) 
ENDIF

Попробуйте, может так пойдет.

Белюкова Е.В.
30.08.02 15:57:38

В догонку - выше ошибочка, конечно.
Надо:

заменить на 
IF TYPE("."+aMems[m.i]) = "O" 
 nn = 1 
 this.recurs(oControl, nn) 
ENDIF


Николай
30.08.02 16:04:52

Наверное не нужно позиционирование формы при ресайзинге с помощью мышки - начинаются утомительные
для глаз прыжки.
Позиционирование нужно лишь в момент инициализации при привязке к размерам экрана (лучшее - враг
хорошего).
В остальном - все вроде нормально.


Олег Славутин
05.09.02 18:05:12

Спасибо огромное. Под пятеркой все заработало после рекомендованных Вами изменений. Ура :-)
Вадим
16.09.02 14:57:25

Елене:
Я опробовал ваш resizer и у меня возникло несколько вопросов. Он прекрасно работает при resize
формы, но я не совсем понял как им воспользоваться при изменении разрешения экрана. Мне
необходимо, чтобы форма сохраняла свой вид в разрешении от 800х600 до 1280х1024. Если я проектирую
форму для 800х600 у меня при большем разрешении увеличивается все кроме размера шрифтов, хотя я
указал, что fontsize должен пересчитываться. Если проектирую форму для 1280х1024, то при меньшем
разрешении она просто не помещается на экран.

С уважением, Вадим Кизилов, ГЦКЗ "Россия"
Вадим
16.09.02 14:57:41

Елене:
Я опробовал ваш resizer и у меня возникло несколько вопросов. Он прекрасно работает при resize
формы, но я не совсем понял как им воспользоваться при изменении разрешения экрана. Мне
необходимо, чтобы форма сохраняла свой вид в разрешении от 800х600 до 1280х1024. Если я проектирую
форму для 800х600 у меня при большем разрешении увеличивается все кроме размера шрифтов, хотя я
указал, что fontsize должен пересчитываться. Если проектирую форму для 1280х1024, то при меньшем
разрешении она просто не помещается на экран.

С уважением, Вадим Кизилов, ГЦКЗ "Россия"
Белюкова Е.В.
17.09.02 14:02:51

Непонятно, почему у Вас не пересчитывается размер шрифта...

Сейчас у меня разрешение монитора 1024х768. 
Когда начинала разрабатывать форму, с которой сейчас занимаюсь, монитор был 800х600.
Форму сделала - 760х570. Т.е., пропорции стандартные, но размер чуть меньше - чтобы ее всю можно
было видеть при разработке.

В методе Init() написано:

WITH This
  m.kW = 90       && Желаемый размер формы относительно размера экрана, %. 
  .Resizer1.ToScreen(m.kW)
ENDWITH	

Свойство ресайзера font_size =.T.

При запуске этой формы на других компьютерах она занимает 90% от всего размера экрана монитора,
вне зависимости от его разрешения (у нас они от 800х640 до 1024х768). Размер шрифтов при этом
пересчитывается тоже.

*******

Вы пишете: 'Если проектирую форму для 1280х1024, то при меньшем разрешении она просто не
помещается на экран'.

Просто не помещается? А так все, что нужно, на ней есть?

Попробовала сделать форму 800х600 (при таком же разрешении монитора), понизить разрешение монитора
до 640х480 и запустить форму из фокса - то, что на форме первоначально выходит за пределы 640х480
исчезло.
К сожалению, сейчас не могу попробовать сделать exe-шник из такой формы и запустить его не из
фокса, скажем, из проводника - что тогда будет?

А вообще, благодаря Вашему сообщению открылся вопрос - как ведет себя форма при запуске на
мониторе, разрешение которого меньше, чем ее (формы) размеры при разработке.


P.S. обнаружила глюк с размером шрифтов (на Label'ах). При большом увеличении надписи с приличным
размером фонтов пересчитываются некорректно. Видимо, это связано с общим ограничением размера
шрифта = 127. Если новый размер шрифта получается больше этого значения - выглядит это
непредсказуемо.
Хотя, если начальный размер фонта не больше 30-40, глюк не должен возникать при любом увеличении в
реальных условиях (при разр. 1024х768)
Вадим
19.09.02 12:30:19

Елене:

Спасибо за ответ. Я уже разобрался.Нужно было использовать resizer без привязки к размерам экрана
и сделать Lock_proportion=.F. Теперь все работает как надо. Большое спасибо за программу, давно
искал такую.

Вадим Кизилов, ГЦКЗ "Россия"
Василий
04.10.02 19:00:35

Коллеги!
А кто, собственно, мне бы разъяснил, в чем принципиальная разница этого решения от моего, еще
опубликованного в феврале 2002 года.
http://nsvisual.com/fox2/sol/index.php?act=view&id=222
быть может никто не знает о нем, и поэтому столько "сломано копий".
Валерий
24.10.02 12:21:01

Мне кажется в методе toscreen имело бы смысл предварительно запоминать а потом восстанавливать
свойство Visible формы. Это имеет смысл если такая форма содержится в наборе форм и мы допоры до
времени не хотим ее показывать.
Белюкова Е.В.
24.10.02 13:06:02

Валерию:
OK, дополню.
Владимир Максимов
02.12.02 11:38:06

К сведению:

HeaderHeight - есть в VFP6
Прямое сравнение объектов также появилось в 6 версии, т.е. oControl # Thisform для VFP6 допустимая
конструкция.
Ivan
05.12.02 13:19:12

Как запретить изменять расстояние между объектами в форме?
Пример: Commandgroup в нем 4 commandbutton. как запретить изменять расстояние между кнопками?
попробуйте размер кнопок 27х27 и расстояние между ними 0.
Кто знает?
Ivan
05.12.02 13:19:40

Как запретить изменять расстояние между объектами в форме?
Пример: Commandgroup в нем 4 commandbutton. как запретить изменять расстояние между кнопками?
попробуйте размер кнопок 27х27 и расстояние между ними 0.
Кто знает?
использую VFP6
Ivan
05.12.02 13:40:53

Как запретить изменять расстояние между объектами в форме?
Пример: Commandgroup в нем 4 commandbutton. как запретить изменять расстояние между кнопками?
попробуйте размер кнопок 27х27 и расстояние между ними 0.
Кто знает?
использую VFP6
Ivan
05.12.02 13:59:01

Как запретить изменять расстояние между объектами в форме?
Пример: Commandgroup в нем 4 commandbutton. как запретить изменять расстояние между кнопками?
попробуйте размер кнопок 27х27 и расстояние между ними 0.
Кто знает?
использую VFP6
Ivan
05.12.02 13:59:12

Как запретить изменять расстояние между объектами в форме?
Пример: Commandgroup в нем 4 commandbutton. как запретить изменять расстояние между кнопками?
попробуйте размер кнопок 27х27 и расстояние между ними 0.
Кто знает?
использую VFP6
Ivan
05.12.02 14:16:03

вопрос и к админу: почему сообщения клонируються??
Белюкова Е.В.
06.12.02 14:33:14

Ивану:
Запретить изменение растояния между объектами в существующей версии ресайзера нельзя никак.

Но можно запретить масштабирование самого объекта Commandgroup (Resizer1.FixSizeBaseClass =
'Commandgroup'), если это устроит. Расстояния между кнопками тогда не изменятся. Но не изменятся и
размеры кнопок.

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

Не совсем поняла про пример "попробуйте размер кнопок 27х27 и расстояние между ними 0".

Попробовала. Размер кнопок меняется, а ноль - он и есть ноль. 
Ivan
16.01.03 13:15:15

берем на форму ставим Commandgroup
определяем 4 кнопки, изменяем у них размер 27х27
между ними ставим интервал 0 располагаем их по горизонтали
при Resizer1.FixSizeBaseClass ='Commandgroup'
кнопки усе равно изменяются в размерах
а при 
Resizer1.FixSizeBaseClass ='Commandgroup CommandButton'
кновки в размерах не увеличаваютья, зато расстояние между ними увеличиваеться.
Белюкова Е.В.
17.01.03 15:02:32

Да, действительно, так и происходит..

Дело в том, что Resizer1.FixSizeBaseClass ='Commandgroup CommandButton' запрещает изменение
размеров объектов, но не их месторасположения. Координаты объектов (top,left)при изменении
размеров формы расчитываются на основе старых координат этих объектов и изменяются пропорционально
изменениям формы.
Т.о. то, что интервал между кнопками был равен 0, ресайзеру ни о чем не говорит. Он ориентируется
на другие параметры...

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

Со временем попробую (но не гарантирую, что скоро). 

Заглядывайте, поправлю это - выложу.
Малышев Д.А.
17.06.03 22:03:43

Если в TOSREEN разрешение экрана определять не :

mwidth=SYSMETRIC(1) 
mhight=SYSMETRIC(2)

а через Windows API :

#define SM_CXSCREEN 0
#define SM_CYSCREEN 1
DECLARE INTEGER GetSystemMetrics IN User32 AS GetSysMetric ;
  integer Index
mwidth=GetSysMetric(SM_CXSCREEN)
mhight=GetSysMetric(SM_CYSCREEN)

то RESIZER перестанет глюкать при переключении режимов экрана
Малышев Д.А.
17.06.03 22:06:37

Прошу прощения, ошибся, в TOSCREEN, естественно...
Белюкова Е.В.
10.09.03 14:50:06

Малышеву Д.А.:
спасибо, поправлено.
Влад
25.10.03 19:23:31

Уважаемая Елена. Отличная работа, но есть одно но...
Пропорциональное увеличение и смещение некоторых объектов, таких как кнопки совсем не красит
развёрнутую форму.
Вот, что сделал я:
В методе Recurs заменяем строку:
    CountControl = AMEMBERS(aMems,oControl,2)
на
    IF LOWER(oControl.Name) $ LOWER(this.ObjNotMove) 
       CountControl =0
    ELSE 
       CountControl = AMEMBERS(aMems,oControl,2)
    ENDIF
Добавляем свойство ObjNotMove и получается замечательная лазейка. Теперь ничто не мешает создавать
к примеру Containerы и запихивать туда всё что угодно. Сам Container сдвигается как и положено а
внутри его всё неизменно. Только не забыть указать его имя в вышеуказанном свойстве.
Мелочь, а приятно. А решение классное, спасибо!                  
Белюкова Е.В.
28.10.03 11:04:20

Спасибо, Влад!
Благодаря Вам сподвиглась наконец ввести в класс возможность запрета на изменение объектов. Уже
давно просили это сделать.
Я только несколько изменила Ваше решение.
Белюкова Е.В.
28.10.03 11:11:29

[продолжение]

Чтобы не возникало ошибки при наличии объекта ActivX на форме (при исполнении команды IF
LOWER(oControl.Name) $ LOWER(this.ObjNotMove)), в метод Recurs написала:

IF TYPE("oControl.BaseClass")="C"
 IF LOWER(oControl.Name) $ LOWER(this.Objnotmove)
  CountControl =0
 ELSE 
  CountControl = AMEMBERS(aMems,oControl,2)
 ENDIF
ELSE
 CountControl = AMEMBERS(aMems,oControl,2)
ENDIF

И в метод set_sizes:

IF TYPE("oControl.Height")="N"  AND !(LOWER(oControl.Name) $ LOWER(this.Objnotmove) )
 oControl.Height = THISFORM.Height * THIS.aControlStats[nPos,3] / THIS.InitialFormHeight
ENDIF

IF TYPE("oControl.Width")="N" AND !(LOWER(oControl.Name) $ LOWER(this.Objnotmove) )
 oControl.Width = THISFORM.Width * THIS.aControlStats[nPos,4] / THIS.InitialFormWidth
ENDIF

добавила условие AND !(LOWER(oControl.Name) $ LOWER(this.Objnotmove) ) для того чтобы не
изменялись размеры самих объектов, перечисляемых в свойстве ObjNotMove.

Владимир Журавлев
15.01.04 10:38:53

Пробую пользоваться в VFP6+sp5 сделав мизерные изменнения
Все почти великолепно. Отличная работа.
Проблемы.
У меня куча контролов.
Ясное дело внутренности конторов не видны снаружи и не попадают под рекурсию
Делаю для них сейчас у класса контрола отдельный ресайз метод, который при ресайз контрола
продернет и его внутренности
Проблема с классами контейнеров
Ресайзинг идет раздельно для контейнера и его внутренностей по рекурсии.
При этом подписи лейблев , входящих в контейнеры часто частично съедаются из за того, что
контейнер, в который они вложены увеличен в другой пропорции.
Те если baseclass  контейнер и рекурсия попала на какие то элементы, попавшие в него, нужно еще
проверять при ресайзинге его компонент, а не нужно ли снова слегка увеличить их папу.
Глюков при смене источника грида не обнаружил
У меня такого полно, данные многих гридов все время перевычисляются за счет sql  запросов, и на
время запроса отключаются от источников. Проблем с ломокй грида не обнаружил.

Белюкова Е.В.
15.01.04 11:27:24

// Проблема с классами контейнеров

Попробую поковыряться на досуге...
Но не обещаю, что быстро. Очень много другой работы...
XAndy
10.02.04 15:48:03

Мелочь: в методе Resizer.ToScreen() можно поменять
"thisform.Resizer1.get_sizes()" на "this.get_sizes()". Тогда и имя объекта другое можно
использовать.
Виктор_С
28.02.05 13:13:14

Белюковой Е.В. 

Не подскажете пожалуйста, как узнать текущее разрешение экрана в Visual FoxPro 6.0?

Спасибо!

Joys
01.03.05 19:54:52

тест
ElenaB
04.03.05 12:13:30

Здравствуйте, Виктор.
Не знаю, как в шестерке, а в 7-8 версиях это:

#define SM_CXSCREEN 0
#define SM_CYSCREEN 1
DECLARE INTEGER GetSystemMetrics IN User32 AS GetSysMetric ;
  integer Index
mwidth=GetSysMetric(SM_CXSCREEN)
mhight=GetSysMetric(SM_CYSCREEN)

[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика