Лидеры
Популярный контент
Показан контент с высокой репутацией 17.03.2017 во всех областях
-
Зависает программа, использующая фреймы (Android)
Andrey Efimov и 3 других отреагировал enatechno за вопрос
1 Вариант. Заменой удаления фреймов на скрытие (подправленный проект приложил). 2 Вариант. Расположить панель с кнопкой Back на главной форме, а не дублировать ее в каждом фрейме. (При необходимости саму кнопку Back можно скрывать при возврате на первый таб). 3 Вариант. Использовать отложенное удаление фрейма). ... и еще много разных вариантов. Click; FPressed := False; StartTriggerAnimation(Self, 'Pressed') Отладчик выдал ошибку в методе объекта TControl (в Вашем случае это кнопка SpeedButton1 на фрейме). В этом методе в Click вы удаляете Frame, а значит и кнопку на ней. А в строке StartTriggerAnimation(Self, 'Pressed'); вы обращаетесь к этой удаленной кнопке (Self). Здесь и происходит AV. test2.zip4 балла -
Зависает программа, использующая фреймы (Android)
Равиль Зарипов (ZuBy) и ещё один отреагировал kami за вопрос
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 балла -
1 балл
-
Изменение размеров формы
Menkos1 отреагировал Brovin Yaroslav за вопрос
В каком момент и где присваиваете высоту?1 балл -
Зависает программа, использующая фреймы (Android)
Major отреагировал Равиль Зарипов (ZuBy) за вопрос
Метод Release как раз нужно использовать когда удаляешь "сам из себя" На пальцах это выглядит так: при вызове метода Release объект помещается в список/очередь запускается таймер с интервалом 10 мсек, в котором идёт очистка этой очереди при очистке используется метод DisposeOf Не нужно везде использовать этот метод, только при крайней необходимости1 балл -
Не работает поток на других ПК
Brovin Yaroslav отреагировал Rusland за вопрос
Как определили что поток не запускается на другом ПК? И что значит " Поток должен мониторить визуальный компонент"?1 балл -
первый раз публикую под IOS
enatechno отреагировал Равиль Зарипов (ZuBy) за вопрос
такс видимо вы не совсем понимаете... компилировать под эмулятор вы можете без сертификата, НО вы не можете этот файл выложить в App Store для того чтобы выложить в App Store, вам нужно приобрести сертификат разработчика, выполнить то что я описал в первом сообщении настроить проект Project - Options - Version Info CFBundleIdentifier - информация из App IDs CFBundleSignature - информация из App IDs выставить конфигурацию Application Store настроить Project - Options - Provisioning выбрать провижн файл для проекта и сертификат разработчика только после этого у вас на маке в документах появится IPA файл, который можно загрузить в App Store1 балл -
1). Я так понимаю эта строка в модуле фрейма? Похоже на циклическую ссылку. Uses в модуле фрейма ссылается на Form1, а Form1 ссылается на модуль фрейма? 2). Вы создаете фрейм каждый раз при открытии TabItem2? Много ли контролов на фрейме? Создание фрейма с контролами в рантайм на андроиде - затратная по времени операция. Если программа использует не много фреймов, то я бы не создавал/удалял каждый раз фрейм при смене таба, а использовал фрейм созданный один раз. Это улучшит отзывчивость программы. Ну а причина зависания - то, что вы в процедуре обработчика кнопки фрейма OnClick вызываете TForm1.TabControl1Change и там удаляете этот фрейм и саму кнопку.1 балл
-
Как определить отсутствие изображения как такового в TBitmap?
Pax Beach отреагировал Равиль Зарипов (ZuBy) за вопрос
У 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 балл -
OnCreate для фрейма
Brovin Yaroslav отреагировал enatechno за вопрос
Да. constructor Create(AOwner: TComponent); override;1 балл -
FDQuery1.CachedUpdates := True; подробнее тут1 балл
-
Еще мультипоточный вариант отсюда: 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 балл
-
я вот сейчас еще раз проверил. Всё, что кидалось в Deployment, - в apk-файле находится в папке assets. А то, что подключалось через ресурсы (brcc32), то находится в .so-файле. Delphi 10.1 Berlin. Можете сами проверить1 балл
-
Странное поведение TThread
Rusland отреагировал Равиль Зарипов (ZuBy) за вопрос
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 балл -
Странное поведение TThread
Rusland отреагировал Равиль Зарипов (ZuBy) за вопрос
само скачивание картинки HTTPClient.Get должен быть в потоке, а при успешном скачивании нужно делать синхронизацию с главным потоком и "вставлять" картинку в нужное место1 балл -
Synchronize(LoadImage); Эта строка означает, что LoadImage выполняется в главном потоке (для каждой картинки!). Для примера посмотрите эту тему:1 балл
-
Ну да, конкретно с калькулятором такой финт не прокатит, он явно запоминает свою позицию перед закрытием, а затем при запуске её восстановление происходит уже после применения заданных в CreateProcess параметров позиции. А вообще работает, например, если запустить своё же приложение, разумеется если в нём нет установки координат после запуска. Можно и MoveWindow или SetWindowPos использовать после запуска, только тогда придётся получить хендл окна.1 балл