DELPHI XE5 にてTMemoを貼り付けただけの簡単なFireMonkeyモバイルアプリケーションを作成し、
Panasonic FZ-T1にインストールして起動するとPanasonic FZ-T1のバーコードリーダーが機能しません。
プリインストールされているクロームやその他アプリ上ではバーコードリーダーは機能しています。
DELPHIで作成したアプリ上でバーコードリーダーを機能させる為に何か設定する項目はありますか。
又、バーコードリーダーをアプリ上で制御したいのではなく、バーコード読み取りボタン(任意に設定可能)押下時に
バーコードを読み取り、結果をTMemoに表示したいだけです。
以上、よろしくお願い致します。
FMXもAndroidも詳しくないのですが、カメラを使うためのパーミッションが必要なのではないでしょうか。
Androidのバージョン(APIレベル?)にもよりますが、実行時に取得する必要がありそうです。
https://delphiworlds.com/2018/06/targeting-android-8-and-higher-continued/
いくらなんでも情報少なすぎでは?
調べたところその機種Androidは専用カメラ?でバーコードを読み取るタイプみたいですけど
その高度な部分ならAPIが公開されていないと使えないかもしれません。
Androidだとカメラ設定してバーコード検出APIを使って読み取りますが
「機能しません」って何が機能しないのですか?
カメラが起動しない?バーコードが読み取れない?
HFUKUSHI様 take様
お世話になります。
説明不足ですいません。
Panasonic FZ-T1には通常のカメラとバーコード読み取り用のカメラの2つが付いています。
そのうちバーコード読み取り用のカメラはバーコード読み取りソフトにより
キーボードウェッジ形式で読み取ったバーコードを様々なアプリケーションに入力できます(Panasonicへ確認済み)。
又、バーコードは本体横のボタンに割り当てることができ、そのボタンを押下することでバーコード読み取りのレーザーを照射します。
※前回の投稿で機能すると表現していたのはボタンを押下するとバーコードレーザーが照射されバーコードを読み取れるということです
例えばグーグルクロームを起動し、検索ボックスにフォーカスが無い状態でバーコード読み取りボタンを押下するとレーザーが照射されます。
検索ボックスにフォーカスをあてて同じ動作を行いバーコードを読み取ると、読み取ったバーコードの内容が検索ボックスに入力されます。
これはグーグルクローム以外のソフトでも同じです。
ところが、私がDELPHI XE5で作成したアプリケーションを起動すると、その時点でバーコード読み取りボタンを押下してもバーコードが照射されません。
TMemo上にフォーカスをあてるとソフトウェアキーボードは動きますが、バーコード読み取りボタンは無反応なままです。
又、本体横のボタンにライト起動を割り当てるとDELPHIを起動した状態でもライトは起動するので、ボタンが無効になっているようでもありません。
DELPHIで作成したアプリケーションでなぜバーコードが照射されないのでしょうか。
何かしらの設定が必要なのでしょうか。
よろしくお願い致します。
そのハードウェア固有の制御が必要なのだと思われます(TOUGHPAD API)。たとえばこんなページが見つかります。
TOUGHPAD(FZ-N1/FZ-X1)のバーコードリーダを制御する - sashimi4’s diary
https://sashimi4.hatenablog.com/entry/handle-toughpad-barcode-reader-from-android-java
Panasonic FZ-T1のバーコードリーダーソフトは分かりませんが、
ダメ元で、フォーム上に置いたTEditやTMemoコントロールのプロパティを
StyledからPlatformに変更して1度試してみてはどうでしょう?
コードで書くなら↓下記の様に。
Edit1.ControlType := TPresentedControl.TControlType.Platform;
外していたらごめんなさい。
HFUKUSHI様
ご回答ありがとうございます。
確かにバーコードをDELPHIアプリケーション上で操作(ボタンに読み取りを割り当てる等)するならばAPIを使用した制御が必要なのは理解できるのですが、
キーボードウェッジ形式で読み取ったバーコードをTMemoに入力させるだけならば必要ないと思われます。
実際グーグルクロームやその他のアプリでは問題なくバーコードで読み取った値が入力されます。
※私の勉強不足かもしれませんが…
KONNOYA様
ご回答ありがとうございます。
DELPHI XE5ではTControlTypeが実装されていなかったので、
RadStudio 10.4のトライアル版で試してみましたが、だめでした。
お世話になります。
追加情報なのですが、
AndroidStudio 4.0でMultilineTextを張り付けただけのアプリケーションを作成して実行したところ、
バーコードの照射と読み取ったバーコードのMultilineTextへの入力はできました。
今回オラクルデータベースの読み取りと更新をする必要があるので、何とかDELPHIで作成したいと考えています。
どうぞよろしくお願い致します。
正常に動作したAndroidStudio ではAndroidManifest.xml や build.gradleには何も追記無しでしょうか?
もしそうならAndroidが用意しているEditTextやMultilineTextと、Delphi FireMonkeyで扱うTMemoが異なると思われます。
DelphiのFireMonkeyから こんな風に AndroidのEditTextを配置したら変わりますかね?
【Androidアプリでネイティブコントロールをフォームに配置するには】
https://www.gesource.jp/weblog/?p=7593
take様
ご回答ありがとうございます。
現在私の環境は
DELPHI XE5(正規版)
RAD Studio 10.4(試用版)
の2つとなっております。
ご教示頂いたソースをDELPHI XE5でコンパイルしますと、TAndroidHelperが未定義の識別子としてエラーとなります。
調べてみますと、DELPHI XE5にはAndroidapi.Helpers.PASファイルが存在していません。
又、RAD Studio 10.4でコンパイルしますと、JNativeLayoutが未定義の識別子としてエラーとなります。
Androidapi.JNI.EmbarcaderoのJNativeLayoutを参照することが出来ません。
※RAD Studio 10.4が試用版の為(?)、PASファイルが公開されていないので詳細が判りませんが、
DELPHI XE5のAndroidapi.JNI.Embarcadero.PASファイルには
JNativeLayout = interface;//com.embarcadero.firemonkey.nativelayout.NativeLayoutの記述があり、この部分ではエラーになりません。
何か回避策はありますか。
よろしくお願い致します。
こちらに環境がないので情報からの想像になりますが
この辺の情報を見ると
https://qiita.com/pik/items/1e6c8a9cdf96bc0104f3
FireMonkey は OS のコントロールを利用せずコントロールを自分で描画しています
ということなのでこのままだと無理ですね。
Androidのネイティブコントロールを使う方法にはたどり着けませんでしたが
メーカーのサイトに
ネイティブ表示をサポートしているコントロールは次のとおりです。
TCalendar、TEdit、TSwitch
ってなってるから使えるのでは?
take様
ご回答ありがとうございます。
返信遅くなって申し訳ありません。
RAD Studio 10.4(試用版) にて次のサイトを参考にコントロールをネイティブコントロールとして実行しましたが、
相変わらずレーザーを照射しません。
実行時にボタンでTPresentedControl.TControlType.StyledとTPresentedControl.TControlType.Platformを切り替えても同じです。
他に何かできることがありましたらご教示ください。
よろしくお願い致します。
お世話になっております。
少し進展(?)したので書き込みます。
FireMonkeyアプリケーション上ではバーコードレーザーは全く照射されなかったのですが、
DELPHIサポートより少しヒントを頂きまして、InputQueryを利用すると、
ダイアログ上からはバーコードの照射と読み取ったバーコードの入力が出来ました。
このことからFireMonkeyで作成したフォーム自体にレーザー照射を阻害する何かしらがあるのかなと考えています。
以上、よろしくお願い致します。
ソース:
TDialogService.InputQuery('TEST READ',['Please Read Barcode'],['Barcode'],
procedure(const AResult: TModalResult; const AValues: array of string)
begin
Memo1.Lines.Add('Barcode = ' + AValues[0]);
end);
うーん、説明が伝わっていないのかな?
>>FireMonkey は OS のコントロールを利用せずコントロールを自分で描画しています
FireMonkeyはAndroidが持っているEditTextコントロールを使わずに、それっぽい四角い形のフォーカスを持ったものを表示しているだけです。
なのでAndroidAPI側で拡張したものが反映されません。
InputQueryで表示される入力ボックスはAndroidの Dialog.Builderで作られているならAndroid特有のボタンも表示されるのかも知れません。
>>実行時にボタンでTPresentedControl.TControlType.StyledとTPresentedControl.TControlType.Platformを切り替えても同じです。
「切り替えても同じ」ということは設計時にも設定しているのですよね?念のため確認です。
あと左辺も合わせると
Edit1.ControlType := TPresentedControl.TControlType.Platform;
となっているのですよね?
それでもEdit1が変わらない・・・?
ネイティブ Android コントロールかどうかはZオーダーサポートの有無ですから
わざと他のコンポーネントの下にくるように配置して
それでも一番手前に表示されるのであればネイティブで、隠れていれば非ネイティブのままだと思います。
ネイティブなのにバーコード読み取りが出来ないのであればまた色々やっかいですね。
take様
お世話になっております。
TEditのControlTypeプロパティを.Platformに変更することで、Androidネイティブコントロールには変わっています。
これは2つのTEditを並べ、ControlTypeプロパティをStyledとPlatformに変更すると、実行時の下線の濃さが変わるのでそう判断しています。
又、お教え頂いた、他のコンポーネントを被せた場合もControlTypeプロパティを.Platformに指定したTEditは最前面にいます。
しかし、ネイティブコントロールに変更してもバーコードは照射されませんでした。
よろしくお願い致します。
ネイティブコントロールなのにバーコード読み取りが出来ないとなるとお手上げですね。
元をたどるとOracleデータベースへの接続が目的?でDelphiを使いたいというのであれば
Androidの開発環境からOracleデータベースへの接続方法を探す方が早いかも知れません。
take様
お世話になっております。
本当にお手上げ状態になってきました...
そこでおっしゃられる様にAndroidStudioでOracleに接続するか、タフブックのSDK(JAVA)を利用するか考えてみたいと思います。
ありがとうございました。
ご協力頂いた皆様へ
上にも書きましたが、別な方法を探りたいと思いますので、一度解決済みとしてスレッドを閉じたいと思います。
色々とお教え頂きありがとうございました。
ツイート | ![]() |