Перейти к содержанию
Fire Monkey от А до Я

AngryOwl

Пользователи
  • Постов

    394
  • Зарегистрирован

  • Посещение

  • Победитель дней

    45

Активность репутации

  1. Like
    AngryOwl отреагировална Brovin Yaroslav в [TMultiView] Как избежать задержки при первом появлении TMultiView?   
    Так, я посмотрел. Сохраняем себе такую процедуру:
    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[I]); end; Она форсирует загрузку стилей. Задержка при появлении TMutliView заключается в том, что стиль загружается не сразу у любого контрола, а только по мере появления контрола. Обычно это происходит при первой отрисовки. Это правило касается всех контролов.
     
    Поэтому, в этом случае, вам нужно форсировать загрузку стилей. Это можно сделать при помощи моей процедуру PreloadContent.
    Добавьте в TForm.OnCreate и это решит задержку при первом появлении:
    PreloadContent(MultiView1);
  2. Like
    AngryOwl отреагировална Brovin Yaroslav в [TMultiView] Как избежать задержки при первом появлении TMultiView?   
    Задержка пропадает, если использовать этот код в TForm.OnShow?
    var Buffer: TBitmap; begin // Draw to Bitmap force to load all styles, measure size, build font-glyphs etc Buffer := TBitmap.Create(1, 1); try Buffer.Canvas.BeginScene; try MultiView.PaintTo(Buffer.Canvas, Control.LocalRect); finally Buffer.Canvas.EndScene; end; finally Buffer.DisposeOf; end;
  3. Like
    AngryOwl отреагировална zairkz в Более быстрая альтернатива DrawBitmap   
    Попробуй движок Shadow Engine для Firemonkey, FPS впечатляет.
    https://www.youtube.com/watch?v=w6lGasU61HQ
     
    Gihub: https://github.com/dimsa/ShadowEngine
  4. Like
    AngryOwl получил реакцию от DimArt в Целесообразно ли использовать Synchronize для отрисовки   
    Сталкивались. По началу очень много))
     
    Приложение, активно использующее GUI, то бишь всякие прогресс-бары, видео, большое кол-во элементов с картинками и т.д. и т.п., требует обязательного использования TThread.Synchronize.
    Иначе вы можете сначала ничего не заметить, может не быть никаких глюков и т.п.. А потом они могут так же внезапно появиться. Может быть такое, что у Вас их не будет (глюков), а на другом компе - будут. Может зависеть от множества факторов.
    НО!
    Стоит отметить, что если тот или иной элемент интерфейса не требует именно "моментального" отображения информации (например простое отображение нового значения TLabel), и в данный момент у Вас не происходит ничего активного на форме приложения (например - вывод видео или частая смена картинок и т.п.), то, конечно, делать синхронизацию не обязательно. Однако, это может привести в дальнейшем к непониманию возникновения багов, в том случае если ваш код изменится и появится что-то "тяжелое" для отрисовки.
    Эти баги могут быть не явными. Т.е. вы, например, делаете обновление TLabel при "загрузке" чего-либо и обновлении TProgressBar, а текст (новое значение) не отображается. А вот если сделать обновление TLabel и TProgressBar в TThread.Synchronize, то все будет ок.
    Тут есть еще одно НО )))
    Оно заключается в том, чтобы процесс "обновления" был оптимизирован. Это как слишком частый вызов Application.ProcessMessage в процедуре выполняющий вычисления - будут приличные тормоза!
    Пишите код оптимально. Не делайте лишних вызовов TThread.Synchronize, но и не забывайте о них...
     
    Как-то так)
  5. Like
    AngryOwl отреагировална Kitty в Release Notes for XE8 Update 1   
    Release Notes for XE8 Update 1
    http://docwiki.embarcadero.com/RADStudio/XE8/en/Release_Notes_for_XE8_Update_1
    fix list:
    http://edn.embarcadero.com/article/44470
     
  6. Like
  7. Like
    AngryOwl получил реакцию от Rusland в Целесообразно ли использовать Synchronize для отрисовки   
    Сталкивались. По началу очень много))
     
    Приложение, активно использующее GUI, то бишь всякие прогресс-бары, видео, большое кол-во элементов с картинками и т.д. и т.п., требует обязательного использования TThread.Synchronize.
    Иначе вы можете сначала ничего не заметить, может не быть никаких глюков и т.п.. А потом они могут так же внезапно появиться. Может быть такое, что у Вас их не будет (глюков), а на другом компе - будут. Может зависеть от множества факторов.
    НО!
    Стоит отметить, что если тот или иной элемент интерфейса не требует именно "моментального" отображения информации (например простое отображение нового значения TLabel), и в данный момент у Вас не происходит ничего активного на форме приложения (например - вывод видео или частая смена картинок и т.п.), то, конечно, делать синхронизацию не обязательно. Однако, это может привести в дальнейшем к непониманию возникновения багов, в том случае если ваш код изменится и появится что-то "тяжелое" для отрисовки.
    Эти баги могут быть не явными. Т.е. вы, например, делаете обновление TLabel при "загрузке" чего-либо и обновлении TProgressBar, а текст (новое значение) не отображается. А вот если сделать обновление TLabel и TProgressBar в TThread.Synchronize, то все будет ок.
    Тут есть еще одно НО )))
    Оно заключается в том, чтобы процесс "обновления" был оптимизирован. Это как слишком частый вызов Application.ProcessMessage в процедуре выполняющий вычисления - будут приличные тормоза!
    Пишите код оптимально. Не делайте лишних вызовов TThread.Synchronize, но и не забывайте о них...
     
    Как-то так)
  8. Like
    AngryOwl получил реакцию от Brovin Yaroslav в Целесообразно ли использовать Synchronize для отрисовки   
    Сталкивались. По началу очень много))
     
    Приложение, активно использующее GUI, то бишь всякие прогресс-бары, видео, большое кол-во элементов с картинками и т.д. и т.п., требует обязательного использования TThread.Synchronize.
    Иначе вы можете сначала ничего не заметить, может не быть никаких глюков и т.п.. А потом они могут так же внезапно появиться. Может быть такое, что у Вас их не будет (глюков), а на другом компе - будут. Может зависеть от множества факторов.
    НО!
    Стоит отметить, что если тот или иной элемент интерфейса не требует именно "моментального" отображения информации (например простое отображение нового значения TLabel), и в данный момент у Вас не происходит ничего активного на форме приложения (например - вывод видео или частая смена картинок и т.п.), то, конечно, делать синхронизацию не обязательно. Однако, это может привести в дальнейшем к непониманию возникновения багов, в том случае если ваш код изменится и появится что-то "тяжелое" для отрисовки.
    Эти баги могут быть не явными. Т.е. вы, например, делаете обновление TLabel при "загрузке" чего-либо и обновлении TProgressBar, а текст (новое значение) не отображается. А вот если сделать обновление TLabel и TProgressBar в TThread.Synchronize, то все будет ок.
    Тут есть еще одно НО )))
    Оно заключается в том, чтобы процесс "обновления" был оптимизирован. Это как слишком частый вызов Application.ProcessMessage в процедуре выполняющий вычисления - будут приличные тормоза!
    Пишите код оптимально. Не делайте лишних вызовов TThread.Synchronize, но и не забывайте о них...
     
    Как-то так)
  9. Like
    AngryOwl отреагировална Brovin Yaroslav в Разработка настольной версии клиента для форума по FireMonkey с использованием FireMonkey   
    Приступил к разработке клиента с использованием FireMonkey для форума. В будущем код будет открытым и каждый сможет посмотреть, как реализованы те или иные вещи.
    А пока пара скриншотов:

  10. Like
    AngryOwl отреагировална Martifan в Получить голос из микрофона потоками   
    Доброго времени сутки
    недавно для себя открыл что можно из микрофона получить данные потоками:
    Uses    ..., Androidapi.JNI.Media;   procedure TForm1.Button1Click(Sender: TObject); var bufferSize: integer;     buffer: TJavaArray<Byte>;     M: TMemoryStream;   begin   audioRecord := TJAudioRecord.JavaClass.init(TJMediaRecorder_AudioSource.JavaClass.MIC,                                               44100,                                               TJAudioFormat.JavaClass.CHANNEL_IN_MONO,                                               TJAudioFormat.JavaClass.ENCODING_PCM_16BIT,                                               44100 * 2); (audioRecord as JAudioRecord).startRecording;   buffer := TJavaArray<Byte>.Create(8820); (audioRecord as JAudioRecord).read(buffer, 0, 8820);   (audioRecord as JAudioRecord).stop;   audioRecord.release;   buffer заполняется данными я проверил все работает (можно код прописать чтобы этот buffer проигрывал)
    audioRecord := TJAudioRecord.JavaClass.init(TJMediaRecorder_AudioSource.JavaClass.MIC,                                               44100,                                               TJAudioFormat.JavaClass.CHANNEL_IN_MONO,                                               TJAudioFormat.JavaClass.ENCODING_PCM_16BIT,                                               44100 * 2); <--- как мне кажется здесь видно что это формат Wave 
     
     
    я пытаюсь передать это все серверу:
    IdUDPClient1.SendBuffer(IdUDPClient1.Host, IdUDPClient1.Port, RawToBytes(buffer, buffer.Length)); сервер запущен на Windows но не получается я слышу только пикание
     
    Вопрос:
    как мне передать этот поток серверу (среды Windows) и как его проигрывать на сервере, может у кого есть опыт работы с этом сфере или какой нибудь документация имеется или какой нибудь предложение есть как все это сделать все совете и предложении очень важен 
     
    Заранее спасибо согласитесь интересно использовать микрофон так и не дожидая пока он создаст файл
    всем удачи
  11. Like
    AngryOwl отреагировална Andrey Efimov в Как сделать чтобы приложение постоянно висело в памяти и не закрывалось (как будильники)   
    Приложение не закрывается когда вы выходите на рабочий стол, оно продолжает висеть в памяти устройства, но уже с другим приоритетом.
    Хотел было написать на эту тему статью, но ... нагло процитирую слова из первой попавшейся книжки (эту информацию можно найти в справке "Processes and Application Life Cycle"):
     
     
  12. Like
    AngryOwl отреагировална Brovin Yaroslav в [Android] Можно ли создать динамическую заставку загрузки данных?   
    Всем добрый день,
     
    Внесу свои небольшие коррективы. Чтобы сделать сплешскрин, достаточно сделать отложенное создание форм. Другими словами:
    В главном файле проекта создаем только форму сплешскрин и ничего более В форме-заставке уже создаем динамически все остальные формы.  При таком подходе вначале появится заставка, а потом уже будет создание других форм.
  13. Like
    AngryOwl отреагировална DirtyBorov в MaskEdit   
    Случилось так, что потребовался мне ввод номера телефона. Компонента, аналога TMaskEdit в FMX нет, так что пришлось "изобретать на коленке". Компонент писать было лень, потому просто покажу как я решил это в конкретном диалоге с использованием TEdit. Может кому то пригодится. Из кода я убрал все лишнее, оставил только то что относится к делу.
    uses .... System.MaskUtils, System.Character; type TFormRegistry = class(TForm) edtPhone: TEdit; procedure edtPhoneValidating(Sender: TObject; var Text: string); procedure edtPhoneKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); procedure FormCreate(Sender: TObject); procedure edtPhoneEnter(Sender: TObject); procedure edtPhoneTyping(Sender: TObject); private const Mask = '+7(000)000-00-00;0;*'; /// '+0(000)000-00-00;0;*' - для других стран, например для Украины +3(999).... private PhoneNumber: string; function GetCaretPos: Integer; function GetMaxLength: integer; public end; procedure TFormRegistry.FormCreate(Sender: TObject); begin edtPhone.Text := FormatMaskText(Mask, PhoneNumber); end; function TFormRegistry.GetCaretPos: Integer; var i: integer; begin Result := 0; for i := 0 to Mask.Length-1 do begin if not (MaskGetCharType(Mask, i) in [mcDirective, mcMask]) then Result := Result + 1; if (Result + PhoneNumber.Length) = i then Break; end; Result := Result + PhoneNumber.Length - 1; end; function TFormRegistry.GetMaxLength: integer; var i: integer; begin Result := 0; for i := 0 to Mask.Length-1 do if (MaskGetCharType(Mask, i) in [mcMask]) then Result := Result + 1; end; procedure TFormRegistry.edtPhoneKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if (Key = 8) and (PhoneNumber.Length > 0) then PhoneNumber := Copy(PhoneNumber, 1, PhoneNumber.Length-1) else if (PhoneNumber.Length < GetMaxLength) and (Key = 0) and IsDigit(KeyChar) then PhoneNumber := PhoneNumber + KeyChar else KeyChar := #0; end; procedure TFormRegistry.edtPhoneEnter(Sender: TObject); begin edtPhone.CaretPosition := GetCaretPos; end; procedure TFormRegistry.edtPhoneTyping(Sender: TObject); begin edtPhone.CaretPosition := GetCaretPos; end; procedure TFormRegistry.edtPhoneValidating(Sender: TObject; var Text: string); begin Text := FormatMaskText(Mask, PhoneNumber); end; end.
  14. Like
    AngryOwl отреагировална xenon54 в Динамическое создание Label   
    Думаю это вам должно помочь.
    Ну и вот это в догонку.
  15. Like
    AngryOwl получил реакцию от Равиль Зарипов (ZuBy) в Обновление дизайна сайта   
    Профиль - Лайки
    Профиль - Темы
    Профиль - Сообщения
     
    Тексты всех сообщений заползают на названия тем.
     
    (Firefox)
  16. Like
    AngryOwl отреагировална ruslan в Чат со смайлами   
    уверяю Вас - стало только хуже )
  17. Like
    AngryOwl получил реакцию от Martifan в Диалог-окна в 4.4.x стиле (Android)   
    По тексту, не с начала
     
    З.Ы. Хотя это не лучший вариант. Сейчас сам занимаюсь вопросом локализации диалогов...
  18. Like
    AngryOwl получил реакцию от Martifan в Диалог-окна в 4.4.x стиле (Android)   
    Если я Вас правильно понял, то:
    - нужно создать файлик style.xml
    - содержимое файла должно быть типа
    <resources> <style name="MyTheme.NoTitleBar.CustomBackground" parent="@android:Theme.Holo">   <item name="android:windowBackground">@drawable/splash_centered</item>   <item name="android:windowNoTitle">true</item>   <item name="android:windowFullscreen">false</item> </style> </resources> где в Вашем случае главное - @android:Theme.Holo
    - далее этот файл (style.xml) надо задеплоить

     
    Вот. Думаю это то что Вам нужно было.
    Остальные параметры - на Ваше усмотрение.
  19. Like
    AngryOwl получил реакцию от Satellite в Диалог-окна в 4.4.x стиле (Android)   
    Если я Вас правильно понял, то:
    - нужно создать файлик style.xml
    - содержимое файла должно быть типа
    <resources> <style name="MyTheme.NoTitleBar.CustomBackground" parent="@android:Theme.Holo">   <item name="android:windowBackground">@drawable/splash_centered</item>   <item name="android:windowNoTitle">true</item>   <item name="android:windowFullscreen">false</item> </style> </resources> где в Вашем случае главное - @android:Theme.Holo
    - далее этот файл (style.xml) надо задеплоить

     
    Вот. Думаю это то что Вам нужно было.
    Остальные параметры - на Ваше усмотрение.
  20. Like
    AngryOwl получил реакцию от xenon54 в Диалог-окна в 4.4.x стиле (Android)   
    Если я Вас правильно понял, то:
    - нужно создать файлик style.xml
    - содержимое файла должно быть типа
    <resources> <style name="MyTheme.NoTitleBar.CustomBackground" parent="@android:Theme.Holo">   <item name="android:windowBackground">@drawable/splash_centered</item>   <item name="android:windowNoTitle">true</item>   <item name="android:windowFullscreen">false</item> </style> </resources> где в Вашем случае главное - @android:Theme.Holo
    - далее этот файл (style.xml) надо задеплоить

     
    Вот. Думаю это то что Вам нужно было.
    Остальные параметры - на Ваше усмотрение.
  21. Like
    AngryOwl отреагировална Kitty в Черный экран   
    Сейчас при закрытии приложения в RAD XE8 возникает ошибка:
    Segmentation fault(11).
    Понятно, что решение Руслана может помочь (хотя не понятно как перенести на С++) . Не понятно, почему разработчики FMX не приняли меры к решению в новой студии! 
  22. Like
    AngryOwl получил реакцию от Brovin Yaroslav в Как задать windowborderstyle   
    Молодой человек...
    Вы меня удивляете)
    Больше читайте. Посетите блог Андрея Ефимова. Да и здесь информации море.
    Не думаете же Вы что здесь в одном вопросе Вам напишут сразу все... Да и элементарные в общем то вещи...
  23. Like
    AngryOwl получил реакцию от Brovin Yaroslav в Как задать windowborderstyle   
    [sviat] - дать то можно что угодно. но в данном случае мы рискуем нарваться не негодование владельцев форума... так как все это лицензировано.
    (по секрету скажу - на трекерах не пробовали искать?....))
     
    [AndreyS] - можно. легко! Тема уже поднималась на форуме (ща попробую найти)
     
    Не нашел (просто не помню). Может из-за того, что вопрос был не по теме (кстати!)
    Но решение такое:
    Делаете новый элемент стиля

     
    Дальше делаете свою форму без рамок и прозрачной. Размещаете на ней любой элемент (например TPanel) с выравниваем, например, Contents. И задаете этой панеле новый стиль.
    Где элемент Image это

    а его свойства, типа:

     
    Все. Только "поиграйтесь" со значениями BitmapMargins (у меня тени другие)
  24. Like
    AngryOwl получил реакцию от Brovin Yaroslav в Как задать windowborderstyle   
    Достаточно посмотреть любой из примеров стилей.
    Например:


  25. Like
    AngryOwl отреагировална xenon54 в [TidHTTP] Скачивание файлов без замораживания пользовательского интерфейса   
    http://fire-monkey.ru/topic/30-fonovoe-vypolnenie-operatcii-bez-zamorazhivani/
×
×
  • Создать...