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

Лидеры

  1. enatechno

    enatechno

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


    • Баллы

      8

    • Постов

      181


  2. Равиль Зарипов (ZuBy)

    Равиль Зарипов (ZuBy)

    Модераторы


    • Баллы

      5

    • Постов

      2 517


  3. Brovin Yaroslav

    Brovin Yaroslav

    Администраторы


    • Баллы

      2

    • Постов

      2 124


  4. kami

    kami

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


    • Баллы

      2

    • Постов

      643


Популярный контент

Показан контент с высокой репутацией 17.03.2017 во всех областях

  1. 1 Вариант. Заменой удаления фреймов на скрытие (подправленный проект приложил). 2 Вариант. Расположить панель с кнопкой Back на главной форме, а не дублировать ее в каждом фрейме. (При необходимости саму кнопку Back можно скрывать при возврате на первый таб). 3 Вариант. Использовать отложенное удаление фрейма). ... и еще много разных вариантов. Click; FPressed := False; StartTriggerAnimation(Self, 'Pressed') Отладчик выдал ошибку в методе объекта TControl (в Вашем случае это кнопка SpeedButton1 на фрейме). В этом методе в Click вы удаляете Frame, а значит и кнопку на ней. А в строке StartTriggerAnimation(Self, 'Pressed'); вы обращаетесь к этой удаленной кнопке (Self). Здесь и происходит AV. test2.zip
    4 балла
  2. if (TabControl1.ActiveTab = TabItem1) then if (FFrame <> nil) then begin FFrame.Parent := nil; FFrame.DisposeOf; FFrame := nil; end; вместо этого написать: if (TabControl1.ActiveTab = TabItem1) then if Assigned(FFrame) then begin FFrame.Release; FFrame := nil; end; Этого будет достаточно, чтобы завершились все обработчики событий и в то же время не было новых обращений к этому фрейму. Кстати, вам уже рекомендовалось использовать именно Release. Но, видимо, вам нравятся кактусы.
    2 балла
  3. Brovin Yaroslav

    Изменение размеров формы

    Пример в студию
    1 балл
  4. Brovin Yaroslav

    Изменение размеров формы

    В каком момент и где присваиваете высоту?
    1 балл
  5. Метод Release как раз нужно использовать когда удаляешь "сам из себя" На пальцах это выглядит так: при вызове метода Release объект помещается в список/очередь запускается таймер с интервалом 10 мсек, в котором идёт очистка этой очереди при очистке используется метод DisposeOf Не нужно везде использовать этот метод, только при крайней необходимости
    1 балл
  6. Как определили что поток не запускается на другом ПК? И что значит " Поток должен мониторить визуальный компонент"?
    1 балл
  7. такс видимо вы не совсем понимаете... компилировать под эмулятор вы можете без сертификата, НО вы не можете этот файл выложить в App Store для того чтобы выложить в App Store, вам нужно приобрести сертификат разработчика, выполнить то что я описал в первом сообщении настроить проект Project - Options - Version Info CFBundleIdentifier - информация из App IDs CFBundleSignature - информация из App IDs выставить конфигурацию Application Store настроить Project - Options - Provisioning выбрать провижн файл для проекта и сертификат разработчика только после этого у вас на маке в документах появится IPA файл, который можно загрузить в App Store
    1 балл
  8. 1). Я так понимаю эта строка в модуле фрейма? Похоже на циклическую ссылку. Uses в модуле фрейма ссылается на Form1, а Form1 ссылается на модуль фрейма? 2). Вы создаете фрейм каждый раз при открытии TabItem2? Много ли контролов на фрейме? Создание фрейма с контролами в рантайм на андроиде - затратная по времени операция. Если программа использует не много фреймов, то я бы не создавал/удалял каждый раз фрейм при смене таба, а использовал фрейм созданный один раз. Это улучшит отзывчивость программы. Ну а причина зависания - то, что вы в процедуре обработчика кнопки фрейма OnClick вызываете TForm1.TabControl1Change и там удаляете этот фрейм и саму кнопку.
    1 балл
  9. У TBitmap есть такой метод, посмотрите его function TBitmap.EqualsBitmap(const Bitmap: TBitmap): Boolean; var MyMap, BitmapMap: TBitmapData; I: Integer; begin if IsEmpty or Bitmap.IsEmpty then begin Result := IsEmpty and Bitmap.IsEmpty; Exit; end; Result := (Width = Bitmap.Width) and (Height = Bitmap.Height) and (PixelFormat = Bitmap.PixelFormat); if Result then begin if Map(TMapAccess.Read, MyMap) then try if Bitmap.Map(TMapAccess.Read, BitmapMap) then try for I := 0 to Height - 1 do if not CompareMem(MyMap.GetScanline(I), BitmapMap.GetScanline(I), MyMap.BytesPerLine) then begin Result := False; Exit; end; finally Bitmap.Unmap(BitmapMap); end; finally Unmap(MyMap); end; end; end;
    1 балл
  10. enatechno

    OnCreate для фрейма

    Да. constructor Create(AOwner: TComponent); override;
    1 балл
  11. enatechno

    FDQuery & LocalUpdate

    FDQuery1.CachedUpdates := True; подробнее тут
    1 балл
  12. ENERGY

    Странное поведение TThread

    Еще мультипоточный вариант отсюда: class procedure TFireMonkey.CachePictures(const aLV: TListView); begin Pool.SetMaxWorkerThreads(10); // TThreadPool.Default.MaxWorkerThreads TParallel.For(0, FMembersList.Count - 1, procedure(Idx: Integer) var AHTTP: TIdHTTP; begin if not FileExists(FMembersList[Idx].FileName) then begin AHTTP := TIdHTTP.Create(nil); try AHTTP.HandleRedirects := true; FStreamList[Idx].Clear; AHTTP.Get(FMembersList[Idx].URL, FStreamList[Idx]); finally FreeAndNil(AHTTP); end; TThread.Queue(TThread.CurrentThread, procedure var AItem: Integer; begin if FStreamList[Idx].Size > 0 then begin FStreamList[Idx].SaveToFile(FMembersList[Idx].FileName); AItem := Trunc(Idx / aLV.Columns); if AItem < aLV.Items.Count then aLV.Adapter.ResetView(aLV.Items[AItem]); end; Log.d('Current Thread = ' + inttostr(Idx)); end); end; end, Pool); end; После загрузки ставьте boolean флаг в своем массиве, обозначающий что картинка загружена. Btw Boolean у Intel и ARM можно записывать и читать без синхронизации между потоками (Т.е. не нужно использовать TMonitor или AtomicExchange ), если он не в packed структуре (packed record).
    1 балл
  13. я вот сейчас еще раз проверил. Всё, что кидалось в Deployment, - в apk-файле находится в папке assets. А то, что подключалось через ресурсы (brcc32), то находится в .so-файле. Delphi 10.1 Berlin. Можете сами проверить
    1 балл
  14. procedure LoadBitmapFromURL(const aURL: string; aBitmap: TBitmap; const aSuccess: TThreadProcedure = nil; const aError: TThreadProcedure = nil); var thread: TThread; begin thread := TThread.CreateAnonymousThread( procedure var HTTP: THTTPClient; Result: TMemoryStream; begin Result := TMemoryStream.Create; HTTP := THTTPClient.Create; try try HTTP.Get(aURL, Result); TThread.Synchronize(TThread.CurrentThread, procedure var aSourceBmp: TBitmap; begin aSourceBmp := TBitmap.Create; try aSourceBmp.LoadFromStream(Result); if not aSourceBmp.IsEmpty then begin aBitmap.SetSize(aSourceBmp.Width, aSourceBmp.Height); aBitmap.CopyFromBitmap(aSourceBmp); if Assigned(aSuccess) then aSuccess; end; finally FreeAndNil(aSourceBmp); end; end); except TThread.Synchronize(TThread.CurrentThread, procedure begin if Assigned(aError) then aError; end); end; finally FreeAndNil(Result); FreeAndNil(HTTP); end; end); thread.FreeOnTerminate := true; thread.start; end; в последнее время пользуюсь такой конструкцией
    1 балл
  15. само скачивание картинки HTTPClient.Get должен быть в потоке, а при успешном скачивании нужно делать синхронизацию с главным потоком и "вставлять" картинку в нужное место
    1 балл
  16. enatechno

    Странное поведение TThread

    Synchronize(LoadImage); Эта строка означает, что LoadImage выполняется в главном потоке (для каждой картинки!). Для примера посмотрите эту тему:
    1 балл
  17. Ну да, конкретно с калькулятором такой финт не прокатит, он явно запоминает свою позицию перед закрытием, а затем при запуске её восстановление происходит уже после применения заданных в CreateProcess параметров позиции. А вообще работает, например, если запустить своё же приложение, разумеется если в нём нет установки координат после запуска. Можно и MoveWindow или SetWindowPos использовать после запуска, только тогда придётся получить хендл окна.
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...