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

zekelive

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

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

  • Посещение

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

    1

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

  1. В 02.09.2020 в 08:57, krapotkin сказал:

    логика должна быть такой

    в главном потоке запускаем индикатор и доп. поток.

    При окончании работы доп. поток например в событии OnTerminate прячет индикатор. 

    Всё.

    Если есть прямо жестокая необходимость, чтобы доп. поток как-то отчитывался о прогрессе, пусть отправляет сообщения в главный поток.

    Никаких других знаний друг о друге у обоих потоков быть не должно.

    Это идеальная универсальная схема. Ессн бывают всякие обстоятельства, но в целом она рабочая всегда.

    подробнее я писал об этом тут

     

    Здравствуйте. Ознакомился с вашей статьей по ссылке. Правильно ли я понял, что можно запустить индикатор по нажатию кнопки, и там же запустить доп.поток в который и происходят вся вычисления. Вопрос в том, в доп.потоке помимо вычислений происходит и динамическое создание визуальных компонентов. Которые потом кладутся на scrollbox. Где то в этот момент при создании компонентов и зависает индикатор. Я вот и хотел узнать, как сделать так, чтобы индикатор никогда не зависал?

  2. 7 минут назад, dnekrasov сказал:

    В Synchronize надо заключать КАЖДОЕ обращение к визуальной части. Вы же этого не сделали (если я правильно понял код), или сделали частично. К тому же у Вас столько строк надо синхронно делать, что я просто не вижу смысла в таком потоке. Мой Вам совет - меняйте логику.

    Под заменой логики, что имеете в виду? У меня просто в голове других вариантов нет

  3. Коллеги, здравствуйте. Помогите пожалуйста с работой потоков. При запуске потока, появляется индикатор и исправно крутится. В какой то момент он залипает и перестает крутиться и так до конца работы потока. Понимаю, что в потоке идет работа с визуальными компонентами, по этому скорее всего и залипает индикатор. Как исправить/оптимизировать код? Спасибо.

       DelOff = class (TThread)
      protected
        FOnTaskStarted: TThreadMethod;
        FOnTaskFinished: TThreadMethod;
        procedure DoStarted;
        procedure DoFinished;
        procedure load;
        procedure Execute; override;
      public
        property OnTaskStarted: TThreadMethod read FOnTaskStarted write FOnTaskStarted;
        property OnTaskFinished: TThreadMethod read FOnTaskFinished write FOnTaskFinished;
      end;
    
      procedure DelOff.DoFinished;
      begin
      Add.Layout1.Visible:=false;
    
      if Assigned (Add.FindComponent('Null') as TLayout)
      then
      (Add.FindComponent('Null') as TLayout).Free;
      end;
    
      procedure DelOff.DoStarted; 
      begin
      Add.Layout1.Visible:=true;
      end;
    
    procedure DelOff.load; 
      begin
    
      try
       ReOpen;
       ClientModule2.ServerMethods1Client.Number13(a,b,g,h);
    
       a:='1';
       ReOpen;
       offerlist1.Lines.Text:=ClientModule2.ServerMethods1Client.Number12(a,b,g,h); 
    
       a:='2';
       ReOpen;
       sumofferlist1.Lines.Text:=ClientModule2.ServerMethods1Client.Number12(a,b,g,h);
    
       a:='3';
       ReOpen;
       keyofferlist1.Lines.Text:=ClientModule2.ServerMethods1Client.Number12(a,b,g,h); 
    
       ReOpen;
       offercount:=ClientModule2.ServerMethods1Client.Number11(a,b,g,h);
    
      except
      ANM.Show;
      Add.Visible:=false;
    
             ShowmessageToast('Ошибка загрузки',TJToast.JavaClass.LENGTH_LONG);
    
        Value := Trim('10,500');
       if Add.CheckPermission then
        if Value.Contains(',') then
          TVibratorHelper.vibrate(Value.Split([',']), -1)
        else
          TVibratorHelper.vibrate(Value.ToInt64);
      end;
      end;
    
      procedure DelOff.Execute;
      begin
      inherited;
      //Удаление из БД продукта
      try
    
      try
      Synchronize(DoStarted);
    
      updatecount:=StringReplace((Add.FindComponent('LabelIntro') as TLabel).Hint, 'Rec', '', [rfReplaceAll]);
    
       a:=(Add.FindComponent('NameProduct'+updatecount) as TLabel).Hint;
       di:= TZDeviceInfo.Create;
       b:=StringReplace(di.DeviceID, '=', '', [rfReplaceAll]);
    
       if(internet='true') and (server='true')
       then
     begin
    
       EditCase:='false';
       Add.PSB.AutoCalculateContentSize:=false;
       Add.PSB.EnabledScroll:=true;
       Add.PSB.AutoCalculateContentSize:=true;
    
       synchronize(load);
    
       if Assigned (Add.FindComponent((Add.FindComponent('LabelDel') as TLabel).Hint))
       then
       begin
       (Add.FindComponent((Add.FindComponent('LabelDel') as TLabel).Hint) as TRectangle).Free;
       (Add.FindComponent('RecEdit') as TRectangle).Free;
       end;
    
       Add.PSB.ScrollTo(0,0,true);
    
        for countload:=0 to StrToInt(offercount)-1 do
        begin
    
        (Add.FindComponent('XRun'+IntToStr(countload)) as TFloatAnimation).Enabled:=false;
        (Add.FindComponent('x'+IntToStr(countload)) as TImage).Opacity:=0;
    
        (Add.FindComponent('VRun'+IntToStr(countload)) as TFloatAnimation).Enabled:=false;
        (Add.FindComponent('v'+IntToStr(countload)) as TImage).Opacity:=0;
    
        end;
    
       end
       else
       begin 
    
       ShowmessageToast('Нет интернета',TJToast.JavaClass.LENGTH_LONG);
    
           Value := Trim('10,500');
       if Add.CheckPermission then
        if Value.Contains(',') then
          TVibratorHelper.vibrate(Value.Split([',']), -1)
        else
          TVibratorHelper.vibrate(Value.ToInt64);
    
       end;
    
      finally
      Synchronize(DoFinished);
      end;
    
      except
      ANM.Show;
      Add.Visible:=false;
    
             ShowmessageToast('Ошибка загрузки',TJToast.JavaClass.LENGTH_LONG);
    
        Value := Trim('10,500');
       if Add.CheckPermission then
        if Value.Contains(',') then
          TVibratorHelper.vibrate(Value.Split([',']), -1)
        else
          TVibratorHelper.vibrate(Value.ToInt64);
      end;
      end;

     

  4. Всем добра) коллеги, подскажите пожалуйста, с чем связаны артефакты вокруг TLabel? Некие полосы вокруг надписей. Метка лежит на TColorBox, а он в свою очередь на VertScrollBox.

    IMG_20200826_090448.jpg

  5. Коллеги, подскажите, с TMapVIew что то изменилось в настройках? Перешел на версию 10.4 Android и понадобилась снова работа с картами. Как обычно получил apikey добавил Maps Service в настройках RAD, все разрешения дал на геолокацию и Ничего. Приложение падает при создании TMapVIew; Код крайне банален:

    procedure TGeo.Button3Tap(Sender: TObject; const Point: TPointF);
    var
    map:TMapView;
    begin
    map:=TMapVIew.Create(Geo);
    map.Parent:=Geo;
    map.Align:=TAlignLayout.Client;
    end;

    Что снова не так и куда смотреть?

  6. Коллеги, здравствуйте. Поставил новую версию студии и привычный код местами стал подводить. Как обычно создаю форму 

    Application.CreateForm(TRegForm, RegForm);
    
      if Assigned(RegForm)
      then
      begin
      RegForm.Visible:=true;
      Main.Visible:=false;
      end;

    и при выполнении кода вылетает ошибка, что на скрине. 

    Уже туплю. Скажите, что изменилось? как теперь запускать формы. 

    P.S. Тоже самое происходит, если формы переместить в раздел auto-create forms. Форма создается в единственном случае, когда в шапке ставишь ее главной.

    eglmakecurrent.png

    form.png

  7. 1 минуту назад, Tumaso сказал:

    Увы, но нет проблем вытащить пароль из apk, если он лежит в открытом виде. Подпись приложения этому никак не препятствует (подпись гарантирует только отсутствие изменений, но не более того).

    Пароль внутри кода однозначно нужно хранить в разобранном виде, чтобы его было как можно сложнее узнать. Идеальный вариант - получать зашифрованный пароль с сервера, причем с использованием временных ключей шифрования.

    Интересные подробности. Спасибо, буду думать как организовать это.

  8. 10 часов назад, FREEFAR сказал:

    все то же самое. Включаешь тип шифрования и пароль. 

    В нашем случае мы БД создавали в рантайме

    С шифрование разобрался спасибо за информацию. Возник вторичный вопрос, т.к. пароль указывается в интерфейсе самого firebird из под delphi, не будет ли возможно его вытащить из apk файла путем его декомпиляции? Или лучше пароль передать из серверной БД? Пароль для обращения к БД каким то образом шифруется или нет?

  9. 2 минуты назад, FREEFAR сказал:

    - А что пугает в локальном расположении БД? SQL lite прекрасно шифруется sha256 с головой.

    - DataSnap убогий на мой взгляд. Уже сколько релизов подряд он течет не дай бог как. И по сути не лучшее решение для web сервера. Я думаю многие поддержат меня когда я скажу что лучшим вариантом будет трехзвенка Client -> PHP -> DB

    - Хранить статичные данные в локальной БД тоже такое себе. А вдруг они станут не актуальны? Надо учесть это и описать методы их замены/удаления. Ну а также VACUUM

    Катраз использую sql lite для локальной БД. Но из коробки delphi шифрование отсутствует. Подскажите, в какую сторону копать? 

  10. Товарищи, здравствуйте. Хотел бы проконсультироваться с вами на довольно сложно для меня тему. Имеется клиентское мобильное приложение на Андроид. Принцип его просто, загружает фирмы из БД в scrollbox. За счёт того, что сразу загрузка всех данных из сервера занимает длительное время, было принято решение загружать с сервера только ключевую информацию (название фирмы), а остальную информацию загружать из локальной БД. При этом, т.к. файл БД можно легко вытащить из apk файла любому человеку, размещать всю БД на локалке нельзя. Только информацию в целом не представляющую большой значимости в отдельности от названия фирмы и не только. 

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

    Приветствуются ваши советы, как лучше построить схему взаимодействия приложения с БД, или как лучше защитить данные. В идеале для быстродействия, загнать побольше данных в локальную БД. 

  11. 5 часов назад, sinuke сказал:

    Да, нужен ключ специально для карт. Как его получить - погуглите. Я уже не помню как его получал, но точно помню, что через гугл все нашел и довольно быстро разобрался. Ничего сложного

    Подскажите, с ключом разобрался, вылетать перестало. Но карта пустая. На ней нету ничего. Ещё одна преблуда нужна?)

  12. 1 минуту назад, sinuke сказал:

    Дело не в устройстве. Даже стандартный пример работать не будет до тех пор, пока не пропишите ваш apiKey

    У меня есть приложение, которое заливается на Маркет, соответственно там прописаны уже все ключи, но и в том приложение все равно происходит вылет при добавлении карты на форму. Нужен ключ специально для карт? Как его получить и куда воткнуть?

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