-
Постов
394 -
Зарегистрирован
-
Посещение
-
Победитель дней
45
Активность репутации
-
AngryOwl получил реакцию от noisy в TImage в Base64
{$IFDEF ANDROID} function Encode_Stream( AStream: TStream ): string; var LStream: TMemoryStream; begin AStream.Position:= 0; LStream := TMemoryStream.Create; TNetEncoding.Base64.Encode( AStream, LStream ); LStream.Position := 0; Result := ReadStringFromStream(LStream, -1, IndyTextEncoding_8Bit); end; function Decode_Stream( enc_str: string ): TMemoryStream; var LStream: TStringStream; begin Result:= TMemoryStream.Create; LStream:= TStringStream.Create; LStream.WriteString( enc_str ); LStream.Position:= 0; TNetEncoding.Base64.Decode( LStream, Result ); end; {$ELSE} function Encode_Stream(AStream: TStream): string; begin AStream.Position:= 0; Result:= TIdEncoderMIME.EncodeStream(AStream); end; function Decode_Stream(enc_str: string): TMemoryStream; begin Result:= TMemoryStream.Create; TIdDecoderMIME.DecodeStream(enc_str, Result); end; {$ENDIF} function LoadBitmapFromStream(const AStream: TStream; const Bitmap: TBitmap): Boolean; var Bmp: TBitmapSurface; begin Result := False; Bmp := TBitmapSurface.Create; try Bmp.Assign(Bitmap); Result := TBitmapCodecManager.LoadFromStream(AStream, Bmp); Bitmap.Assign(Bmp); finally FreeAndNil(Bmp); end; end; function SaveBitmapToStream(const AStream: TStream; const Bitmap: TBitmap; const Extension: string; SaveParams: PBitmapCodecSaveParams = nil): Boolean; var surf: TBitmapSurface; begin Result := False; surf := TBitmapSurface.Create; surf.Assign(Bitmap); try Result := TBitmapCodecManager.SaveToStream(AStream, surf, Extension, SaveParams); finally surf.Free; end; end; function Bitmap_To_Base64(bmp: TBitmap; const AQuality: Integer = 85): string; var eStream: TMemoryStream; SaveParams: TBitmapCodecSaveParams; begin eStream:= TMemoryStream.Create; SaveParams.Quality := AQuality; SaveBitmapToStream(eStream, bmp, '.jpg', @SaveParams); Result:= Encode_Stream(eStream); eStream.Free; end; function Bitmap_From_Base64(b64_string: string): TBitmap; var eStream: TMemoryStream; begin Result := TBitmap.Create; eStream := Decode_Stream(b64_string); if Assigned(eStream) then try eStream.Position := 0; LoadBitmapFromStream(eStream, Result); finally eStream.free; end; end; Скинул как есть. На цэ желания переводить нет, так-что смотрите сами... Надеюсь разберетесь
-
AngryOwl получил реакцию от zairkz в TImage в Base64
{$IFDEF ANDROID} function Encode_Stream( AStream: TStream ): string; var LStream: TMemoryStream; begin AStream.Position:= 0; LStream := TMemoryStream.Create; TNetEncoding.Base64.Encode( AStream, LStream ); LStream.Position := 0; Result := ReadStringFromStream(LStream, -1, IndyTextEncoding_8Bit); end; function Decode_Stream( enc_str: string ): TMemoryStream; var LStream: TStringStream; begin Result:= TMemoryStream.Create; LStream:= TStringStream.Create; LStream.WriteString( enc_str ); LStream.Position:= 0; TNetEncoding.Base64.Decode( LStream, Result ); end; {$ELSE} function Encode_Stream(AStream: TStream): string; begin AStream.Position:= 0; Result:= TIdEncoderMIME.EncodeStream(AStream); end; function Decode_Stream(enc_str: string): TMemoryStream; begin Result:= TMemoryStream.Create; TIdDecoderMIME.DecodeStream(enc_str, Result); end; {$ENDIF} function LoadBitmapFromStream(const AStream: TStream; const Bitmap: TBitmap): Boolean; var Bmp: TBitmapSurface; begin Result := False; Bmp := TBitmapSurface.Create; try Bmp.Assign(Bitmap); Result := TBitmapCodecManager.LoadFromStream(AStream, Bmp); Bitmap.Assign(Bmp); finally FreeAndNil(Bmp); end; end; function SaveBitmapToStream(const AStream: TStream; const Bitmap: TBitmap; const Extension: string; SaveParams: PBitmapCodecSaveParams = nil): Boolean; var surf: TBitmapSurface; begin Result := False; surf := TBitmapSurface.Create; surf.Assign(Bitmap); try Result := TBitmapCodecManager.SaveToStream(AStream, surf, Extension, SaveParams); finally surf.Free; end; end; function Bitmap_To_Base64(bmp: TBitmap; const AQuality: Integer = 85): string; var eStream: TMemoryStream; SaveParams: TBitmapCodecSaveParams; begin eStream:= TMemoryStream.Create; SaveParams.Quality := AQuality; SaveBitmapToStream(eStream, bmp, '.jpg', @SaveParams); Result:= Encode_Stream(eStream); eStream.Free; end; function Bitmap_From_Base64(b64_string: string): TBitmap; var eStream: TMemoryStream; begin Result := TBitmap.Create; eStream := Decode_Stream(b64_string); if Assigned(eStream) then try eStream.Position := 0; LoadBitmapFromStream(eStream, Result); finally eStream.free; end; end; Скинул как есть. На цэ желания переводить нет, так-что смотрите сами... Надеюсь разберетесь
-
AngryOwl отреагировална Равиль Зарипов (ZuBy) в Скорость обновления окна программы
Во первых все зависит от размеров формы
Во вторых тень сделанная с помощью PNG работает быстрей, чем тень отрисованная эффектами FMX
В третьих чисто теоретически работа со стилями, тем более 9.png, будет кушать больше ресурсов чем залить область через FillRect
Я бы реализовывал первым вариантом (более гибкий и простой в реализации)
-
AngryOwl отреагировална noisy в Вопрос кодировки
Вы меня извините, что я не по теме... но ...
Перестаньте работать с мобильной платформой как с десктопом.
Не нужно работать с базой напрямую, делайте промежуточное звено и общайтесь с базой через него (API). Да это сложнее, но так правильней.
-
AngryOwl получил реакцию от Pax Beach в [Android] Как скрыть/показать системный Status Bar?
Не работает!
В режиме DesignTime (в IDE) при изменении свойтва формы BorderStyle = TFmxFormBorderStyle.bsNone StatusBar пропадает. Но он остается при запуске приложения на смарте.
В "Project / Options / Uses Permissions" установлены свойства:
Expand status bar = True
Advanced / Status bar = True
(пробовал и другие варианты)
При запуске приложения Status bar не пропадает.
Но вопрос стоял иначе - "скрыть/показать Status Bar в процессе работы"
-
AngryOwl получил реакцию от zairkz в Типовые приемы работы с TListView
var newLine : TListViewItem; begin newLine := {ваш_TListView}.Items.Add; newLine.purpose:= TListItemPurpose.Header; newLine.Height := 1; newLine.Text := ''; end; вот Вам "разделитель")
P.S. А в остальном, думаю, что слишком много вопросов сразу... Потому и не отвечают.
Вот у меня, например, нет времени отвечать на все - в итоге не отвечу совсем. (просто именно этот ответ занял пару минут на все)
А иногда было бы можно, если бы вопрос был кратко и четко сформулирован.
-
AngryOwl отреагировална Равиль Зарипов (ZuBy) в Редактор ListView 2 - DynamicAppearance
как-то так
var iTitle: TListItemText; begin iTitle := AItem.Objects.FindDrawable('Text1') as TListItemText; if iTitle <> nil then iTitle.Width:=ListView5.Width-85; end; -
AngryOwl отреагировална Равиль Зарипов (ZuBy) в Редактор ListView 2 - DynamicAppearance
всегда присваивайте в переменную, проверьте на валидность, а потом проводите с ней различные операции. у меня много раз было AV, т.к. "контрол" не был создан
-
AngryOwl отреагировална Sergionn в RAD 11 на подходе?
"Ответ" ms на бесплатную редакцию Xamarin!
p.s. число пользователей сокращается, а показатели держать надо - это пожалуй единственное, пришедшее на ум логичное объяснение этого абсурда, ну а отсутствие x86 поддержки в android и медленная работа с мультимедией (камера и тп) - это вообще отдельная "песня".
-
AngryOwl отреагировална Kitty в RAD 11 на подходе?
Найден PDF на другом форуме: https://yadi.sk/i/A-uJEmd7qSdbx
-
AngryOwl отреагировална Andrey Efimov в RAD 11 на подходе?
Официально - наверно 21 апреля.
А не официально - уже доступна для скачивания.
-
AngryOwl отреагировална Rusland в Скачать курс валют через THTTPClient
Проблема решена.
Оказалось что там кодировка Win1251, а я указал
TStringStream.Create('', TEncoding.UTF8); вместо
TStringStream.Create(''); И парсер на всякий случай:
uses msxml; procedure GetKursValutAndDate(XML:String; var KDollar,KEuro:Double); var XMLDoc: IXMLDOMDocument; Subnodes: IXMLDOMNodeList; AttributeNode: IXMLDOMNode; OperationNode: IXMLDOMNode; i:integer; begin KDollar:=0; KEuro:=0; try XMLDoc:=CoDOMDocument.Create; if Assigned(XMLDoc) and XMLDoc.loadXML(XML) then begin Subnodes:=XMLDoc.selectNodes('//ValCurs/node()'); if Assigned(Subnodes) then begin for I := 0 to Subnodes.length - 1 do begin AttributeNode := Subnodes[I].attributes.getNamedItem('ID'); if Assigned(AttributeNode) then if (AttributeNode.nodeValue='R01235') then begin // доллар OperationNode:=Subnodes[I].selectSingleNode('.//Value'); if Assigned(OperationNode) then KDollar:=StrToFloat(OperationNode.text); end else if (AttributeNode.nodeValue='R01239') then begin // евро OperationNode:=Subnodes[I].selectSingleNode('.//Value'); if Assigned(OperationNode) then KEuro:=StrToFloat(OperationNode.text); end end; end; end; except Raise Exception.Create('Не удалось получить курс валют'); end; end;
-
AngryOwl отреагировална Равиль Зарипов (ZuBy) в RAD 11 на подходе?
1) Кастомный стиль в виде плитки *
2) ListView с горизонтальной прокруткой, профиксил баги, которые появились из-за этого *
3) Отступ сверху от первого Itema, задается вручную. (нужно было сделать, чтобы решить без многочисленных костылей одну ситуацию)
4) Кастомные цвета для отдельных Item'ов
5) разные хелперы и внутренние настройки
* можно посмотреть тут
скрин выполненной работы
-
AngryOwl отреагировална rareMax в RAD 11 на подходе?
The Berlin release contains the following new and improved features.
-
AngryOwl отреагировална Alex Bozhko в RAD 11 на подходе?
Конечно надо! Но прежде всего надо, что бы команда разработчиков, в том числе и создатель этого форума, имели ресурс на развитие качественного продукта. А вот как это сделать (что бы и овцы целы и волки сыты) думают специально обученные люди из команды маркетологов.
-
AngryOwl отреагировална Равиль Зарипов (ZuBy) в Тормоза при первом переключении вкладок TTabControl
Решение Ярослава
-
AngryOwl отреагировална noisy в Какие статьи вы хотели бы видеть в блогах?
Рассмотрение подходов создания мобильного приложения со многими формами
табы, формы, фрэймы. Плюсы и минусы того и иного подхода.
-
AngryOwl получил реакцию от Alex7wrt в Воспроизведение одного видео в двух окнах, Windows
Вот, кстати, Андрей Ефимов создал тему. Вот и сформулируйте правильно вопрос, на который бы Вы хотели получить полноценный и развернутый ответ.
Вдруг наши гуру обратят на него внимание!? )))
Ну а если нет - будем ждать..
Все-таки работа с видео, в частности его скоростное воспроизведение средствами FMX, - "больная" тема...
-
AngryOwl отреагировална Andrey Efimov в Какие статьи вы хотели бы видеть в блогах?
[Статья][Android][AlarmManager] Простой пример использования в RAD Studio
Берите за основу
Добавлено в 17:15
Так совпало, что Ярослав тоже написал статью на эту тему, держите ссылку [Статья][Android] Приложение будильник. Использование AlarmManager в FireMonkey на Андроиде
p.s. Рекомендую к прочтению, обе статьи, т.к. они очень хорошо дополняют друг-друга .
-
AngryOwl отреагировална GASCHE в Какие статьи вы хотели бы видеть в блогах?
OC: Android. Многопоточные приложения, синхронизация потоков, создание потоконезависимых компонентов.
-
AngryOwl получил реакцию от Равиль Зарипов (ZuBy) в access violation TImage
Попробуйте сделать просто:
improgressbar.Bitmap.Canvas.BeginScene; try improgressbar.Bitmap.LoadFromFile(........................ finally improgressbar.Bitmap.Canvas.EndScene; end; -
AngryOwl получил реакцию от Равиль Зарипов (ZuBy) в access violation TImage
С TLabel ситуация точно та же.
Сначала BeginUpdate, потом EndUpdate.
А если проблема не в этом - тогда все (вывод в GUI) загнать в
TThread.Syncronize(TThread.CurrentThread, procedure begin ................. end); С мерцанием - не понял, что именно и когда мерцает?
-
AngryOwl отреагировална Равиль Зарипов (ZuBy) в Странные глюки ProgressBar'ов в ListBox
Мы не злые, ответили на ваш вопрос. Нет смысла дублировать ответы, если на них уже даны исчерпывающие ответы. Переходим по ссылкам и читаем, там все написано
-
AngryOwl отреагировална Brovin Yaroslav в Шрифт с обводкой
Есть в стилевых объектах специальный объект с тенью. Он называется: TStyleTextObject. Он не использует эффект тени, а делает это при помощи двойной отрисовки текста. По умолчанию он не доступен на панели инструментов, но его можно добавить установив библиотеку FGX.
-
AngryOwl отреагировална Brovin Yaroslav в Можно ли прокрутить TScrollBox программно?
Без анимации можно любым из этих способов:
// Установка координат окна просмотра (Левый верхний угол) ScrollBox.ViewportPosition := TPointF.Create(0,0); ScrollBox1.ScrollTo(0, 0); // Аналог ViewportPosition // Сдвиг на вектор ScrollBox.ScrollBy(-10, -10); С анимацией так:
procedure TForm3.FormCreate(Sender: TObject); begin ScrollBox1.AniCalculations.Animation := True; ScrollBox1.AniCalculations.BoundsAnimation := True; ScrollBox1.AniCalculations.TouchTracking := [ttVertical, ttHorizontal]; end; // Сам сдвиг ScrollBox1.AniCalculations.MouseWheel(5, 10);