Войти
NeoBooker.ru
Добро пожаловать к нам в гости!
Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
  • Страница 1 из 1
  • 1
Модератор форума: Peter, DEMBEL, YURIY  
[√] Динамическое изменение размера объекта
MicroCipДата: Пт, 06 Января 2012, 21:08 | Сообщение # 1
Участник
Возник вопрос, каким образом можно динамически подогнать размер объекта Text(Надпись),что бы в него полностью вмещался текст, т.е. если изменится длина текста, то увеличивалась ширина, а если размер шрифта, то высота объекта?

В каждом человеке солнце. Только дайте ему светить.(с)Сократ
 
СообщениеВозник вопрос, каким образом можно динамически подогнать размер объекта Text(Надпись),что бы в него полностью вмещался текст, т.е. если изменится длина текста, то увеличивалась ширина, а если размер шрифта, то высота объекта?

Автор - MicroCip
Дата добавления - 06 Января 2012 в 21:08
mishemДата: Пт, 06 Января 2012, 21:11 | Сообщение # 2
Эксперт форума
MicroCip, это вопрос что бы за тебя сделали, ии правда не понимаешь?
:)


Не хочешь читать хелп?

Если хелп и форум не помогли, тогда все ответы здесь



Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
 
СообщениеMicroCip, это вопрос что бы за тебя сделали, ии правда не понимаешь?
:)

Автор - mishem
Дата добавления - 06 Января 2012 в 21:11
MicroCipДата: Пт, 06 Января 2012, 21:17 | Сообщение # 3
Участник


В каждом человеке солнце. Только дайте ему светить.(с)Сократ

Сообщение отредактировано
MicroCip - Пт, 06 Января 2012, 21:18
 
Сообщение

Автор - MicroCip
Дата добавления - 06 Января 2012 в 21:17
mishemДата: Пт, 06 Января 2012, 21:21 | Сообщение # 4
Эксперт форума
нужно посчитать количество символов, и умножить на ширину символа. Если несколько строк, считаем количество строк. Ну и т.д. Другой вопрос как узнать ширину символа...

Не хочешь читать хелп?

Если хелп и форум не помогли, тогда все ответы здесь



Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
 
Сообщениенужно посчитать количество символов, и умножить на ширину символа. Если несколько строк, считаем количество строк. Ну и т.д. Другой вопрос как узнать ширину символа...

Автор - mishem
Дата добавления - 06 Января 2012 в 21:21
DEMBELДата: Пт, 06 Января 2012, 22:17 | Сообщение # 5
Наш дизайнер
Quote (mishem)
Другой вопрос как узнать ширину символа...

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


Как задавать вопросы

Win7x64 SP1 Neobook v5.70 (Trial)
WinXP SP3 Neobook v5.62
 
Сообщение
Quote (mishem)
Другой вопрос как узнать ширину символа...

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

Автор - DEMBEL
Дата добавления - 06 Января 2012 в 22:17
MicroCipДата: Сб, 07 Января 2012, 00:08 | Сообщение # 6
Участник
DEMBEL, используется только Arial

В каждом человеке солнце. Только дайте ему светить.(с)Сократ
 
СообщениеDEMBEL, используется только Arial

Автор - MicroCip
Дата добавления - 07 Января 2012 в 00:08
mishemДата: Сб, 07 Января 2012, 00:36 | Сообщение # 7
Эксперт форума
Quote (DEMBEL)
да никак,

Ну от чего же? Шрифт испоьзуемый в проекте мы знаем. Составить список используемых размеров и будешь знать какая ширина шрифта, если его высота такая то.
Теперь новый вопрос, а оно это надо?
:D
Я как то пытался высчитать высоту листбокса, так точо и не сделал, только приблизительно. Бросил. :D


Не хочешь читать хелп?

Если хелп и форум не помогли, тогда все ответы здесь



Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
 
Сообщение
Quote (DEMBEL)
да никак,

Ну от чего же? Шрифт испоьзуемый в проекте мы знаем. Составить список используемых размеров и будешь знать какая ширина шрифта, если его высота такая то.
Теперь новый вопрос, а оно это надо?
:D
Я как то пытался высчитать высоту листбокса, так точо и не сделал, только приблизительно. Бросил. :D

Автор - mishem
Дата добавления - 07 Января 2012 в 00:36
ГарикДата: Сб, 07 Января 2012, 02:03 | Сообщение # 8
Ищите что-то вроде GetCaretPos в плагинах
Эта функция возвращает координаты каретки в пикселях, а там уже вычислить ширину текста не проблема.
 
