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

Доработка компонента для чтения штрих-кодов под RAD XE7


ophion

Вопрос

Добрый вечер дамы и господа.

 

Для RAD XE5 был написан замечательный компонент для работы со считыванием штрих-кодов на мобильных платформах.

Суть темы следующая...

 

Этот компонент очень легко переделать под RAD XE6, но вот под XE7 он никак не идёт, а разбираться с этой проблемой, честно говоря, нет времени.

 

Я выложу ссылочку на компонент, который отлично работает с XE5, а остальные представители сообщества, у которых найдется немного времени, могут допилить его для версий XE6 и XE7 и запостить в этой теме ссылочки и описания изменений.

 

Коллективный разум, так сказать...

 

Вот сама ссылочка для версии XE5

 

TKRBarCodeSanner.zip

 

P.S.

 

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

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Может особенности девайса....

 

Galaxy NOTE 2 (Android 4.4.2)

 

После сканирования не отрабатывает OnScanResult.

 

информация размещается в буфере обмена, но вот AResult в себе информации не содержит.

Ссылка на комментарий
  • 0

Там адаптировать нечего, всего 2 изменения в файле FMX.TKRBarCodeScanner.pas.

 

1.

// было
uses
  System.Classes
  {$IFDEF IOS}
  ,FMX.TMSZBarReader
  {$ENDIF}
  {$IFDEF ANDROID}
  ,FMX.Platform, FMX.Helpers.Android, System.Rtti, FMX.Types, System.SysUtils,
  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes,
  FMX.StdCtrls, FMX.Edit
  {$ENDIF}
  ;

// стало
uses
  System.Classes
  {$IFDEF IOS}
  ,FMX.TMSZBarReader
  {$ENDIF}
  {$IFDEF ANDROID}
  ,FMX.Platform, FMX.Helpers.Android, System.Rtti, FMX.Types, System.SysUtils,
  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes,
  FMX.StdCtrls, FMX.Edit
    {$IF CompilerVersion >= 20}
    ,Androidapi.Helpers
    {$ENDIF}
  {$ENDIF}
  ;

2

// было
{$IFDEF ANDROID}
function TTKRBarCodeScanner.HandleAppEvent(AAppEvent: TApplicationEvent;
  AContext: TObject): Boolean;
begin
  Result := False;
  if FMonitorClipboard and (AAppEvent = aeBecameActive) then
  begin
    Result := GetBarcodeValue;
  end;
end;
{$ENDIF}

// стало
{$IFDEF ANDROID}
function TTKRBarCodeScanner.HandleAppEvent(AAppEvent: TApplicationEvent;
  AContext: TObject): Boolean;
begin
  Result := False;
  if FMonitorClipboard and (AAppEvent = {$IF CompilerVersion >= 20}TApplicationEvent.{$ENDIF}aeBecameActive) then
  begin
    Result := GetBarcodeValue;
  end;
end;
{$ENDIF}
Ссылка на комментарий
  • 0

А вот теперь у меня возникли проблемы с этим компонентом. Суть в следующем - в XE6 все работает замечательно, а в XE7 не приходит событие. Код для проверки простой

procedure TForm1.Button1Click(Sender: TObject);
begin
   TKRBarCodeScanner1.Scan;
end;

procedure TForm1.TKRBarCodeScanner1ScanResult(Sender: TObject; AResult: string);
begin
   Button1.Text := '!!!';
end;

Экспериментальным путем выяснил, что когда приложение вновь становится активным, в XE6 оно получает 2 сообщения - WillBecomeForeground и BecameActive, а в XE7 дважды приходит WillBecomeForeground. Из за этого не отрабатывает функция

{$IFDEF ANDROID}
function TTKRBarCodeScanner.HandleAppEvent(AAppEvent: TApplicationEvent;
  AContext: TObject): Boolean;
begin
  Result := False;
  if FMonitorClipboard and (AAppEvent = {$IF CompilerVersion >= 20}TApplicationEvent.{$ENDIF}aeBecameActive) then
  begin
    Result := GetBarcodeValue; // Сюда не попадает !!!!!!
  end;
end;
{$ENDIF}

Но даже если в отладчике принудительно передать управление на эту строчку, вызов функции GetBarcodeValue не происходит. Помогите разобраться!

Ссылка на комментарий
  • 0

Обход проблемы описан здесь. Похоже это действительно баг XE7, и если это на самом деле так, хочется в очередной раз сказать разработчикам: "Ребята, не торопитесь. Лучше выпускать 1 версию RAD Studio в год, при этом больше времени уделяя тестированию. Не нужно гнать брак...".

Ссылка на комментарий
  • 0

Обход проблемы описан здесь. Похоже это действительно баг XE7, и если это на самом деле так, хочется в очередной раз сказать разработчикам: "Ребята, не торопитесь. Лучше выпускать 1 версию RAD Studio в год, при этом больше времени уделяя тестированию. Не нужно гнать брак...".

 

С одной стороны, да, гнать бажное ПО это не комильфо. То тут, то там выплывают баги/фичи. Т.е. количество выпущенных версий и апдейтов растёт, а количество багов не меняется. Хотя может это сообщение на эмоциях писано.

С другой стороны Embacadero стоит признаться самим себе в том, что они не могут писать ПО без багов и надо понять что это нормально - все пишут бажное ПО. Выпускается действительно много девайсов, у всех свои версии, свое железо, а еще есть надстройки от самих компаний, которые также дают свои "поправки". И в целом даже полугодичный выпуск становиться слишком долгим периодом для тех кто ждет исправлений или новшеств.

Ну и конечно ценник на новую версию не маленький. И многие делают большие пропуски в покупках, ибо нет желания (не то что возможности, а именно желания уже нет) платить за новые версии, в которых ждут новые баги. В итоге покупают скорее всего (Embacadero виднее конечно)  через одну, две, а то и через три версии. Все остальные используют ломанные версии. А всё вместе это ведет к упущенной выгоде в Embacadero.

В очередной раз прошу Embacadero обратить внимание на политику продаж  лицензий у UDK4.

Вы регистрируетесь на сайте. Оплачиваете 19$/мес, и скачиваете launcher. Через launcher можно скачать примеры (платные и бесплатные), а также саму среду UDK4. Самое главное что сразу в лаунчере доступны обновления с новыми фишками и исправленными ошибками, т.е. там так и  идет - версия 4.0.1, 4.0.3, 4.0.4. И можно скачать новую если хотите и если ваша подписка не истекла.

У Embacadero уже есть зачатки подобного - это AppMethod. Но он обновляется исключительно по выходу новых версий или апдейтов.

Хотя было бы куда лучше если у тех кто имел подписку была возможность получать обновления сразу.

Насколько я помню в ХЕ7 было исправленно почти 2000 багов. Но всем пришлось ждать выхода новой версии. Разработчики не в один миг же, в день перед релизом, их исправили, они шли к этому день ото дня. Так почему же по такой схеме не выкладывать версии и патчи по мере исправления багов - 10 багов исправили и выложили. Исправили в 1 баг в неделю, тоже выложили. 

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

Есть конечно и такая фишка, не думаю что Embacadero пойдет на неё, но все же - это то что даже после окончания подписки, среда всё еще доступна. Просто вы больше не можете получать обновления, готовое ПО не может быть использовано в коммерческих целях и нельзя писать в тех поддержку и отписываться о багах. Но по прежнему доступен офф. форум.

Да и может убрать это безумное количество типов Pro, Enterprise и разделение по платформам и т.д.? Не уверен, но мне кажется что изжило себя - это раз, а во вторых для компании поддерживать их после выпуска новых версий наверное геморно. 

 

Могу привести пример себя - даже если я не пользуюсь UDK4 каждый день, я всё равно оплачиваю каждый месяц 19$, так как я не могу знать когда он мне понадобиться или когда у меня появиться время, но он должен быть доступен в любой момент.

 

Учитывая что ломанные версии все равно есть, то может Embacadero стоит хотя бы попробовать такой подход, отказаться всегда успеют. А если выстрелит и получиться?

 

Извините за адский оффтопик.

Ссылка на комментарий
  • 0

И в целом даже полугодичный выпуск становиться слишком долгим периодом для тех кто ждет исправлений или новшеств.

Я имел ввиду именно новые версии, update и hotfix никто не отменял. Ведь что палучается на практике? Есть стабильно работающее приложение и есть желание перевести его на новую версию Delphi. И тут натыкаешься на ряд сюрпризов, как в виде багов (вроде описанного выше), так и в виде нововведений (вроде неблокируемых сообщений). И тут посещает мысль - а оно мне надо? Зачим нарушать главную заповедь программиста (работает - не трогай)? Зачем добровольно брать на себя эти проблемы, когда и других задач выше крыши на месяцы вперед расписано. И все это значительно тормозит как освоение технологии в целом, так и миграцию на новые версии в частности.

И с тем, что эта ситуация отбивает желание покупать новые версии, я абсолютно согласен.

Ссылка на комментарий
  • 0
  • Модераторы

estrabrunnengi,

Ребят, ну ёлы-палы…

  1. Завязывайте с оффтопом (кстати, уже не первое устное предупреждение)
  2. Писать здесь (на форуме) своё мнение о работе компании бессмысленно, т.к. форум принадлежит Ярославу, а он программер (не менеджер компании!) Об этом тоже уже писалось. Менеджеров компании на этом форуме нет и не будет (насколько я понял).
  3. Если уж так хочется высказать своё мнение, то высказывайтесь на почту компании, а не засоряйте форум для разработчиков (технические вопросы/ответы). Это вам не sql.ru, здесь такой хрени, не потерпят и поощрять, точно не будут.

Ещё раз повторяю, завязывайте!

Ссылка на комментарий
  • 0

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

procedure TForm1.BarCodeScannerScanResult(Sender: TObject; AResult: string);
begin
//   MessageDlg( AResult, TMsgDlgType.mtError, [TMsgDlgBtn.mbOK],
//               0, TMsgDlgBtn.mbOK,
//               procedure ( const AResult: TModalResult ) begin
//               end );
   Button3.Visible := True;
end;

Если сообщение не выводить, то все ок, но мне нужно его вывести... Пример выкладываю, надеюсь на Вашу помощь.

XE7.ZIP

Ссылка на комментарий
  • 0

А что за ошибка-то?

 

Под отладчиком вылетают 3 ошибки подряд

 

6398646.jpg

 

6284570.jpg

 

6403766.jpg

 

А без отладчика - приложение перезапускается, то есть появляется заставка после чего открывается форма приложения.

Ссылка на комментарий
  • 0

В XE7 Upd1 ошибка исправлена.

Доброго времени суток!!!

А можете подсказать или лучше прислать исходник, та же проблема с использованием этого компонента, не работает под XE7 и всё тут, а очень нужно...

Заранее спасибо.

Ссылка на комментарий
  • 0

Что подсказать то? Пример есть в архиве с компонентом, в XE7 Upd1 все нормально работает. Если у вас имеются проблемы, выкладывайте "проблемный" пример, поглядим...

Ссылка на комментарий
  • 0

Добрый вечер!!! В архиве папка Example (пример), прошу после скачивания переименовать  расширение архива в rar так как я сжимал в  rar архив, но переименовал в zip в связи с тем, что rar нельзя отправить в сообщении, в ней добавлены мной исправления в модуль FMX.TKRBarCodeScanner.pas, а именно подключён дополнительный модуль AndroidAPI.Helpes и исправлена функция вызывающая ошибку, пример компилируется, устанавливается на телефон при запуске но по нажатию кнопки приложение долго весит, до тех пор пока система не выдаст сообщение о том, что оно не отвечает, в общем не работает, помогите пожалуйста разобраться.  

Example.zip

Ссылка на комментарий
  • 0

Написал небольшой класс по работе с сканером 

 

Проверял на XE7 Update 1 под Android 4.1.2

 

Пример

Алексей, спасибо Вам большое!!! Но к сожелению на моём Sony Xperia Z1 Android 4.4.4 не работает, компилируется, запускается

но висит после нажатия на кнопку,

может у Вас есть соображения почему это может быть?

Ссылка на комментарий
  • 0

Может, это тот самый редкий случай, когда прога с "конкретным" функционалом "виснет" на каком либо "конкретном" устройстве?.. (это был риторический вопрос) Я столкнулся с такой ситуацией когда нужно было включить вспышку на аппарате Huawai. У вас есть возможность протестировать свой код на другом устройстве?

Ссылка на комментарий
  • 0

 

Написал небольшой класс по работе с сканером 

 

Проверял на XE7 Update 1 под Android 4.1.2

 

Пример

Алексей, спасибо Вам большое!!! Но к сожелению на моём Sony Xperia Z1 Android 4.4.4 не работает, компилируется, запускается

но висит после нажатия на кнопку,

может у Вас есть соображения почему это может быть?

 

 

Решение простое, проверь у себя наличия программы https://play.google.com/store/apps/details?id=com.google.zxing.client.android&hl=ru

так как мой пример и предыдущий класс использует эту программу для считывания штрихкода

    intent := TJIntent.Create;
    intent.setAction(StringToJString('com.google.zxing.client.android.SCAN'));
    SharedActivity.startActivityForResult(intent, 0);

Проверял у себя на Android 4.4.2, программа в начале не была установлена и симптомы были как у тебя, после установки все стало нормально, на многих устройствах эта программа уже предустановлена

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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