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

Евгений Корепов

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

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

  • Посещение

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

    100

Сообщения, опубликованные Евгений Корепов

  1. 7 часов назад, wamaco сказал:

    карту Peoneer закажите и через регистраторов (PPG, например) выводите на нее деньги как физ.лицо

    много инфы на rsdn, в разделе shareware

    С выводом проблем как раз нет - кредитка Тинькова (в рублях), реквизиты на пополнение в долларах есть прямо в Личном кабинете. Деньги приходят за пару суток, без процентов, по курсу ЦБ.

    На rsdn нашел только https://rsdn.ru/forum/shareware/6489133.flat#6489133 , но и за это уже спасибо!

  2. 19 часов назад, Andrey Efimov сказал:

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

     

    p.s. Про сервисы Firebase (Analytics, Cloud Messaging и т.д.), ещё не успел рассмотреть эту тему, но в планах есть.

    Как раз полно статей об уклонении от уплаты налогов ;-) Четкой инструкции о работе как физ. лицо, без создания ИП, не нашел. Мой печальный опыт закончился требованием налоговой предоставить ИНН и КПП гугля (для заполнения листа Б декларации - доходы полученные за рубежом), а объяснения что эти реквизиты чисто российская придумка вызвали у них когнитивный диссонанс. В итоге сказали не мешать им работать своими смешными копейками. Может наведете на полезные статьи? Заранее благодарю.

  3. Спасибо за статью! К ней бы еще добавить логическое окончание - настройка платёжных данных, легальный вывод средств и уплата налогов с полученных доходов из за рубежа. Последнее особенно актуально.

    P.S. Как я понимаю прелести Firebase Analytics для пользователей Delphi не доступны?

  4. 3 часа назад, Rusland сказал:

    Евгений Корепов, как "пробежать" по такому списку и проверить какой выделен?

    Способов множество, вот один из них:

    function TFormMain.GetCheckedIndex : Integer;
    Var I : Integer;
    begin
      for I := 0 to ListBox.Count-1 do
      begin
        if Assigned(ListBox.ItemByIndex(I).Children.Items[0]) then
          if ListBox.ItemByIndex(I).Children.Items[0] is TRadioButton then
            if (ListBox.ItemByIndex(I).Children.Items[0] as TRadioButton).IsChecked Then
            begin
              Result:=I;
              Exit;
            end;
      end;
      Result:=-1;
    end;

    Или же можно назначить всем один обработчик изменения     ARadioButton.OnChange:=RadioButtonChange;

    procedure TFormMain.RadioButtonChange(Sender: TObject);
    Var Index : Integer;
    begin
      if Sender is TRadioButton then
        Index:=((Sender as TRadioButton).Parent as TListBoxItem).Index;
    end;

     

  5. Интервал из 1 минуты превращается в десять. Правда пока я курил и листал новости на телефоне (с 2016-06-23 14:27:35) запросы опять вернулись на минутный интервал. Приложение на передний план с начала эксперимента не выводил. 

    Как вообще работает TTimer Delphi на андроиде? Может есть возможность задействовать некий аппаратный таймер? Есть что то такое?

  6. Не удержался и написал сам приложение для теста Persistent.

    Приложение пишет раз в минуту, после этот пишет 5 раз с интервалом в 1 секунду.

    Приложение запустил, нажал кнопку Home дабы свернуть его. Cледить за процессом можно здесь http://kayfolom.ru/?cmd=read&api_key=Persistent_test01, или в json формате здесь http://kayfolom.ru/?cmd=read&api_key=Persistent_test01&output_format=json

    Делаем ставки господа и дамы! ;-)

    P.S. Эксперимент не удался. После нескольких тестов выяснилось что запросы перестают приходить даже если приложение на переднем фоне и телефон блокируется по таймауту. Нажатие Хоме, тоже останавливает приложение. Даже если выбрать приложение из списка запущенных, таймеры не просыпаются до тех пор, пока не ткнеш на какой либо элемент управления (кнопку к примеру).Оставляю приложение в фоне, в надежде понять логику режима Persistent.

  7. 52 минуты назад, Сысоев Максим сказал:

    Лучше лог разбейте по частям и в джейсон все это дело. Типа такого:

    
    {
    	"status": "ok",
    	"logs": [{
    		"date": "2016-06-23",
    		"time": "11:19:40",
    		"IP": "195.22.104.78",
    		"Message": "Я еще живой, не дождетесь!"
    	},
    	{
    		"date": "2016-06-23",
    		"time": "11:19:40",
    		"IP": "195.22.104.78",
    		"Message": "Я еще живой, не дождетесь!"
    	}]
    }

    Что бы можно было результат сразу в JSON парсер загонять

    Хорошая идея! Добавил не обязательный параметр output_format, если он равен json, то выводится в json:

    http://kayfolom.ru/?cmd=read&api_key=7imq4rcq7rcqm7q3&output_format=json

    {
        "status": "ok",
        "logs": [
            {
                "datetime": "2016-06-23 11:19:40",
                "datetime_unix": "1466669980",
                "ip": "195.22.104.78",
                "message": "Я еще живой, не дождетесь!"
            },
            {
                "datetime": "2016-06-23 11:19:26",
                "datetime_unix": "1466669966",
                "ip": "195.22.104.78",
                "message": "Я еще живой, не дождетесь!"
            },
            {
                "datetime": "2016-06-23 11:19:25",
                "datetime_unix": "1466669965",
                "ip": "195.22.104.78",
                "message": "Я еще живой, не дождетесь!"
            },
            {
                "datetime": "2016-06-23 11:19:20",
                "datetime_unix": "1466669960",
                "ip": "195.22.104.78",
                "message": "Я еще живой, не дождетесь!"
            }
        ]
    }

     

  8. Поиграйтесь с опциями компилятора, возможно в релизе оптимизация или еще что влияет. Я как то бился над подобной проблемой несколько дней, выяснилось что включение оптимизации выполняло один из циклов for задом наперед ;-)

  9. unit Unit1;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
      FMX.Controls.Presentation, FMX.StdCtrls;
    
    type
      TForm1 = class(TForm)
        ProgressBar: TProgressBar;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        Timer : TTimer;
        procedure TimerTimer(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.fmx}
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ProgressBar.Min:=0;
      ProgressBar.Max:=100;
      Timer:=TTimer.Create(Self);
      Timer.Interval:=10; // милисекунд, 1000 = 1 секунде
      Timer.OnTimer:=TimerTimer;
      Timer.Enabled:=True;
    end;
    
    procedure TForm1.TimerTimer(Sender: TObject);
    begin
      ProgressBar.Value:=ProgressBar.Value+0.1;
      if ProgressBar.Value>=ProgressBar.Max then
        Timer.Enabled:=False;
    end;
    
    end.

     

  10. Попробуйте поэкспериментировать с  "Project options -- Version info -- persistent=true", как уже сказал уважаемый krapotkin. Сделайте приложение пустышку которое будет раз в N секунд отсылать запрос на сервер. Чем черт не шутит, может этот вариант подойдет. Я вам безвоздмездно предоставляю api на одном из своих хостингов, на одном из не используемом домене:

    http://kayfolom.ru/?cmd=[write|read]&api_key=[api_key]&message=[message]

    cmd - write пишем, read читаем

    api_key - произвольная строка до 40 символов, идентифицирующая проект, к примеру "kasjlqw4q4t784" или "My_test_persistent_project", лучше использовать латинские буквы без спецсимволов и пробелов.

    message - произвольная строка, на любом языке, в кодировке utf8. Максимальная длина 255 символов.

    Пример использования:

    В своем приложении вы делаете так

    procedure LogToServer(AMessage, AAPIKey : String);
    Var Query : String;
        HTTPClient: THTTPClient;
    begin
      Query:='http://kayfolom.ru/?cmd=write&api_key='+AAPIKey+'&message='+AMessage;
      HTTPClient:=THTTPClient.Create;
      HTTPClient.Get(Query);
      FreeAndNil(HTTPClient);
    end;
    
    LogToServer('Я еще живой, не дождетесь!', '7imq4rcq7rcqm7q3');

    Потом в браузере открываете ссылку http://kayfolom.ru/?cmd=read&api_key=7imq4rcq7rcqm7q3 и видите примерно следующее:

    2016-06-23 11:19:40	195.22.104.78	Я еще живой, не дождетесь!
    2016-06-23 11:19:26	195.22.104.78	Я еще живой, не дождетесь!
    2016-06-23 11:19:25	195.22.104.78	Я еще живой, не дождетесь!
    2016-06-23 11:19:20	195.22.104.78	Я еще живой, не дождетесь!
    { "status" : "ok" }

    Сможете мониторить время и с какого IP прислано сообщение. Результатами эксперимента поделитесь. У меня вот XE8, сервисы там отсутствуют, а задумки есть интересные.

    P.S. Если кому нужно, пользуйтесь этой штукой на здоровье. Только не злоупотребляйте. Несколько запросов с секунду это нормально, а тысячи запросов в секунду вынудят меня прикрыть лавочку :-) Если нужно, прикручу команду очистки истории.

  11. 11 час назад, Andrey Efimov сказал:

    Постараюсь заняться этим вопросом, пока были планы на другую тему, но всё может измениться ;)

     

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

    Поддержал ваш блог небольшой суммой. В наше время текстовый, русскоязычный блог посвященный Delphi редкость, в основном все перешли на видео блоги. А время смотреть полуторачасовое видео для получения информации умещающейся в паре предложений есть не у каждого ;-)

  12. 1 час назад, master webs сказал:

     

    2016-06-21_16-28-29.png

    Нет, вставлять надо именно Идентификатор отправителя. На кой они его обзывают то API ключем, то API FCM. Кнопка в диалоговом окне у них "Связать" или "Ок" или "Подключить", зависит он настроения переводчика. 

    Все вставилось, связалось и подключилось. Просто с точки зрения гугля, открытое бета-тестирование - не повод для тестирования GCM, теперь уже FCM. 

  13. Спасибо вам за отличные статьи! Не планируете создать статью о Firebase, в частности о консоли Firebase? Самостоятельно не получается разобраться, по какой то причине консоль уже наполнена проектами, в проектах по несколько приложений, одно и тоже приложение дублируется в трех местах. Что за проект "Google Play Android Developer" и чем он отличается от остального мусора в этой консоли.

  14. 11 минуту назад, master webs сказал:

    Нужно указывать api key а не цифровой id

    Это тот что в файле google-services.json ?

          "api_key": [
            {
              "current_key": "AIza******7I"
            }

    При попытке вставить это получаю  Неверный ключ FСМ API (Отправитель не зарегистрирован).

  15. Что то я совсем туплю. Не могу подключить идентификатор отправителя к проекту в Google Developer Console. 

    В console.firebase.google.com создаю проект, в cloudmessaging вижу "Идентификатор отправителя", но при копировании его в консоль разработчика мне говорит Неверный ключ FСМ API (Неверный ключ). 

    Проект правда в открытом бета-тестировании, может из за этого? Раньше была эта процедура через жопу, но зато работала, теперь вроде попытались сделать красиво, но видимо у меня ума не хватает.

    P.S. Как заставить работать консоль разработчика на английском языке? А то консоль на русском, факи и помощь большей частью на английском, даже в терминологии название пунктов меню консоли полная каша, как будто на русский переводят пол сотни переводчиков, каждый по одному предложению и у каждого свое видение мира...

  16. Тут главное не забыть RadioButton1.GroupName:='SelectDestiny' и так для всех RadioButton одинаковый GroupName, тогда выбираться будет только один.

    procedure TFormMain.CreateOpenComboEdit;
    Const GroupName = 'Select destiny';
    Var I : Integer;
        ALisBoxItem : TListBoxItem;
        ARadioButton : TRadioButton;
    begin
      for I := 0 to 5 do
      begin
        ALisBoxItem:=TListBoxItem.Create(ListBox);
        ALisBoxItem.Text:='';
        ARadioButton:=TRadioButton.Create(ALisBoxItem);
        ARadioButton.GroupName:=GroupName;
        ARadioButton.Text:=GroupName+' '+I.ToString;
        ARadioButton.Align:=TAlignLayout.Client;
        ALisBoxItem.AddObject(ARadioButton);
        ListBox.AddObject(ALisBoxItem);
      end;
    end;

     

  17. 4 часа назад, HyperZen сказал:

    Ярослав, сегодня, вновь тестируя различные размеры шрифтов, обнаружил, что если по умолчанию выставить размер шрифта 14 (под Андроид), расчет все равно неверный - не хватает буквально 5% высоты, добавлять ее вручную не хочется, потому как при всех других размерах все корректно. Если изменить размер шрифта в рантайме - и вернуть на 14, то все опять корректно. Неправильный подсчет только при запуске приложения и в случае, если размер стоит = 14.

    Вышел из положения добавляя при расчете 0.1 к размеру шрифта:

      Drawable.Font.Size := spnBoxFontSize.Value + 0.1; // при старте программы размер выставляется относительно значения SpinBox'а

    Попробуйте проверить отладкой какой размер шрифта попадает в GetTextHeight. Потому что по умолчанию размер 12, а в стиле размер может быть 18. Так же вы не выполняете ListView.ApplyStyleLookup после заполнения ListView. 

    Очень рекомендую перед заполнением ListView выполнять код

          AListView.BeginUpdate;
          AListView.OnUpdateObjects:=Nil;

    После заполнения:

          AListView.EndUpdate;      
          ListViewUpdateAll(AListView); // В цикле применяет ListViewUpdateObjects ко всем элементам
          AListView.ApplyStyleLookup;
          AListView.OnUpdateObjects:= ListViewUpdateObjects;

     

  18. 2 часа назад, AndroidHalfNoob сказал:

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

    В первом сообщении этой темы есть ссылка на обсуждаемый здесь компонент  TKRBarCodeSanner.zip, у этого компонента есть событие TKRBarCodeScannerScanResult(Sender: TObject;  AResult: string), ну и  AResult - это то где находится результат сканирования.

  19. Если не получается сразу определить источник ошибок, я публикую для бетатестеров  новую версию приложения, где FAppStage прописана более подробно - начало конец вызова каждой подозрительной функции или кода.

  20. Я использую дополнительный модуль с отдельным потоком отправляющий все что надо на мой сервер. На сервере кусок кода на php все это пишет в лог.

    В основном коде использую глобальную переменную FAppStage :

    procedure TFormMain.ServiceConnectionOnChange(Sender: TObject; AChange: TPushService.TChanges);
    begin
      FAppStage:='ServiceConnectionOnChange start';
      if AChange=[TPushService.TChange.DeviceToken] Then
        GetHTTP(CommandActions, -1, '');
      FAppStage:='ServiceConnectionOnChange stop';
    end;

    В проекте лежит TfgApplicationEvents, в нужных событиях, к примеру fgApplicationEventsException, идет отправка FAppStage и E: Exception. В логе я вижу где и какое исключение произошло. 

    Достаточно удобно мне кажется.

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