СообщениеИщите что-то вроде GetCaretPos в плагинах
Эта функция возвращает координаты каретки в пикселях, а там уже вычислить ширину текста не проблема.

Автор - Гарик
Дата добавления - 07 Января 2012 в 02:03
DEMBELДата: Сб, 07 Января 2012, 07:17 | Сообщение # 9
Наш дизайнер
можно примерно взять ширину символа Ариала (+ расстояние между буквами) и умножать ее на кол-во символов, получится примерно общая ширина текста.
для этого напиши примерно любой текст, измерь его ширину в пикселях и раздели на кол-во символов, получишь примерную часть ширины приходящейся на один символ.


Как задавать вопросы

Win7x64 SP1 Neobook v5.70 (Trial)
WinXP SP3 Neobook v5.62
 
Сообщениеможно примерно взять ширину символа Ариала (+ расстояние между буквами) и умножать ее на кол-во символов, получится примерно общая ширина текста.
для этого напиши примерно любой текст, измерь его ширину в пикселях и раздели на кол-во символов, получишь примерную часть ширины приходящейся на один символ.

Автор - DEMBEL
Дата добавления - 07 Января 2012 в 07:17
mishemДата: Сб, 07 Января 2012, 07:24 | Сообщение # 10
Эксперт форума
не точно получается. У букв ш, щ, ю, ы ширина отличается от других букв.

Не хочешь читать хелп?

Если хелп и форум не помогли, тогда все ответы здесь



Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
 
Сообщениене точно получается. У букв ш, щ, ю, ы ширина отличается от других букв.

Автор - mishem
Дата добавления - 07 Января 2012 в 07:24
MicroCipДата: Сб, 07 Января 2012, 09:28 | Сообщение # 11
Участник
mishem, дык это не проблема, мне до пикселя точность не нужна. Ну максимальная погрешность 8-10 пикселей
DEMBEL, сейчас попробую


В каждом человеке солнце. Только дайте ему светить.(с)Сократ
 
Сообщениеmishem, дык это не проблема, мне до пикселя точность не нужна. Ну максимальная погрешность 8-10 пикселей
DEMBEL, сейчас попробую

Автор - MicroCip
Дата добавления - 07 Января 2012 в 09:28
mishemДата: Чт, 07 Января 2016, 01:47 | Сообщение # 12
Эксперт форума
Quote (MicroCip)
DEMBEL, сейчас попробую


А здесь че, не понятно объяснил?

Quote (mishem)
нужно посчитать количество символов, и умножить на ширину символа.

Добавлено (07 Января 2016, 01:36)
---------------------------------------------
Вернулся к этому вопросу. Лучше поздно чем никогда. Где то мы уже решали этот вопрос с помощью чекбокса.

Создаем где нибудь за пределами окна объект чекбокс. В нашем случае его имя будет CheckBox1.
Создаем объект Надпись\Текст. В нашем случае его имя будет Text1.

В первую очередь нам нужно узнать размер, стиль и название шрифта объекта Text1.

Код
GetObjectInfo "Text1" "FontSize" "[FontSize]"
GetObjectInfo "Text1" "FontName" "[FontName]"
GetObjectInfo "Text1" "FontStyle" "[FontStyle]"


Далее нам нужно те же параметры шрифта присвоить объекту CheckBox1.

Код
SetObjectFont "CheckBox1" "Black" "[FontName]" "[FontSize]" "[FontStyle]" "DEFAULT_CHARSET"


Так как мы изменили параметры шрифта, то и высота объекта CheckBox1 так же изменилась.
Изменяем высоту объекта Text1 в соответствии с объектом CheckBox1.

Код


GetObjectInfo "CheckBox1" "Height" "[CheckBox1Height]"
SizeObject "Text1" "-1" "[CheckBox1Height]"


Весь этот код мы помещаем к примеру в свойства страницы, или в свойства проекта на вкладку Запуск, или если планируется менять параметры шрифта во время работы программы, то туда где мы будем менять параметры шрифта. Если шрифт менять не планируется, то этот код можно не выполнять, а сразу установить параметры шрифта объекта CheckBox1 такие же как и у объекта Text1.

Дальнейший код выполняется в зависимости от того как будет вводится текст в объект Text1.

