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

ENERGY

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

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

  • Посещение

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

    57

Сообщения, опубликованные ENERGY

  1. В 4/19/2017 в 15:31, Равиль Зарипов (ZuBy) сказал:

    Равиль огромное вам спасибо, так просто. Все работает. Обычная пропорция.

    Я думал сложнее (я делал  Image1.Height := Image1.Bitmap.Height; ). И заодно решилась проблема, когда увеличиваешь размер формы, картинка корректно увеличивается с Fit. 

    Вот правильный код, который посоветовал Равиль:

     

    procedure TfrmSplash.FormResize(Sender: TObject);
    var
      vKoef: Single;
    begin
      if Handle = nil then exit; // on Android without this user will get Access Violation
      vKoef := Image1.Width / Image1.Bitmap.Width;
      Image1.Height := Image1.Bitmap.Height * vKoef;
    end

     

  2. Простейшая анимация Timage + Float Animation который меняет RotationAngle картинки.

    Если запустить анимацию, и если слева от крутящейся картинки стоит еще одна картинка или контрол (статичный), то на этом месте показываются и пропадают вертикальные линии, как будто эффект старой кинопленки.

    Причем под Android все ок, такая ерунда под Windows. А мне нужно сделать прогу под Win и Android.

    Кто нибудь сталкивался с таким?

    Здесь большой круг вращается. А левый маленький - обычная картинка. (2 Timage).

    Delphi Berlin Update 2 

    del1.png.cd841db545cd7e93c660c7aafd235bf4.png

     

    TestAnim.zip

  3. Есть картинка-шапка (лого). Wrap Mode = Fit.

    При изменении размера формы (ширины), меняется размер картинки внутри Timage, но не меняется размер самого TImage.

    Из за этого неправильно позиционируются контролы под Timage (точнее они не меняют позицию), к примеру при уменьшении ширины  формы остаются большие пустые куски, из за того что картинка уменьшилась, а сам Timage  нет (он должен сменить Height самого конторола пропорционально его Width ), и контролы что под ним (c Align Top), не сменили позицию.

    В VCL был Autosize у Timage, есть ли что то подобное у FMX ?

  4. Динамически добавляю картинки, - thumbnails в ImageList для дальнейшего отображения в ListView.  

    Некоторые картинки через время не нужны, как корректно удалить картинку из TImageList, чтобы освободить память?

    При добавлении картинка добавляется  в 3 списка Source.Add, Destination.Add  и Destination.Layers.Add, получается ее нужно удалять с этих 3 списков?


    Спасибо.


    Добавляю картинку так: 

    Скрытый текст


    
    type
      TImageListHelper = class helper for TImageList
        function Add(aBitmap: TBitmap): integer;
      end;
    
    function TImageListHelper.Add(aBitmap: TBitmap): integer;
    const
      SCALE = 1;
    var
      vSource: TCustomSourceItem;
      vBitmapItem: TCustomBitmapItem;
      vDest: TCustomDestinationItem;
      vLayer: TLayer;
    begin
      Result := -1;
      if (aBitmap.Width = 0) or (aBitmap.Height = 0) then exit;
    
      // add source bitmap
      vSource := Source.Add;
      vSource.MultiResBitmap.TransparentColor := TColorRec.Fuchsia;
      vSource.MultiResBitmap.SizeKind := TSizeKind.Source;
      vSource.MultiResBitmap.Width := Round(aBitmap.Width / SCALE);
      vSource.MultiResBitmap.Height := Round(aBitmap.Height / SCALE);
      vBitmapItem := vSource.MultiResBitmap.ItemByScale(SCALE, True, True);
      if vBitmapItem = nil then
      begin
        vBitmapItem := vSource.MultiResBitmap.Add;
        vBitmapItem.Scale := Scale;
      end;
      vBitmapItem.Bitmap.Assign(aBitmap);
    
      vDest := Destination.Add;
      vLayer := vDest.Layers.Add;
      vLayer.SourceRect.Rect := TRectF.Create(TPoint.Zero, vSource.MultiResBitmap.Width,
          vSource.MultiResBitmap.Height);
      vLayer.Name := vSource.Name;
      Result := vDest.Index;
    end;

     

    
    ImageList1.Add(MyBitmap);


     

     

  5. 
     

    На мобильных платформах обычно не принято указывать пути, хотя есть конечно исключения.
    На Android нет стандартного диалога, на iOS есть, но Apple не рекомендует использовать его. 

    Important: An iOS app should never use an Open or Save panel to prompt the 
    user for the location of a file within the app’s sandbox. iOS apps should 
    always save files to known locations inside their sandbox, and apps should 
    use a custom interface when presenting those documents to the user. iOS apps 
    can, however, use a UIDocumentPickerViewController to prompt the user to 
    import, export, open, or move files to or from some areas outside the app’s 
    sandbox. For more information, see the Document Picker Programming Guide.

    https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/UsingtheOpenandSavePanels/UsingtheOpenandSavePanels.html
     

    unit frmSelect;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Edit, FMX.Layouts, FMX.ListBox, FMX.Controls.Presentation;
    
    type
      TCallback = procedure (ASelected: String) of object;
    
      TfmSelect = class(TForm)
        Panel1: TPanel;
        btnRefresh: TButton;
        lstItems: TListBox;
        edtCurrentFolder: TEdit;
        pnlDirectoryNotExist: TPanel;
        lblDirectoryNotExist: TLabel;
        btnSelect: TButton;
        procedure btnRefreshClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure lstItemsClick(Sender: TObject);
        procedure btnSelectClick(Sender: TObject);
      private
        { Private declarations }
      public
        const
          CONST_STRING_PARENT = '..';
          CONST_X = '/'; { I know is function for this }
    
        var
          Callback: TCallback;
    
        { Public declarations }
        function CD(AFolder: String): Boolean;
      end;
    
    var
      fmSelect: TfmSelect;
    
    implementation
    
    {$R *.fmx}
    
    uses
      System.IOUtils;
    
    procedure TfmSelect.btnSelectClick(Sender: TObject);
    var
      LResult: String;
    begin
      if Assigned(Callback) then
        begin
          if lstItems.ItemIndex = -1 then
            LResult := EmptyStr
          else
            LResult := lstItems.Items[lstItems.ItemIndex];
    
          Callback(LResult);
        end;
    
      Close;
    end;
    
    function TfmSelect.CD(AFolder: String): Boolean;
    var
      LParent: String;
      LDirs,
      LFiles: TStringDynArray;
      s: String;
    begin
      lstItems.Clear;
      pnlDirectoryNotExist.Visible := False;
      if (AFolder <> EmptyStr) and (AFolder <> CONST_X) and (AFolder[AFolder.Length - 1] <> CONST_X) then
        AFolder := AFolder + CONST_X;
      edtCurrentFolder.Text := AFolder;
    
      { http://stackoverflow.com/questions/20318875/how-to-show-the-availble-files-in-android-memory-with-firemonkey }
      if not TDirectory.Exists(AFolder, True) then
        begin
          lblDirectoryNotExist.Text := 'Directory ' + AFolder + ' does not exist.';
          pnlDirectoryNotExist.Visible := True;
          Exit(False);
        end;
    
      { }
      LParent := TDirectory.GetParent(AFolder);
    
      { }
      if LParent <> AFolder then
        lstItems.Items.Add(CONST_STRING_PARENT);
    
      { }
      LDirs := TDirectory.GetDirectories(AFolder, '*');
    
      // Get all files. Non-Windows systems don't typically care about
      // extensions, so we just use a single '*' as a mask.
      LFiles := TDirectory.GetFiles(AFolder, '*');
    
      for s in LDirs do
        lstItems.Items.Add(s + CONST_X);
    
      for s in LFiles do
        lstItems.Items.Add(s);
    
      Result := True;
    end;
    
    procedure TfmSelect.FormCreate(Sender: TObject);
    begin
      pnlDirectoryNotExist.Visible := False;
    end;
    
    procedure TfmSelect.lstItemsClick(Sender: TObject);
    var
      s: String;
    begin
      if lstItems.ItemIndex = -1 then
        Exit;
    
      if SameText(lstItems.Items[lstItems.ItemIndex], CONST_STRING_PARENT) then
        { Or we need to  use global var for Parent }
        CD(TDirectory.GetParent(edtCurrentFolder.Text))
      else
        begin
          s := lstItems.Items[lstItems.ItemIndex];
    
          if s = EmptyStr then
            Exit;
    
          if s[s.Length - 1] = CONST_X then
            CD(s);
        end;
    end;
    
    procedure TfmSelect.btnRefreshClick(Sender: TObject);
    begin
      if edtCurrentFolder.Text <> EmptyStr then
        CD(edtCurrentFolder.Text)
      else
        CD(TPath.GetDocumentsPath);
    end;
    
    end.

     

    Использование

    if fmSelect = nil then
        begin
          Application.CreateForm(TfmSelect, fmSelect);
          fmSelect.Callback := Yahoo;
        end;
      fmSelect.Show;
      fmSelect.CD(TPath.GetDocumentsPath);
    
    
    procedure TFormXX.Yahoo(ASelectedItem: String);
    begin
      ShowMessage(ASelectedItem);
      //
    end;
  6. Друзья, нашел тут интересную статью, где тестируются разные jSON парсеры.

     

    Ссылка: http://www.webdelphi.ru/2016/10/ishhem-samyj-bystryj-parser-json-v-delphi/

    Автор: Владислав Баженов

    Описание (26/10/2016):

    Скрытый текст

    В продолжение статьи об инструменте для просмотра JSON решил разобраться с вопросом: какой самый быстрый парсер JSON есть в Delphi? На сегодняшний день у Delphi-разработчиков более, чем достаточно различных библиотек для работы с JSON, в том числе имеются и «родные» классы для JSON. И хотелось бы узнать, какая из библиотек окажется самой быстрой.В качестве теста я решил проверить, как справятся библиотеки с парсингом файла, размером в 189 Мб (ссылка).

    Библиотеки, которые тестировались:

    Какие-то из этих библиотек развиваются и постоянно  дорабатываются, например, как x-SuperObject, а какие-то давно уже «умерли», но, тем не менее, на просторах Интернета о них упоминается чаще, чем о других может быть более новых библиотеках, о которых я не в курсе.

    Тест проводился согласно демонстрационным примерам к библиотекам

    В тесте я обращал внимание не только на время, которое потребуется библиотеке, чтобы распарсить большой файл, но и размер оперативной памяти, который займет программа после того, как библиотека справится с большим JSON. В «спокойном» состоянии тестовая программа занимает в оперативной памяти 1,4 Мб.

    Работа каждой библиотеки проверялась трижды. После каждого вызова процедуры парсинга, тестовая программа полностью перезагружалась.

    Вот какие результаты в итоге были получены:

    Библиотека Время парсинга Объем занимаемой памяти, Mb
    lkJson 00:00:13.9 1008,3
    Delphi Web Utils 00:03:46.6 912,4
    SuperObject Out of Memory
    x-SuperObject Out of Memory
    Fast JSON lib Программа зависла
    System.JSON Out of Memory

    Три библиотеки (SuperObject, System.Json и FastJson lib) не справились с разбором тестового файла.

    При этом FastJSON lib на протяжении получаса «отъедала» 51,4% CPU и 911 Mb оперативной памяти, но так ничего и не распарсила.

    x-SuperObject  справилась с задачей один раз, затратив на это чуть более 50 секунд, второй и третий разы выдала out of Memory.

    SuperObject и System.Json сошли с дистанции практически сразу, выкинув перед этим «Out of Memory».

    Из оставшихся самой быстрой оказалась библиотека lkJson, которая справилась с заданием за примерно 14 секунд и заняла в памяти чуть больше 1 Гб.

    Delphi Web Utils затратила в 14 раз больше времени (3 минуты 46 секунд), но в памяти заняла примерно на 100 Мб меньше.

    Что тут можно сказать…lkJson, как и Delphi Web Utils не обновлялись с 2013 года, однако с задачей парсинга большого JSON справились. Так что, если вы ищите небольшую, но достаточно быструю библиотеку для парсинга больших и очень больших JSON-объектов, то, думаю, что Вам стоит присмотреться к lkJson.

     

  7. Вообще время должно отображаться в том формате, который показывает TimeEdit по умолчанию. Т.к. это системный формат, и он удобен тому пользователю, которые его установил. 

    24 часовой формат: 

    TimeEdit1.Format := 'HH:mm';

     

    Чтобы принудительно на am pm перевести:

    TimeEdit1.Format := 'hh:mm ampm' -  главное чтобы была строчка ampm или am\pm или .

     

     

  8. Там много чего перестало работать в токио, плюс упала в 2 раза производительность, нужно подождать обновление, а до этого лучше не использовать Токио для Android. Больше информации на сайте эмбаркадеро.

  9. Попробуйте  THashSHA1.GetHMACAsBytes из System.Hash.pas 

    Вообще мне больше нравятся System.Net компоненты вместо Indy.

     

     

    Ну и вдогонку 

    function OAuthEncryptHMACSha1(const aValue, aKey: string): string;
    begin
      Result :=  TNetEncoding.Base64.EncodeBytesToString( THashSHA1.GetHMACAsBytes(aValue, aKey) );
    end;

     

  10. Равиль Зарипов 

     

    Спасибо. А как вообще проводиться авторизация? Ведь пользователь должен ввести свой email и пароль к своему DropBox акку?

    Через что это делается? 

    Насколько я понял через TWebBrowser?

  11. Vitaldj

    Идея была в том что FireDac универсальный мультиплатформенный компонент для доступа к разным базам данных.

    Покурив мануалы, понял что FireDac MySQL не работает на моб. платфомах, есть только вариант использовать DevArt DAC, он работает с mySQL с моб. платформы, правда он платный (FireDac тоже в принципе платный ).

  12.  

    Цитата

    Vitaldj

    И для мобильных операционных систем ты не найдешь драйвера

    Вообще информации много в сети по поводу доступа из моб. систем при помощи FireDac, это и статьи, видео и темы на форумах..

    Откуда у вас такая информация? 

    http://docwiki.embarcadero.com/RADStudio/Berlin/en/Mobile_Tutorial:_Using_FireDAC_and_SQLite_(iOS_and_Android)

     

  13. RESTAPI для меня новый компонент.

    Ничего не знаю о нем. Нашел пару статей о том как сделать upload ,

    http://simshelloworld.blogspot.co.uk/2014/12/restuploadfile.html

    https://forums.embarcadero.com/thread.jspa?threadID=109596

    но там показан только upload, а как провести авторизацию? Ведь пользователь должен ввести свой email и пароль, должна показаться формочка с кнопкой разрешить.. Вобщем с чего начать подскажите пожалуйста?

     

    P. s.  Есть набор компонентов TMS FMX Cloud - там все это есть и рабочее, но денег у меня к сожалению нет на его покупку (в год 150$)...

     

     

×
×
  • Создать...