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

gonzales

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

    325
  • Зарегистрирован

  • Посещение

  • Победитель дней

    27

Весь контент gonzales

  1. Часто помогают методы beginupdate endupdate
  2. Привет. Давно было, уже не помню, но судя по тому, что я написал проблема в файле проекта. Открой dproj файл, посмотрю, что там внутри
  3. ааа, вообще все свое))) текст в том числе))) я понял, спасибо! так радикально я не додумался поступить
  4. я так пробовал сделать, но почему-то чекбокс вставленный в итем с выравниванием по левому краю перекрывает текст итема, я так и не разобрался, почему это происходит, но нашел процедуру у родного итема - ChangeCheck. Корявенько конечно получилось с точки зрения логики, часть функционала в компоненте, а часть нет, но пока забил
  5. Доброго времени суток. Собственно вопрос в теме поста. Пишу наследника от TListBoxItem, хочу выполнить процедуру при нажатии на чекбокс, но подходящих событий не наблюдаю. OnClick не приводит к нужному результату. Есть еще StylesData['check'], который вроде как должен быть TCheckBox, но я не пойму как с ним работать.
  6. Оставлю тут инфу, чтобы не забыть. Понадобилось тоже шифровать текст, сделал себе простенький юнит на основе https://github.com/MHumm/DelphiEncryptionCompendium unit Encrypt_unit; interface uses DECCipherBase, DECFormatBase, DECCipherModes, System.SysUtils, System.TypInfo, Generics.Collections, DECBaseClass, DECFormat, DECCipherFormats, DECCiphers, DECUtil, DECCipherInterface, FMX.Dialogs; const FILLER_TEXT = '01'; INIT_VECTOR_TEXT = '127E22'; KEY_TEXT = '123456ADE'; CIPHER_FUNCTION = 'TCipher_1DES'; CIPHER_MODE = 'cmCTSx'; AuthenticationBitLength = 128; EditAuthenticatedData = ''; EditExpectedAuthenthicationResult = ''; EditCalculatedAuthenticationValue = ''; FORMAT_TEXT = 'TFormat_Copy'; var EditFiller: string; EditInitVector: string; EditKey: string; function EncryptText(EditPlainText: string): string; function DecryptText(EditCipherText: string): string; implementation function GetSelectedCipherMode: TCipherMode; var ModeStr: string; begin ModeStr := CIPHER_MODE; if ModeStr.Contains('(') then ModeStr := ModeStr.Remove(ModeStr.IndexOf('(') - 1); result := TCipherMode(System.TypInfo.GetEnumValue(TypeInfo(TCipherMode), ModeStr)); end; function GetCipherInstance: TDECCipherModes; begin result := TDECCipher.ClassByName(CIPHER_FUNCTION).Create as TDECCipherModes; result.Mode := GetSelectedCipherMode; end; {function IsAuthenticatedCipher: Boolean; var Cipher: TDECCipherModes; begin Cipher := GetCipherInstance; try result := Cipher.IsAuthenticated; finally Cipher.Free; end; end; procedure UpdateAuthenticationStatus; begin IsAuthenticatedCipher; end; procedure InitCipherAlgorithm; var Context: TCipherContext; begin Context := TDECCipher.ClassByName(CIPHER_FUNCTION).Context; UpdateAuthenticationStatus; end;} function GetInitializedCipherInstance: TDECCipherModes; var FillerByte: UInt8; begin EditFiller := FILLER_TEXT; EditInitVector := INIT_VECTOR_TEXT; EditKey := KEY_TEXT; if not EditFiller.IsEmpty then begin while length(EditFiller) < 2 do EditFiller := '0' + EditFiller; FillerByte := StrToInt('0x' + EditFiller) end else FillerByte := 0; if TFormat_HEXL.IsValid(RawByteString(EditInitVector.ToLower)) and TFormat_HEXL.IsValid(RawByteString(EditKey.ToLower)) then begin result := GetCipherInstance; result.Init(BytesOf(TFormat_HEXL.Decode(RawByteString(EditKey.ToLower))), BytesOf(TFormat_HEXL.Decode(RawByteString(EditInitVector.ToLower))), FillerByte); end else raise Exception.Create('No valid encryption key or init vector given!'); end; procedure SetAuthenticationParams(Cipher: TDECCipherModes); begin Assert(Assigned(Cipher)); if Cipher.IsAuthenticated then begin Cipher.AuthenticationResultBitLength := AuthenticationBitLength; Cipher.DataToAuthenticate := TFormat_HEXL.Decode(BytesOf(RawByteString(EditAuthenticatedData))); Cipher.ExpectedAuthenticationResult := TFormat_HEXL.Decode(BytesOf(RawByteString(EditExpectedAuthenthicationResult))); end; end; function GetFormatSettings(var PlainTextFormatting, CipherTextFormatting: TDECFormatClass): Boolean; begin PlainTextFormatting := TDECFormat.ClassByName(FORMAT_TEXT); CipherTextFormatting := TDECFormat.ClassByName(FORMAT_TEXT); result := true; end; function EncryptText(EditPlainText: string): string; var Cipher: TDECCipherModes; InputFormatting: TDECFormatClass; OutputFormatting: TDECFormatClass; InputBuffer: TBytes; OutputBuffer: TBytes; begin result := ''; if not GetFormatSettings(InputFormatting, OutputFormatting) then exit; try Cipher := GetInitializedCipherInstance; try InputBuffer := System.SysUtils.BytesOf(EditPlainText); if InputFormatting.IsValid(InputBuffer) then begin // Set all authentication related properties SetAuthenticationParams(Cipher); try OutputBuffer := (Cipher as TDECFormattedCipher).EncodeBytes(InputFormatting.Decode(InputBuffer)); (Cipher as TDECFormattedCipher).Done; except On e: Exception do ShowMessage('Encryption failure:' + sLineBreak + e.Message); end; result := string(DECUtil.BytesToRawString(OutputFormatting.Encode(OutputBuffer))); end else ShowMessage('Input has wrong format'); finally Cipher.Free; end; except On e: Exception do ShowMessage('Encryption init failure: ' + e.Message); end; end; function DecryptText(EditCipherText: string): string; var Cipher: TDECCipherModes; CipherTextFormatting: TDECFormatClass; PlainTextFormatting: TDECFormatClass; CipherTextBuffer: TBytes; PlainTextBuffer: TBytes; AuthenticationOK: Boolean; begin result := ''; if not GetFormatSettings(PlainTextFormatting, CipherTextFormatting) then exit; try Cipher := GetInitializedCipherInstance; try CipherTextBuffer := System.SysUtils.BytesOf(EditCipherText); if CipherTextFormatting.IsValid(CipherTextBuffer) then begin // Set all authentication related properties SetAuthenticationParams(Cipher); AuthenticationOK := false; try PlainTextBuffer := (Cipher as TDECFormattedCipher).DecodeBytes(CipherTextFormatting.Decode(CipherTextBuffer)); // in case of an authenticated cipher mode like cmGCM the Done method // will raise an exceptino when the calculated authentication value does // not match the given expected one (Cipher as TDECFormattedCipher).Done; // If we managed to get to here, the calculated authentication value is // ok if we're in an authenticated mode and have entered an expected value. if (length(EditExpectedAuthenthicationResult) > 0) and (length(EditExpectedAuthenthicationResult) = length(EditCalculatedAuthenticationValue)) then AuthenticationOK := true; except On e: Exception do ShowMessage('Decryption failure:' + sLineBreak + e.Message); end; result := string(DECUtil.BytesToRawString(PlainTextFormatting.Encode(PlainTextBuffer))); end else ShowMessage('Input has wrong format'); finally Cipher.Free; end; except On e: Exception do ShowMessage('Decryption init failure: ' + e.Message); end; end; end.
  7. это растровый стиль, если ткнуть дважды в элемент откроется окно с картинкой и областью, которая будет отображаться на канве. векторные стили встроенные C:\Program Files (x86)\Embarcadero\Studio\22.0\Redist\styles\Fmx
  8. Возможно у тебя не векторный стиль. У меня вот так,
  9. Color := Stringgrig.StylesData['background.content.selection.Fill.Color'] Это просто набор цветов, который я использую. Я дал пример, выдранный из одного моего проекта, нигде ничего четко написано не будет))) Для понимания работы цветов в firemonkey - вот почитайте https://docwiki.embarcadero.com/RADStudio/Sydney/en/Colors_in_FireMonkey то, что Вы указали Color:=0 - так это нулевой цвет, с нулевой прозрачностью, что Вы ожидали увидеть?
  10. Так Вам шашечки или ехать? Если Вы рисуете на канве, то какие стили могут быть? Для канвы я Вам пример дал, там есть все про цвет выделенной ячейки. Если Вы хотите попробовать использовать стили, то примерно это должно выглядеть так Stringgrig.StylesData['background.content.selection.Fill.Color'] := Color; Но это не точно, надо пробовать А где увидеть, что именно используется из стиля я не знаю, может кто еще подскажет. По стилям есть видеоуроки от Ярослава Бровина, посмотрите, может там будет ответ
  11. если я правильно понимаю, то импортирование функций идет по имени, соответственно использовать библу без описания не получится. av_get_channel_layout_string:procedure(buf : PAnsiChar;buf_size : Integer;nb_channels : Integer;channel_layout : int64_t) ; cdecl; @av_get_channel_layout_string:=SafeGetProcAddress(AVUtilHandle, 'av_get_channel_layout_string');
  12. Да, прочитал. Это как раз оно. Что-то с путями происходит при выкладывании бангла. Но решения так и нет, если я правильно понял
  13. Ну я везде использую свою отрисовку, поэтому у меня такой проблемы не стоит, все таблички выглядят одинаково
  14. может надо вместо JsonToSend.WriteString(Memo3.Text); писать JsonToSend.WriteString(TNetEncoding.Base64String.Encode(Memo3.Text)); Подключить юнит System.NetEncoding
  15. Только с рисованием. Используй GridDrawColumnCell procedure TForm2.GridDrawColumnCell(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates); const HorzTextMargin = 2; VertTextMargin = 1; var TextLayout: TTextLayout; TextRect: TRectF; el_id: Integer; i: Integer; el_type: Integer; begin TextRect := Bounds; TextRect.Left := TextRect.Left + 1; TextRect.Bottom := TextRect.Bottom - 1; TextRect.Inflate(-HorzTextMargin, -VertTextMargin); if TGridDrawState.RowSelected in State then Canvas.Fill.Color := form1.Style.SelectCellColor else Canvas.Fill.Color := TAlphaColors.white; Canvas.FillRect(Bounds, 0, 0, AllCorners, 1); if Value.IsEmpty = false then begin TextLayout := TTextLayoutManager.DefaultTextLayout.Create; try TextLayout.BeginUpdate; try TextLayout.WordWrap := false; TextLayout.Opacity := Column.AbsoluteOpacity; TextLayout.HorizontalAlign := TTextalign.Leading; TextLayout.VerticalAlign := TTextalign.Center; TextLayout.Trimming := TTextTrimming.Character; TextLayout.TopLeft := TextRect.TopLeft; TextLayout.Text := Value.ToString; TextLayout.MaxSize := PointF(TextRect.Width, TextRect.Height); el_type := 0; //условие и т.д. if el_type = 0 then TextLayout.Color := form1.Style.OsveshenieColor else if el_type = 1 then TextLayout.Color := form1.Style.KlimatColor else if el_type = 2 then TextLayout.Color := form1.Style.BezopasnostColor else if el_type = 3 then TextLayout.Color := form1.Style.OhranaColor else if el_type = 4 then TextLayout.Color := form1.Style.UstroystvaColor else if el_type = 5 then TextLayout.Color := form1.Style.UpravlenieColor else if el_type = 6 then TextLayout.Color := form1.Style.WifiColor else if el_type = 7 then TextLayout.Color := form1.Style.DopColor; { Пользовательские настройки отрисовки } // TextLayout.Font.Family := 'Times New Roman'; // TextLayout.Color := form1.Style.FontColor; TextLayout.Font.Size := form1.Style.FontSize; TextLayout.Font.Family := (Sender as TStringGrid).TextSettings.Font.Family; finally TextLayout.EndUpdate; end; TextLayout.RenderLayout(Canvas); finally TextLayout.DisposeOf; end; end; end;
  16. деплоить библиотеку используя RemotePath library\lib\arm64-v8a\ (это для Android64) DLL_PATH:=TPath.GetLibraryPath+'/'; function MySafeLoadLibrary(ModuleName:string):HMODULE; var errorMsg:string; begin Result:=0; ModuleName:=DLL_PATH+ModuleName; if FileExists(ModuleName) then begin Result:=LoadLibrary(PChar(ModuleName)); end; if Result = 0 then begin errorMsg:=string(UTF8Decode(dlerror)); errorMsg:=Format('Can not load %s error:%s', [ModuleName, errorMsg]); ShowMessage(errorMsg); raise Exception.Create(errorMsg); end; end;
  17. Оставлю тут информацию, чтобы не потерялась. Суть проблемы в следующем, в проекте используются сторонние библиотеки, которые подключены в deployment. Прописаны пути для этих библиотек library\lib\arm64-v8a\. Все работает при отладке на телефоне в Release mode (Development). Для сборки пакета для Goolge Play переключаюсь в Release (Application Store) и создаю aab файл. Google его нормально принимает, приложение выкладывается, и тут возникает ошибка то есть программа не может найти библиотеку libavutil.so по адресу data/.... Причем ошибку наблюдается на Андрод 9 и 10, а на Андроид 11 работает все штатно. Открываю aab файл как архив, вот же они, все библиотеки на месте. Напоминаю, что apk файл отрабатывает на устройстве абсолютно нормально, но загрузить его в Google Play не получается, потому как в Development mode не подтягиваются сертификаты, необходимые для выкладки, а в Application Store mode не создается apk файл. На данный момент нашел только одно решение проблемы, возможно кто-нибудь подскажет что-то более вменяемое 1. Запускаем командную строку команда создания сета с apk java.exe -jar "C:\Program Files (x86)\Embarcadero\Studio\21.0\bin\Android\bundletool-all-0.13.3.jar" build-apks --mode=universal --bundle="путь до aab файла.aab" --output="путь куда развернуть apks файлы.apks" --ks="путь до keystore файла.keystore" --ks-pass=pass:пароль keystore --ks-key-alias=алиас приложения --key-pass=pass:пароль алиаса После непродолжительного ожидания в папке "путь куда развернуть apks файлы" создается apks файл 2. Открываем получившийся apks файл как архив, вытаскиваем оттуда apk файл. У меня он называется universal.apk 3. Уже этот apk файл выкладываем в Гугл. Метод конечно абсолютно костыльный, вообще непонятно сколько еще Гугл продолжит принимать apk вместо aab, надеюсь, что этот месседж кто-нибудь увидит и эту хрень пофиксят.
  18. Чтобы не плодить тем, спрошу тут. С выходом 14 iOs при обращении к ресурсам в локальной сети iOs выдает запрос на разрешение на поиск устройств в локальной сети и подключение к ним. Не подскажете, как можно запросить это разрешение заранее?
  19. Я разобрался, откуда вылезли эти грабли. У меня почему-то прописалось прямо в файле проекта (dproj файл), что Андроид64 использует SDK 25.2.5. После того, как я удалил эту привязку, все скомпилилось. А вообще 26 SDK у меня нормально существует)))
  20. gonzales

    Push в Delphi11

    Оставлю здесь информацию, как заставить работать пуши при переходе на delphi11. Если Вы заметили, что после перехода на 11 версию у Вас отвалились пуши, система не показывает firebase token, то проблема решается так. 1. Скачиваем JSON с консоли FireBase 2. Открываем его, видим следующий вид 3. Вписываем в Настройках проекта в секцию Services в следующем соответствии: API key - current_key Application id - mobilesdk_app_id Project id - project_id GSM sender id - project_number 4. И не забываем выставить в секцию Entitlement List галочку Receive push notifications. После этого все опять начинает работать.
  21. Пытаюсь скомпилить проект, сделанный в 10.4.2. Получаю вот такую шляпу [Error Error] Specified platform sdk not found: 'C:\Users\user\AppData\Roaming\Embarcadero\BDS\22.0\AndroidSDK25.2.5_64bit.sdk' Заглядываю в папку C:\Users\user\AppData\Roaming\Embarcadero\BDS\22.0. Там лежат только файлы AndroidSDK26.1.1_64bit.sdk AndroidSDK26.1.1_32bit.sdk Новое приложение создается и компилируется без проблем. Пробовал подмахнуть манифест от нового приложения - не помогло. Не подскажете, где копать?
  22. Удалил какие-то приложения (удалял сразу несколько, поэтому не могу сказать точно, какие) и все заработало?
  23. Собственно вопрос в заголовке, но немного деталей. Попался в руки телефон OnePlus 9R, с 11 андроидом на борту. Так вот на нем, любое приложение, скомпилированное в среде 10.4.1 не висит в списке запущенных, то есть его нельзя остановить стандартным способом. На других телефонах с 11 андроидом вроде все нормально. Никто случайно не сталкивался с такой болячкой? Все, что мне удалось найти в сети по этому поводу, что есть команды для манифеста, чтобы скрыть как раз приложение из списка android:excludeFromRecents="true" Пробовал ставить false - не помогло. Буду рад любым комментариям...
  24. Оставлю здесь полезную информацию. Если при добавлении сертификата в связку ключей у Вас, как у меня появляется ошибка сертификата "Сертификат ненадежен", то проблема решается следующим образом
  25. Прошу помощи, как переделать предложенный вариант под следующую конструкцию Я использую компоненты https://github.com/Zeus64/alcinoe TALTabControl на котором в каждой вкладке создается TALVertScrollBox, то есть у пользователя есть две степени свободы. Изначально я пробовал использовать обычный TVertScrollBox, который положен на TALTabControl, но приведенный код работал только при скролинге скроллбокса, а при горизонтальном свайпе со сменой активного таба нажатие все равно получалось. Вторая проблема в том, что я не до конца понимаю код, а конкретнее, когда я заменяю TCustomScrollBox на TALVertScrollBox, начинает ругаться на строку if ScrollBox is TCustomListBox then unit Form.Base; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.InertialMovement, FMX.Dialogs, FMX.Layouts, FMX.ListBox; type TBaseForm = class(TForm) private protected ControlledScrollBox: TCustomScrollBox; function GetActiveScrollBox: TCustomScrollBox; virtual; public function ObjectAtPoint(AScreenPoint: TPointF): IControl; override; end; implementation {$R *.fmx} type TAniCalculationsAccess = class(TAniCalculations); function ControlMoved(ScrollBox: TCustomScrollBox): Boolean; begin Result:=False; if Assigned(ScrollBox) then if ScrollBox is TCustomListBox then Result:=ScrollBox.AniCalculations.Moved else Result:=ScrollBox.AniCalculations.Moved and TAniCalculationsAccess(ScrollBox.AniCalculations).Enabled and (ScrollBox.AniCalculations.LastTimeCalc>0); end; function TBaseForm.GetActiveScrollBox: TCustomScrollBox; begin Result:=ControlledScrollBox; end; function TBaseForm.ObjectAtPoint(AScreenPoint: TPointF): IControl; var ScrollBox: TCustomScrollBox; begin var P:=ScreenToClient(AScreenPoint); ScrollBox:=GetActiveScrollBox; if ControlMoved(ScrollBox) and ScrollBox.PointInObject(P.X,P.Y) then begin Result:=ScrollBox; if Assigned(Captured) and (Captured<>Result) then begin Captured.MouseUp(TMouseButton.mbLeft,[],-1,-1); SetCaptured(nil); end; end else Result:=inherited; end; end. Прошу, пните в нужном направлении, куда копать
×
×
  • Создать...