Предположим что в объекте Text1 будет переменная [Text] которой мы будем присваивать нужный нам текст. Соответственно в объекте CheckBox1 в поле "Заголовок" должна так же быть эта переменная.

Для наглядности создайте объект "Поле ввода текста". Задайте переменную (содержимого) тоже [Text] .
Перейдите в раздел "Команды" и на вкладке "Text Change" введите следующий код

Код
GetObjectInfo "CheckBox1" "Width" "[CheckBoxWidth]"

SizeObject "Text1" "[CheckBoxWidth]" "[CheckBox1Height]"


Теперь по мере ввода текста объект Text1 будет изменять свои размеры в соответствии с размером текста.

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

Значит нам нужно заменить команду

Код

SizeObject "Text1" "[CheckBoxWidth]" "[CheckBox1Height]"


на условие

Код
If "[CheckBoxWidth]" "<=" "300"
    SizeObject "Text1" "[CheckBoxWidth]" "[CheckBox1Height]"
    StrLen "[Text]" "[StrLenDefault]"
Else

EndIf


где в переменной [StrLenDefault] будет содержаться длина текста. Количество символов. Строк же может получится не только две, а три и более. Для этого нам нужно определить количество символов которое умещается в объекте размером в 300 пискселей.

Когда размер объекта превысит 300 пикселей эта переменная будет содержать то количество символов которое может уместится в объекте такого размера. Теперь нам нужно изменить его высоту в соответствии с количеством строк.

Высота объекта CheckBox1 нам известна. Она находится в переменной [CheckBox1Height]. Эта высота соответствует одной строке.

Добавим условие которое будет выполняться когда длина объекта превышает допустимый размер.

Код
If "[CheckBoxWidth]" "<=" "300"
    SizeObject "Text1" "[CheckBoxWidth]" "[CheckBox1Height]"
    StrLen "[Text]" "[StrLenDefault]"
Else
    StrLen "[Text]" "[StrLen]"
    Math "Trunc([StrLen]/[StrLenDefault])" "-1" "[NumberLines]"
    SizeObject "Text1" "300" "([NumberLines]+1)*[CheckBox1Height]"
EndIf


В переменную [StrLen] мы получаем текущую длину текста.
Математическим вычислением Trunc([StrLen]/[StrLenDefault]) мы получаем целое значение с округлением в меньшую сторону. То есть 1,9 =1; 1,2=1 и т.д.

Так как мы получаем округление в меньшую сторону, то к полученному результату прибавляем еще одну строку и умножаем на высоту объекта CheckBox1.

Это я описал один из возможных результатов если текст не имеет переноса строки.
Так как объект CheckBox поддерживает перенос строки, то это не самый лучший вариант вычисления высоты. Но для общего развития тоже сгодится. :)

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

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

Для этого составляем какую нибудь строку типа ФШфш
При запуске проекта выполняем что то типа

Код
SetVar "[Text]" "ФШфш"
While "[CheckBoxWidth]" "<=" "300"
    SetVar "[Text]" "[Text][#32]"
    GetObjectInfo "CheckBox1" "Width" "[CheckBoxWidth]"
EndWhile
StrLen "[Text]" "[StrLenDefault]"


Тем самым получаем количество символов по умолчанию в переменную [StrLenDefault].

Далее в нашем примере в разделе "Команды" и на вкладке "Text Change" в объекте TextEntry введите следующий код

Код
StrReplace "[Text]" "[#13][#10]" "[#32]" "[Text]" ""
StrReplace "[Text]" "[#13]" "[#32]" "[Text]" ""

StrLen "[Text]" "[StrLen]"
Math "Trunc([StrLen]/[StrLenDefault])" "-1" "[NumberLines]"
SetVar "[NumberLines]" "[NumberLines]+1"
Loop "1" "[NumberLines]" "[i]"
    Math "[StrLenDefault]*[i]" "0" "[Number]"
    StrIns "[#13]" "[Text]" "[Number]" "[Text]"
EndLoop

GetObjectInfo "CheckBox1" "Width" "[CheckBoxWidth]"
GetObjectInfo "CheckBox1" "Height" "[CheckBoxHeight]"
SizeObject "Text1" "[CheckBoxWidth]" "[CheckBoxHeight]"


Первые две строчки кода удаляют возможные в тексте переносы строк. Они могут быть как [#13][#10], так и только [#13]. Заменяем их на пробелы.

Ну а далее думаю понятно, получаем длину всего текста, делим на количество символов по умолчанию, прибавляем еще одну строку, и вставляем переносы строк в наш текст. Получаем размеры чекбокса и присваиваем нашему объекту Text1.

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

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

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

Добавлено (07 Января 2016, 01:47)
---------------------------------------------
Кстати точно так же с помощью объекта CheckBox можно изменять высоту объекта ListBox.
Только для того чтобы не прибавлялась лишняя высота в объекте ListBox, нужно из высоты объекта CheckBox вычесть два пикселя и умножить на количество строк. ;)


Не хочешь читать хелп?

Если хелп и форум не помогли, тогда все ответы здесь



Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
 
Сообщение
Quote (MicroCip)
DEMBEL, сейчас попробую


А здесь че, не понятно объяснил?

Quote (mishem)
нужно посчитать количество символов, и умножить на ширину символа.

Добавлено (07 Января 2016, 01:36)
---------------------------------------------
Вернулся к этому вопросу. Лучше поздно чем никогда. Где то мы уже решали этот вопрос с помощью чекбокса.

Создаем где нибудь за пределами окна объект чекбокс. В нашем случае его имя будет CheckBox1.
Создаем объект Надпись\Текст. В нашем случае его имя будет Text1.

В первую очередь нам нужно узнать размер, стиль и название шрифта объекта Text1.

Код
GetObjectInfo "Text1" "FontSize" "[FontSize]"
GetObjectInfo "Text1" "FontName" "[FontName]"
GetObjectInfo "Text1" "FontStyle" "[FontStyle]"


Далее нам нужно те же параметры шрифта присвоить объекту CheckBox1.

Код
SetObjectFont "CheckBox1" "Black" "[FontName]" "[FontSize]" "[FontStyle]" "DEFAULT_CHARSET"


Так как мы изменили параметры шрифта, то и высота объекта CheckBox1 так же изменилась.
Изменяем высоту объекта Text1 в соответствии с объектом CheckBox1.

Код


GetObjectInfo "CheckBox1" "Height" "[CheckBox1Height]"
SizeObject "Text1" "-1" "[CheckBox1Height]"


Весь этот код мы помещаем к примеру в свойства страницы, или в свойства проекта на вкладку Запуск, или если планируется менять параметры шрифта во время работы программы, то туда где мы будем менять параметры шрифта. Если шрифт менять не планируется, то этот код можно не выполнять, а сразу установить параметры шрифта объекта CheckBox1 такие же как и у объекта Text1.

Дальнейший код выполняется в зависимости от того как будет вводится текст в объект Text1.

Предположим что в объекте Text1 будет переменная [Text] которой мы будем присваивать нужный нам текст. Соответственно в объекте CheckBox1 в поле "Заголовок" должна так же быть эта переменная.

Для наглядности создайте объект "Поле ввода текста". Задайте переменную (содержимого) тоже [Text] .
Перейдите в раздел "Команды" и на вкладке "Text Change" введите следующий код

Код
GetObjectInfo "CheckBox1" "Width" "[CheckBoxWidth]"

SizeObject "Text1" "[CheckBoxWidth]" "[CheckBox1Height]"


Теперь по мере ввода текста объект Text1 будет изменять свои размеры в соответствии с размером текста.

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

Значит нам нужно заменить команду

Код

SizeObject "Text1" "[CheckBoxWidth]" "[CheckBox1Height]"


на условие

Код
If "[CheckBoxWidth]" "<=" "300"
    SizeObject "Text1" "[CheckBoxWidth]" "[CheckBox1Height]"
    StrLen "[Text]" "[StrLenDefault]"
Else

EndIf


где в переменной [StrLenDefault] будет содержаться длина текста. Количество символов. Строк же может получится не только две, а три и более. Для этого нам нужно определить количество символов которое умещается в объекте размером в 300 пискселей.

Когда размер объекта превысит 300 пикселей эта переменная будет содержать то количество символов которое может уместится в объекте такого размера. Теперь нам нужно изменить его высоту в соответствии с количеством строк.

Высота объекта CheckBox1 нам известна. Она находится в переменной [CheckBox1Height]. Эта высота соответствует одной строке.

Добавим условие которое будет выполняться когда длина объекта превышает допустимый размер.

