-
Постов
181 -
Зарегистрирован
-
Посещение
-
Победитель дней
26
Активность репутации
-
enatechno получил реакцию от A_l_ex в И снова про ориентацию экрана. Запрет поворота экрана.
Задавайте свойство главной формы FormFactor.Orientations для различных представлений (View).
-
enatechno получил реакцию от A_l_ex в И снова про ориентацию экрана. Запрет поворота экрана.
В файле dpoj :
begin Application.Initialize; Application.FormFactor.Orientations := [TScreenOrientation.Portrait]; Application.CreateForm(.....); Application.Run; end. -
-
enatechno отреагировална POV в Возможно ли закруглить углы в выделении ListView
В редактировании стиля найди selection, у него SourceLink и перетащи на кружок синий снизу слева. Измени размер и будет щастье... хотя наверняка как-то это тупо, можно правильнее.
-
-
enatechno отреагировална Евгений Корепов в OnUpdateObjects выполняется дважды
Если вы понаблюдаете дальше, то обнаружите что выполняется гораздо больше раз. Попробуйте к примеру повернуть устройство горизонтально, потом опять вертикально - еще пара выполнений.
OnUpdateObjects и OnUpdatingObjects выполняется постоянно - при изменении размеров, скрытии и повторном показе, переключении приложений и т.д. В справке так и написано "Occurs immediately after the list view component is updated."
Так что надо придерживаться двух правил :
1. При добавлении/изменении TListViewItem отключайте обработку вышеуказанных процедур.
Setting.Flags.ListViewUpdating:=True; // Глобальная переменная или ListView.OnUpdatingObjects:=nil; AItem:=ListView.Items.Add; AItem.Data['Type']:='MySuperPuperItem'; AItem.Data['Name']:=AName; AItem.Data['Value']:=AValue; Setting.Flags.ListViewUpdating:=False; // Глобальная переменная или ListView.OnUpdatingObjects:=ListViewUpdatingObjects; AItem.Adapter.ResetView(AItem); // принудительно вызываем ListViewUpdatingObjects ... procedure TFormMain.ListViewUpdatingObjects(const Sender: TObject; const AItem: TListViewItem; var AHandled: Boolean); begin if Setting.Flags.ListViewUpdating then // Если используете глобальную переменную Exit; ... 2. Внутри OnUpdateObjects и OnUpdatingObjects при добавлении TListItemText и прочих элементов, проверяйте их существование, возможно они уже были добавлены вашим кодом ранее.
-
enatechno получил реакцию от x11 в [ListView]пример от embarcadero
По умолчанию в DynamicAppearance есть только один объект - Text. Соответственно, из кода вы должны убрать все упоминания AItem.Objects.TextObject, AItem.Objects.AccessoryObject и изменить заполнение текста в ListViewItem (например так):
for Item in [1..10] do ListView1.Items.Add.Data['Text1']:= Format('Regular item %d.%d', [Group, Item]); Как добавить свои объекты в LIstViewItem читайте Using the DynamicAppearance Value или смотрите видео.
-
-
-
enatechno отреагировална Fedor K в IdTCPClient-IdTCPServer управление соединением
Можете мне сделать тестовый сервер и клиент, чтобы я смог у себя проверить? Тогда мой ответ будет более детальным. А пока:
Какой вы объем данных шлете по соединению? Чем вызвана потребность использовать именно сокеты? TimeOut никогда не ставьте большими. Indy работает по принципу блокировки сокета и всего потока в целом. Поэтому большое значение = зависание всего приложения = нежелательные результаты и зависание. Я ставил 100 мс для работы с маленькими пакетами. С такой задержкой доп. поток не обязателен. Если значения более 500 мс - нужно создавать отдельный поток и работать с сокетами в ней + синхронизация при обработке / отправке данных. TIdTCPClient на Andoid любит спать и не проверять входящий буфер. Поэтому вручную нужно вызывать по таймеру проверку типа: procedure T<какое-то имя класа>.Read; var sz : integer; lMsg : string; begin try TMonitor.Enter(Self); try if not Assigned(Client.IOHandler) then Exit; //Client = TIdTCPClient if Client.IOHandler.InputBufferIsEmpty then begin if not Client.IOHandler.CheckForDataOnSource() then exit; end; sz := Client.IOHandler.InputBuffer.Size; if sz <= 0 then exit; lMsg := Client.IOHandler.InputBuffer.ExtractToString(-1, IndyTextEncoding_UTF8); Client.IOHandler.InputBuffer.Clear; <какой-то обработчик входящего сообщения>; except on e : Exception do <какой-то обработчик ошибки>; end; finally TMonitor.Exit(Self); end; end; AntiFreeze - это мягко говоря "костыль" от Indy, использование его плохая практика. На мобильной платформе вряд ли он появится, хотя и реализуется не сложно.
-
enatechno получил реакцию от Павел Караваев в Покрасить ячейку Stringgrid в зависимости отзначения ячейки
У Вас перепутаны строки и столбцы. Нужно или так:
for i := 0 to n-1 do for j := 0 to m-1 do Или же так:
SG.Cells[i,j]:=inttostr(ImMas[i,j]); TStringGrid: property Cells[const ACol, ARow: Integer]
TestSGDraw.zip
-
enatechno отреагировална Fedor K в TWebBrowser и неверный ssl сертификат на сайте.
Objective-C конечно весьма специфический... Попробовал несколько методов, но решение действительно очень простое:
1. Меняем iOSapi.Foundation.pas:
unit iOSapi.Foundation; //~3855 строка, добавляем 2 метода NSURLRequestClass = interface(NSObjectClass) ['{A93A4D14-529E-41F0-86EC-B570715512BB}'] {class} function requestWithURL(URL: NSURL): Pointer; cdecl; overload; {class} function requestWithURL(URL: NSURL; cachePolicy: NSURLRequestCachePolicy; timeoutInterval: NSTimeInterval): Pointer; cdecl; overload; //метод раз {class} function allowsAnyHTTPSCertificateForHost(host: NSString): Boolean; cdecl; overload; //метод два {class} procedure setAllowsAnyHTTPSCertificate(allow: Boolean; forHost: NSString); cdecl; overload; end; 2. В своем коде для требуемых сайтов пишем следующее:
TNSURLRequest.OCClass.setAllowsAnyHTTPSCertificate(true, StrToNSStr(<требуемый сайт>)); Проверял на сайте expired.badssl.com, XCode 7 + SDK 9.3, Simulator, также на реальном устройстве с iOS 11.
п.с. Если нужно доверять абсолютно всем сайтам, думаю можно п. 2 вставить в FMX.WebBrowser.Cocoa.pas в методе:
procedure TCommonWebBrowserService.DoNavigate(const URL: string);
-
enatechno отреагировална kami в Сборка приложения для IOS 11
Можно поподробнее, про что поподробнее?
Скачал последний XCode, поставил, убедился что в Preferences-Locations стоит последняя версия Command line tools -> Установил патчи в PAServer и IDE -> удалил напрочь все "старые" SDK из опций IDE, удалил их из папки -> скачал SDK 11.1, убедился что SDK 11.1 активны -> скомпилировал и задеплоил (кажется, во время деплоя мне было сказано, что Bundle Identificator плох, пришлось заменить его с вида F43234.com.application.my на com.application.my.
Это, по большому счету, всё, что касается работы с SDK 11.1, остальные танцы с бубном (на предыдущих SDK) не вижу смысла приводить. Тщательно разбирайте ошибки компиляции и деплоя и будет вам счастье
-
enatechno отреагировална Tumaso в Определение слабого телефона
Пользователь может изменить качество эффектов, но уж очень хочется облегчить всем жизнь. Пользователь должен запустить программу, а она по умолчанию не тормозит
В общем я решил измерять производительность при старте, как раз висит splash-форма как заставка (она создает главное окно и после создания переключает на него и делает его главным), пользователю придется чуть дольше подождать запуска. Думаю это не проблема.
Суть идеи - у меня приложение построено на фреймах, которые динамически создаю/уничтожаю. И как раз стартовый фрейм является небольшой демкой возможностей, там используется много эффектов и разных компонентов. Поэтому я создаю этот фрейм, делаю предзагрузку стилей всем компонентам фрейма (этот способ взял на этом же форуме, автор Ярослав). После этого создания фиксирую время, за которое создается скриншот этого фрейма (т.е. использую MyFrame.MakeScreenshot). И уже на основании потраченного времени оцениваю производительность железа при работе с графикой.
type /// <summary> /// Производительность оборудования /// </summary> THardwarePerformance = ( /// <summary> /// Высокая производительность /// </summary> performanceHigh, /// <summary> /// Средняя производительность /// </summary> performanceMedium, /// <summary> /// Низкая производительность /// </summary> performanceLow ); function DetectPerformance(AImage: TImage): THardwarePerformance; var LTemp: TBitmap; begin // измеряем производительность оборудования CreateFrame(modeWelcome); // существующий в другом коде метод, создающий нужный фрейм LTime := Now; LTemp := Frames[modeWelcome].MakeScreenshot; try AImage.Bitmap.SetSize(LTemp.Width, LTemp.Height); AImage.Bitmap.CopyFromBitmap(LTemp); finally LTemp.DisposeOf; end; LTime := Now - LTime; // оцениваем производительность if LTime < EncodeTime(0, 0, 0, 300) then Result := performanceHigh else if LTime < EncodeTime(0, 0, 2, 0) then Result := performanceMedium else Result := performanceLow; end; Протестировал на доступных телефонах, пока определяет верно
-
enatechno отреагировална mazayhin в Программа не запускается под Android
За это отвечает Deployment.
Добавьте нужные файлы, укажите путь и все.
Подробнее смотрите http://docwiki.embarcadero.com/RADStudio/Berlin/en/Deployment_Manager и http://docwiki.embarcadero.com/RADStudio/Berlin/en/Creating_an_Android_App#Loading_and_Deploying_Files
Так же есть статья в блоге Андрея Ефимова http://delphifmandroid.blogspot.ru/2014/02/deployment-manager.html
-
enatechno получил реакцию от Rusland в Покрасить ячейку Stringgrid в зависимости отзначения ячейки
У Вас перепутаны строки и столбцы. Нужно или так:
for i := 0 to n-1 do for j := 0 to m-1 do Или же так:
SG.Cells[i,j]:=inttostr(ImMas[i,j]); TStringGrid: property Cells[const ACol, ARow: Integer]
TestSGDraw.zip
-
enatechno отреагировална #WAMACO в [TListView] высота итема=0
Сделайте структуру вне ListView, с ней работайте, ListView заполняйте по структуре, как надо.
Например, сначала видны категории, выбрали категорию, перезаполнили ListView элементами выбранной категории + категориями,которые свернуты.
-
enatechno получил реакцию от Anatoliy в Покрасить ячейку Stringgrid в зависимости отзначения ячейки
У Вас перепутаны строки и столбцы. Нужно или так:
for i := 0 to n-1 do for j := 0 to m-1 do Или же так:
SG.Cells[i,j]:=inttostr(ImMas[i,j]); TStringGrid: property Cells[const ACol, ARow: Integer]
TestSGDraw.zip
-
enatechno получил реакцию от Anatoliy в Программа не запускается под Android
Похоже на отсутствие прав чтения /записи в Андроиде.
Проверьте : Project - Options - Uses Permission - Read external storage (Write external storage)
P.S. Когда задаете вопрос, указывайте версию RAD, версию Android и устройство на котором тестируете
-
enatechno получил реакцию от Камышев Александр в Ссылка на "Политика конфиденциальности"
Либо использовать TWebBrowser, либо вызвать внешний браузер:
http://fire-monkey.ru/topic/3236-открыть-ссылку/
-
enatechno получил реакцию от Kitty в TEdit с автозавершением
Пользуйтесь поиском на сайте.
У TMS есть еще такой вариант TTMSFMXEdit. Но он платный
-
enatechno получил реакцию от Kitty в Программа не запускается под Android
Думаю, для Windows предпочтительнее использовать GetDocumentsPath(), т.к.:
1). как правило, exe-файл лежит в папке находящейся в Program Files и для записи ini-файла рядом с exe понадобятся права администратора;
2). если работа ведется с разных рабочих столов, то каждый пользователь сможет иметь индивидуальные настройки, хранящиеся в ini-файле
-
enatechno отреагировална Rusland в Слайд с пролистывание картинок в форме
Если нужен именно слайдер, то посмотрите на этот компонент Ярослава
-
enatechno получил реакцию от Rusland в Ссылка на "Политика конфиденциальности"
Либо использовать TWebBrowser, либо вызвать внешний браузер:
http://fire-monkey.ru/topic/3236-открыть-ссылку/
-
enatechno отреагировална Kitty в Программа не запускается под Android
#include <System.IniFiles.hpp> #include <System.IOUtils.hpp> #include <memory> //**** #ifdef __ANDROID__ String path = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetSharedDownloadsPath(), L"options.ini"); #elif _Windows String path = System::Ioutils::TPath::Combine(ExtractFilePath(ParamStr(0)), L"options.ini"); #endif if(FileExists(path)) { std::unique_ptr<TIniFile> FileINI(new TIniFile(path)); String ip = FileINI->ReadString(L"HOST", L"ip", L"127.0.0.1"); //**** 1. std::unique_ptr используется чтобы избавиться от delete. std::unique_ptr все делает сам.
2. Файл ini для Андроида надо сохранить в UTF-8.