-
Постов
385 -
Зарегистрирован
-
Посещение
-
Победитель дней
14
Активность репутации
-
-
xenon54 получил реакцию от ra.eremeev в Сохранение Tbitmap в формате jpeg
uses FMX.Surfaces; //--------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var sp : TBitmapCodecSaveParams; bs : TBitmapSurface; B : TBitmap; begin B := TBitmap.Create; // исходная картинка B.LoadFromFile('...'); sp.Quality := 70; bs := TBitmapSurface.Create; bs.Assign(; TBitmapCodecManager.SaveToFile('FileName', bs, @sp); bs.Free; B.Free; end; -
xenon54 получил реакцию от ENERGY в AdHoc
Суть в том, что Ad Hoc приложение и не должно заливаться через application loader. Ad hoc служит для распространение программы минуя app store. Вот статья об этом. Если ты делаешь приложение для AppStore и на данном этапе тебе нужно показать приложение заказчику, то можешь скомпилить для AppStore, и залить через application loader. После этого воспользоваться TestFlight для установки на его устройство. При этом приложению не нужно проходить модерацию и публикацию в магазине. Вот еще.
-
xenon54 получил реакцию от Pax Beach в [Android] Как узнать мой IP адрес?
uses IdCustomTransparentProxy, IdSocks, IdIPWatch, IdStack, IdTCPConnection, IdTCPClient, IdHTTP; function TForm1.localip : string; var AAddresses: TStrings; begin AAddresses := TStringList.Create; try TIdStack.IncUsage; try GStack.AddLocalAddressesToList(AAddresses); finally TIdStack.DecUsage; end; if AAddresses.Count > 0 then begin if TOSVersion.Platform = pfiOS then Result := AAddresses.Strings[AAddresses.Count-1]; //AAddresses if TOSVersion.Platform = pfWindows then Result := AAddresses.Strings[0]; end; finally AAddresses.Free; end; end; В "AAddresses" вы получите все локальные IP. Это будет и IP от wifi и ip от LTE\GPRS и т.д.
-
xenon54 получил реакцию от Евгений Корепов в Сортировка TListViewItems
Узнал про существование хелперов из твоего поста. Погуглил, оказалась клевая штука, плохо что не знал раньше про них
В итоге написал следующее:
TObjectHelper = class helper for TListViewItems public type TItemsList = TList<TListViewItem>; public procedure MyChanged; function MyActiveitems : TItemslist; end; .... implementation procedure TForm1.Button2Click(Sender: TObject); begin ListView1.Items.MyActiveitems.Sort( TComparer<TListViewItem>.Construct( function(const Left, Right: TListViewItem): Integer begin Result := CompareText(Left.text, Right.Text); end)); ListView1.Items.MyChanged; end; { TObjectHelper } function TObjectHelper.MyActiveitems: TItemslist; begin result := self.FActiveItems; end; procedure TObjectHelper.MyChanged; begin self.changed; end; Все замечательно работает
Спасибо.
-
xenon54 получил реакцию от CodeToad в Проблема с обновлением картинки в Item'e
Ну, в винде у меня и ваш первоначальный вариант не работал, тоже нужно было скролить чтобы появилась картинка.
-
xenon54 получил реакцию от Rusland в TMemo скролится вниз не до конца и отрезает буквы.
В общем если кто-то будет искать, то вот такой позорный костыль капельку улучшает ситуацию:
if ((NewViewportPosition.Y+MemoInheritor.Height)- round(MemoInheritor.GetContentBounds.Height)) = 2 then MemoInheritor.ViewportPosition := TPointF.Create(MemoInheritor.ViewportPosition.X, MemoInheritor.ViewportPosition.Y+2); Этот код в событии "OnViewportPositionChange", MemoInheritor - наследник TMemo.
-
xenon54 получил реакцию от Rusland в [FGX] Предложения о разработке компонентов
На сколько я знаю, фоновые процессы для андройда и IOS это принципиально разные вещи и реализация их. Я конечно хотел бы чтобы их реализовали, но как это будет выглядеть слабо себе представляю.
Насчет "свистелок" тут я думаю все просто, Embarcadero решило задавить количеством, а не качеством. Думаю "свистелкам" скоро придет конец, ибо придумывать новые уже непросто.
"В любой непонятной ситуации пиши DisposeOf" - шутка конечно, но теперь я понял что не стоит надеяться на автоматическое разрушение связей внутри объекта, только лишь удалив все внешние ссылки и воспользовавшись методом Free, я его теперь вообще почти не юзаю.
Я не вкурсе откуда такой негатив, но я так понял что в основном он льется от тех кто пишет под андроид. Вскоре я закончу писать свое приложение для IOS'а и приступлю к его же написанию для андройда, быть может там у меня и начнет подгарать, но пока все неплохо.
По теме:
Я тоже отдал бы свой голос за реализацию фоновых режимов для обеих платформ, только так чтобы было как в сказке "из коробки" достал и пользуйся.
-
-
xenon54 получил реакцию от zairkz в [XE8][Win][Android] AES-256 Шифрование и LockBox
Честно говоря, никогда не разбирался с AES'ом. Я раньше юзал ГОСТ 28147-89. Сам его реализовал на делфях со вставками асемблера, ибо без него скорость шифрования и расшифрования была катастрафически мала(со вставками скорость выросла на 2 или 3 порядка, точно не помню). Результат всегда получался одинаковый при шифровании одного и того же содержимого и одного и того же ключа. Что там в этом AES'е х... фиг его знает.
-
xenon54 получил реакцию от zairkz в [TidHTTP] Не срабатывает Timeout
Помнится я целый день на гугл потратил в поисках этого...
А насчет того что быстрей срабатывает чем установлен таймаут, что-то тут не то, я ради интереса засекал сегодня, отрабатывает четко по таймауту.
-
xenon54 получил реакцию от Rusland в Push сообщения IOS - как получить токен ?
XE8 без апдейтов.
На какой строке AV?
Provisioning profile должен включать APN.
uses: System.PushNotification, FMX.PushNotification.iOS
-
xenon54 получил реакцию от Brovin Yaroslav в Сохранение Tbitmap в формате jpeg
uses FMX.Surfaces; //--------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var sp : TBitmapCodecSaveParams; bs : TBitmapSurface; B : TBitmap; begin B := TBitmap.Create; // исходная картинка B.LoadFromFile('...'); sp.Quality := 70; bs := TBitmapSurface.Create; bs.Assign(; TBitmapCodecManager.SaveToFile('FileName', bs, @sp); bs.Free; B.Free; end; -
xenon54 получил реакцию от Rusland в Выделяется итем, хотя клик идет не по нему
Сам спросил, сам ответил...
В FMX.ListView в функции определения индекса итема по абсолютной координате клика на ListView почему-то заложено такое поведение ( возвращает индекс последнего элемента если клик пришелся на область, вертикальная координата которой больше чем начало последнего итема). Вот так исправляется:
function TCustomListView.FindItemAbsoluteAt(ViewAt: Integer): Integer; var Left, Right, Pivot, Value: Integer; begin UpdateItemLookups; if Items.Count < 1 then Exit(-1); if ViewAt < 1 then Exit(0); { if ViewAt >= FHeightSums[FHeightSums.Count - 1] then Exit(FHeightSums.Count - 1); } if ViewAt > FHeightSums[FHeightSums.Count - 1] + GetItemHeight( GetItemCount - 1 ) then Exit(- 1); -
xenon54 получил реакцию от Brovin Yaroslav в Выделяется итем, хотя клик идет не по нему
Сам спросил, сам ответил...
В FMX.ListView в функции определения индекса итема по абсолютной координате клика на ListView почему-то заложено такое поведение ( возвращает индекс последнего элемента если клик пришелся на область, вертикальная координата которой больше чем начало последнего итема). Вот так исправляется:
function TCustomListView.FindItemAbsoluteAt(ViewAt: Integer): Integer; var Left, Right, Pivot, Value: Integer; begin UpdateItemLookups; if Items.Count < 1 then Exit(-1); if ViewAt < 1 then Exit(0); { if ViewAt >= FHeightSums[FHeightSums.Count - 1] then Exit(FHeightSums.Count - 1); } if ViewAt > FHeightSums[FHeightSums.Count - 1] + GetItemHeight( GetItemCount - 1 ) then Exit(- 1); -
xenon54 отреагировална Kitty в Кому нужны программисты Fire Monkey?
>Дай бог, допилят до конца,
А что делать атеистам если он не даст? Размытый родмат, отсутствие полной встроенной справочной системы, перепродажи с не понятными перспективами - мало вселяет уверенности в дальнейшем правильном развитии продукта. У нормального продукта при нажатии F1 надо получать ответ, а не пустоту как в C++ Builder и не выпращивать из-за этого книгу у автора этого форума!
-
xenon54 получил реакцию от Евгений Корепов в Смена родительского компонента для аниматора
procedure TForm2.MoveRect(Rect: TRectangle); begin TAnimator.AnimateIntWait(Rect, 'Position.Y', 0); TAnimator.AnimateInt(Rect, 'Position.Y', 152); end; Так вас не устроит?
-
xenon54 отреагировална Brovin Yaroslav в Семисегментный индикатор
Добрый день, Юрий,
Красота. Хороший компонент. Возможно вам пригодятся пара замечаний по портированию с VCL на FMX, которые помогу вам сделать ваш компонент еще лучше.
Когда вы выполняете отрисовку в перекрытом методе TControl.Paint, не надо вызывать BeginScene и EndScene. Так как этими методами руководит сцена, обычно это форма.
procedure TSeparator.Draw(px1, py1, px2, py2: Single; pColor: TAlphaColor; Opac: Single); var MyRect: TRectF; begin MyRect := TRectF.Create(px1, py1, px2, py2); with Canvas do begin [b] BeginScene; // <!--- Не нужно[/b] Fill.Kind := TBrushKind.Solid; Fill.Color := pColor; FillRect(MyRect, 0, 0, AllCorners, Opac); [b]EndScene; [/b][b]<!--- Не нужно[/b] end; Canvas end; Дополнительно:
1. Инициализацию точек для полигона можно сделать сразу на прямую.
Было:
// Установить точки, определяющие многоугольник p1 := TPointF.Create(px1, py1); p2 := TPointF.Create(px2, py2); p3 := TPointF.Create(px3, py3); p4 := TPointF.Create(px4, py4); p5 := TPointF.Create(px5, py5); p6 := TPointF.Create(px6, py6); // Создать полигон SetLength(MyPolygon, 6); MyPolygon[0] := p1; MyPolygon[1] := p2; MyPolygon[2] := p3; MyPolygon[3] := p4; MyPolygon[4] := p5; MyPolygon[5] := p6; Стало:
MyPolygon := [TPointF.Create(px1, py1), TPointF.Create(px2, py2), TPointF.Create(px3, py3), TPointF.Create(px4, py4), TPointF.Create(px5, py5), TPointF.Create(px6, py6)]; При этом для динамических массивов перед присваивание не нужно вызывать функцию SetLength. Экономия места и 6 переменных.
2. Сравнение вещественных чисел должно осуществляться при помощи функции System.Math.SameValue. Это касается всех мест в этом юните. В противном случае у вас могут быть фантомные ложные срабатывания условий, которые найти будет сложно.
Было:
procedure TSevSeg.SetCellSpace(const Value: Single); begin if Value = CellSpace then exit; FCellSpace := Value; end; Стало:
procedure TSevSeg.SetCellSpace(const Value: Single); begin if SameValue(Value, CellSpace) then exit; FCellSpace := Value; end; -
xenon54 получил реакцию от Rusland в Работа сервиса при закрытом приложении
Ну тут все просто. Remote Push Notification.
Вот, хороший видос на эту тему для ведра тынц
И сервис никакой не нужен.
Для ведра это называется "Google Cloud Messaging"
-
xenon54 отреагировална Brovin Yaroslav в Обновление информации программы с сайта
Мне кажется, проще воспользоваться REST API и получать данные без UI. А дальше уж самому решать, что с ними делать.
https://wordpress.org/plugins/json-rest-api/
Я понимаю, что парсить страницу - это универсальное решение, но оно работает ровно до первого изменения шаблона дизайна страницы :-)
-
xenon54 отреагировална Brovin Yaroslav в [Отклонение] Утечка памяти в компоненте TNotificationCenter
Я уже завел этот баг во внутреннем треккере.
-
xenon54 получил реакцию от Andrey Efimov в Запустить приложение из сервиса или показать форму
Я бы дропнул нахрен сразу такое приложение, которое уничтожает батарейку своим сервисом который каждую секунду бесконечно шлет гет запросы.
-
xenon54 отреагировална Andrey Efimov в Приложение для создания файла ресурсов (RC, RES)
Появилась необходимость добавить большое количество картинок, но делать это стандартными средствами не очень удобно (почитать можно тут: Где хранить большое количество картинок?).
Собственно, написал маленькую программку для создания файла RC и создания bat – файла, который позволяет генерировать RES файл.
В свободное время буду допиливать.
Как использовать:
Указываете путь до папки с файлами, которые необходимо добавить в ресурсы. Указываете имя выходного файла, без расширения. Расширение (.rc) уже забито в коде. Выбираете тип ресурсов. Ставите необходимые галочки. Жмёте "Создать" Итоговые файлы будут лежать рядом с exe-файлом приложения.
Обращаться к ресурсам можно по оригинальным именам или автоматически сгенерованным.
Пример (оригинальные имена):
Имя файла "FruitsVegetables_1.png". В готовом файле будет так: FruitsVegetables_1 ТИП ПУТЬ\FruitsVegetables_1.png Надеюсь, кому-нибудь пригодится.
Версия 1.4:
Скачать с Google Drive (версия 1.4). Новую версию можно скачать ниже, в последнем сообщении. -
xenon54 получил реакцию от zairkz в Push сообщения IOS - как получить токен ?
XE8 без апдейтов.
На какой строке AV?
Provisioning profile должен включать APN.
uses: System.PushNotification, FMX.PushNotification.iOS
-
xenon54 получил реакцию от Kitty в Push сообщения IOS - как получить токен ?
XE8 без апдейтов.
На какой строке AV?
Provisioning profile должен включать APN.
uses: System.PushNotification, FMX.PushNotification.iOS