Код
If "[CheckBoxWidth]" "<=" "300"
    SizeObject "Text1" "[CheckBoxWidth]" "[CheckBox1Height]"
    StrLen "[Text]" "[StrLenDefault]"
Else
    StrLen "[Text]" "[StrLen]"
    Math "Trunc([StrLen]/[StrLenDefault])" "-1" "[NumberLines]"
    SizeObject "Text1" "300" "([NumberLines]+1)*[CheckBox1Height]"
EndIf


В переменную [StrLen] мы получаем текущую длину текста.
Математическим вычислением Trunc([StrLen]/[StrLenDefault]) мы получаем целое значение с округлением в меньшую сторону. То есть 1,9 =1; 1,2=1 и т.д.

Так как мы получаем округление в меньшую сторону, то к полученному результату прибавляем еще одну строку и умножаем на высоту объекта CheckBox1.

Это я описал один из возможных результатов если текст не имеет переноса строки.
Так как объект CheckBox поддерживает перенос строки, то это не самый лучший вариант вычисления высоты. Но для общего развития тоже сгодится. :)

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

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

Для этого составляем какую нибудь строку типа ФШфш
При запуске проекта выполняем что то типа

Код
SetVar "[Text]" "ФШфш"
While "[CheckBoxWidth]" "<=" "300"
    SetVar "[Text]" "[Text][#32]"
    GetObjectInfo "CheckBox1" "Width" "[CheckBoxWidth]"
EndWhile
StrLen "[Text]" "[StrLenDefault]"


Тем самым получаем количество символов по умолчанию в переменную [StrLenDefault].

Далее в нашем примере в разделе "Команды" и на вкладке "Text Change" в объекте TextEntry введите следующий код

Код
StrReplace "[Text]" "[#13][#10]" "[#32]" "[Text]" ""
StrReplace "[Text]" "[#13]" "[#32]" "[Text]" ""

StrLen "[Text]" "[StrLen]"
Math "Trunc([StrLen]/[StrLenDefault])" "-1" "[NumberLines]"
SetVar "[NumberLines]" "[NumberLines]+1"
Loop "1" "[NumberLines]" "[i]"
    Math "[StrLenDefault]*[i]" "0" "[Number]"
    StrIns "[#13]" "[Text]" "[Number]" "[Text]"
EndLoop

GetObjectInfo "CheckBox1" "Width" "[CheckBoxWidth]"
GetObjectInfo "CheckBox1" "Height" "[CheckBoxHeight]"
SizeObject "Text1" "[CheckBoxWidth]" "[CheckBoxHeight]"


Первые две строчки кода удаляют возможные в тексте переносы строк. Они могут быть как [#13][#10], так и только [#13]. Заменяем их на пробелы.

Ну а далее думаю понятно, получаем длину всего текста, делим на количество символов по умолчанию, прибавляем еще одну строку, и вставляем переносы строк в наш текст. Получаем размеры чекбокса и присваиваем нашему объекту Text1.

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

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

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

Добавлено (07 Января 2016, 01:47)
---------------------------------------------
Кстати точно так же с помощью объекта CheckBox можно изменять высоту объекта ListBox.
Только для того чтобы не прибавлялась лишняя высота в объекте ListBox, нужно из высоты объекта CheckBox вычесть два пикселя и умножить на количество строк. ;)


Автор - mishem
Дата добавления - 07 Января 2016 в 01:47
ВадимДата: Чт, 07 Января 2016, 22:24 | Сообщение # 13
Генератор идей
Цитата mishem ()
Вернулся к этому вопросу.
Прикольно! Ни разу не требовалось, но для общего развития - интересно!

Кстати, если разнородное форматирование в объекте Text не требуется, то можно просто вместо него использовать CheckBox (или RadioButton), прикрыв чем-нибудь "гнездо для отметки", чтобы пользователю не было видно, что это не текстовой объект.


Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)

Сообщение отредактировано
Вадим - Чт, 07 Января 2016, 22:26
 
Сообщение
Цитата mishem ()
Вернулся к этому вопросу.
Прикольно! Ни разу не требовалось, но для общего развития - интересно!

Кстати, если разнородное форматирование в объекте Text не требуется, то можно просто вместо него использовать CheckBox (или RadioButton), прикрыв чем-нибудь "гнездо для отметки", чтобы пользователю не было видно, что это не текстовой объект.

Автор - Вадим
Дата добавления - 07 Января 2016 в 22:24
  • Страница 1 из 1
  • 1
Поиск: