• 0
Вадим Смоленский

AutoSize работает иначе под Tokyo!

Вопросы

Перейдя с Берлина на Токио, столкнулся с неприятным феноменом. Раньше, выводя на экран форму с обилием TLabel, которые нужно было заполнить текстом и выровнять, я спокойно ставил везде AutoSize=True, присваивал нужные значения полям Text, после чего ширина каждого TLabel принимала новое значение, и мой код их красиво выравнивал. Теперь же ширина не меняется до полной отрисовки на экране всего и вся. Соответственно, на этапе выравнивания код оперирует со значениями ширины, которые были еще на этапе дизайна. Как следствие - всё наперекосяк! Что делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 ответов на этот вопрос

  • 0

а этап выравнивания это когда?

может, найти другой момент для расчетов? типа onresize 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

а этап выравнивания это когда?

У меня так: есть некий фрейм, до поры невидимый. По определенному событию (щелчок по кнопке) все TLabel на фрейме заполняются текстом и свойство Visible фрейма переводится в True. В Tokyo получается так, что пока фрейм невидим, размеры TLabel не меняются, невзирая на AutoSize.

Какой здесь может быть другой момент для расчетов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
16 минут назад, Вадим Смоленский сказал:

а этап выравнивания это когда?

У меня так: есть некий фрейм, до поры невидимый. По определенному событию (щелчок по кнопке) все TLabel на фрейме заполняются текстом и свойство Visible фрейма переводится в True. В Tokyo получается так, что пока фрейм невидим, размеры TLabel не меняются, невзирая на AutoSize.

Какой здесь может быть другой момент для расчетов?

для фрейма пробовал

procedure PreloadContent(const Control: TControl);
var
  I: Integer;
begin
  if Control is TStyledControl then
    TStyledControl(Control).ApplyStyleLookup;
  for I := 0 to Control.ControlsCount - 1 do
    PreloadContent(Control.Controls);
end;

 

Или каждый лейбл пересчитать кодом по ширине/высоте до отображения - есть процедурки соответствующие.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

FREEFAR, спасибо, ApplyStyleLookup прекрасно помог!

(пробовал здесь поаккуратнее переписать ваш код, но скрипту почему-то не понравилось)

Изменено пользователем Вадим Смоленский

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 часа назад, Вадим Смоленский сказал:

а этап выравнивания это когда?

У меня так: есть некий фрейм, до поры невидимый. По определенному событию (щелчок по кнопке) все TLabel на фрейме заполняются текстом и свойство Visible фрейма переводится в True. В Tokyo получается так, что пока фрейм невидим, размеры TLabel не меняются, невзирая на AutoSize.

Какой здесь может быть другой момент для расчетов?

С таким сталкивался. Но в более сложных вариациях.. там даже свойство (объект внутри компонента) может быть не создан до первой отрисовки. Приходилось комбинации всяких мероприятий (в том числе Application.ProcessMessage) делать без обращением к компонентам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

если у меня три панели и две из них невидимы, то это сильно влияет на размеры и положение третьей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
22 часа назад, krapotkin сказал:

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

если у меня три панели и две из них невидимы, то это сильно влияет на размеры и положение третьей

Неочевидного хватает. Радует, что пока так или иначе это побеждается. VCL со своей вылизанностью и близко не подпускает FMX )) .. хотя ряд вещей "искоропки" радует

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 14.12.2017 в 16:55, FREEFAR сказал:

procedure PreloadContent(const Control: TControl);
var
  I: Integer;
begin
  if Control is TStyledControl then
    TStyledControl(Control).ApplyStyleLookup;
  for I := 0 to Control.ControlsCount - 1 do
    PreloadContent(Control.Controls);
end;

Berlin ругается при компиляции на вот эту строку: PreloadContent(Control.Controls);

Incompatible types: 'TControl' and 'System.Generics.Collections.TList<FMX.Controls.TControl>'

Что не так у меня?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
control.controls[i]

 

Изменено пользователем krapotkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Похожий контент

    • От Вадим Смоленский
      В своем проекте (это японско-русский словарь) мне приходится выводить на TImage.Bitmap.Canvas хранящиеся в юникоде иероглифы, причем шрифт пользователь может выбрать сам. Столкнулся с неприятным явлением: разные шрифты располагают выводимый символ на разной высоте, в результате чего иероглиф часто не вписывается в предназначенную для него область. По умолчанию принят шрифт Tahoma, с ним всё хорошо:

      Но вот шрифт Yu Mincho:

      А вот, еще хлеще, Kozuka Gothic:

      Вопрос: что за параметр регулирует вертикальное смещение, можно ли его вынуть и с ним работать?
    • От Вадим Смоленский
      Некоторые юзеры (видимо, из близоруких) прибегают к масштабированию экрана и требуют, чтобы ваше приложение тоже масштабировалось. Когда мой проект был в VCL, я смотрел на параметр Screen.PixelsPerInch и учитывал его значение в своем коде. В FireMonkey этого нет. Я пытался понять, как это делать теперь, и окончательно запутался. Microsoft на официальном сайте упоминает функцию SystemParametersInfo с параметром SPI_GETLOGICALDPIOVERRIDE, но делает оговорку, что такую конфигурацию лучше не использовать - дескать, в новых версиях Windows она не будет работать. Взамен рекомендуют функцию GetScaleFactorForDevice, но тут же заявляют, что под Windows 8 и она работать не будет, а будет работать только GetScaleFactorForMonitor. Голова кругом. Нет ли у кого, случаем, готового решения, которое работало бы на любых Windows - хотя бы от семерки до десятки?
      Еще один момент, который я не могу понять - в Windows 10 в настройках экрана, помимо масштаба в процентах, можно выбирать еще и разрешение в пикселях. По-моему, раньше такого разделения не было, хотя могу ошибаться. Связаны ли эти настройки друг с другом? И как они соотносятся со старым добрым DPI?
    • От Вадим Смоленский
      Работая в Berlin, подправил стиль для одного компонента посредством вызова "Edit Custom Style" во всплывающем меню. Потом перешел на Tokyo; потом поменял компьютер и установил на него Tokyo заново. Сейчас вижу, что компонент отображается в стиле по умолчанию. Никаких сообщений по поводу пропавшего стиля не припомню. Где мне найти и как опять подключить мой отредактированный стиль?
    • От Вадим Смоленский
      В своем проекте (это японско-русский словарь) я часто вывожу текст на TImage методом TCanvas.FillText, и результат выглядит так:

      Один из тестеров, у которого установлена Windows XP, прислал скриншот того, что выводится у него:

      Ровно такую же безобразную картину я видел у себя, когда, экспериментируя с быстродействием, вставлял в файл dpr операторы  FMX.Types.GlobalUseDX:=False или FMX.Types.GlobalUseDirect2D:=False
      То ли в XP эти установки приняты по умолчанию, то ли так сконфигурирована система у тестера. Первое, что приходит в голову - вставить в код присвоение обеим упомянутым переменным значения True. Но прежде, чем предпринять такую попытку, хотелось бы услышать мнение экспертов. В чем здесь корень зла?
    • От Вадим Смоленский
      Записываю русский текст в файл:
      procedure WriteToFile; var F: TextFile; S: string; begin S:='Русский текст'; AssignFile(F,MyFile.txt'); ReWrite(F); WriteLn(F,S); CloseFile(F); end; Тип данных string - по идее, то же, что WideString. То бишь, в строку S записан юникод. Тем не менее, открывая потом файл, вижу, что русский текст сохранен в ANSI. Как добиться его сохранения в юникоде?
    • От Вадим Смоленский
      Писал на Delphi 10.2 Tokyo под Windows. У тестеров приложение валится при первой же попытке обращения к БД с сообщением "unable to open database file". У меня на компе всё нормально. Файл sqlite3.dll версии 3.21.0.0 в дистрибутив включен, кладется рядом с исполнимым файлом. Что может быть не так?
    • От Вадим Смоленский
      В своем VCL-проекте я использовал оригинальный способ застраховаться от повторного запуска приложения. Обычно это делают через Mutex. Но умные люди на experts-exchange.com много лет назад посоветовали мне следующее:
      // в главном окне: protected procedure CreateParams(var Params: TCreateParams); override; procedure TMyApp.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.WinClassName:='MyAPP String ID'; end; // В файле .dpr: var AWnd, A1Wnd: HWND; AWnd:=FindWindow('MyApp String ID',nil); if IsWindow(AWnd) then begin A1Wnd := GetWindow(AWnd, GW_OWNER); if IsWindow(A1Wnd) then AWnd := A1Wnd; ShowWindow(AWnd, SW_RESTORE); SetForegroundWindow(AWnd); end else begin Application.Initialize; ....... end Способ хорош тем, что он не просто блокирует повторный запуск, а выводит уже запущенное приложение на передний план, тычет юзера в него носом. Но при переходе на FireMonkey возникла закавыка: компилятору не нравится TCreateParams. Говорит: undeclared identifier. Чем бы его заменить?
    • От Вадим Смоленский
      Windows, Berlin. Когда TWebBrowser на форме получает фокус, он начинает перехватывать все нажатия клавиш. До FormKeyDown управление уже не доходит. Отключение свойства браузера CanFocus не помогает, своего события OnKeyDown у него нет. Как быть? В идеале хотелось бы оставить браузеру навигационные клавиши (стрелки, PgDn, PgUp, Home, End), но все остальные отправлять на форму. Возможно ли это?
    • От Вадим Смоленский
      Работаю в Windows с FireDAC (SQLite). При каждом обращении к базе данных экранный курсор превращается в песочные часы с надписью SQL. Пользователи моего продукта далеки от программирования и ни про какой SQL не слыхивали, им это совершенно ни к чему. Как мне подавить этот феномен? В свойствах TFDConnection я ничего на эту тему не нахожу...
    • От Вадим Смоленский
      Мастерю из TRectangle всплывающую подсказку с тенью и анимацией (увеличиваю Opacity от 0 до 1). Без TFloatAnimation тень нормально отображается, а с анимацией пропадает. Действительно ли здесь есть какие-то ограничения, или проблему можно решить?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу