B4A 基本的な質問・疑問など

seck.jp

Member
Licensed User
Longtime User
先日なんとか、PCでのソース作成...実機に転送...実機で実行までできるようになった、超B4A初心者の seck.jp といいます。
実際のプログラミングに必要な基本事項がまだ解っていません、基本的な質問ばかりだと思うのですが上級・中級・初級者の方、もし余裕がありましたら、おしえて下さい。
よろしくお願い致します。
早速ですが
質問_001:以下のコードが、エラーになります。(Undeclared variable 'weekday' is used before it was assigned any value.) ライブラリの設定不良でしょうか?
 sINT=Weekday("2014/03/08")

質問_001:解決しました
この構文は、StringFunctions ライブラリの関数でした、StringFunctionsをインストールすることにより解決しました。
http://www.b4x.com/android/help/stringfunctions.html
ここに出ていたものを標準と勘違いしていました。
 
Last edited:

seck.jp

Member
Licensed User
Longtime User
質問_002:
下図(img01.jpg)のように複数のボタンが並び、1画面で表示できない場合があります。このような時に指でスワイプしてゆき全ボタンを操作できるように設定したいのです。
いろいろ調べたのですが分かりません。Designerの設定でできるのでしょうか?
どのライブラリを使用するのでしょうか?
似たような処理を使用しているサンプルコードがあればありがたいです。

img01.jpg


質問_002:解決(見つけました)
ScrollViewBigPanel.zip
http://www.b4x.com/android/forum/th...ple-with-a-panel-higher-than-the-screen.9539/
 
Last edited:

alfcen

Well-Known Member
Licensed User
Longtime User
質問_001:
Weekdayというの機能はありません。

sINT= DateTime.GetDayOfWeek(DateTime.Now)

sINT = 1 : 日曜日
sINT = 7 : 土曜日
 

seck.jp

Member
Licensed User
Longtime User
alfcan様、ありがとうございます、このようにして曜日を取得するのですね。
質問_003:標準的なBASICで使用できる、MID関数に変わる関数はないでしょうか?
(使用例:参照型)
wSTR=mid("ABCDEFG",2,3) '---> wSTR="BCD"
(使用例:置換型)
wSTR="12345678"
mid(wSTR,3,2)="AB" '---> wSTR="12AB5678"
 

alfcen

Well-Known Member
Licensed User
Longtime User
wSTR = "ABCDEFG"
newSTR = wSTR.SubString2(3,2)

wSTR. を入力するとStringの機能の表が出ます。

string.png
 

seck.jp

Member
Licensed User
Longtime User
alfcan様、ありがとうございます。
いろいろやってみましたが、参照はできても置換はできないようです。ライブラリにが存在すれば良いのですが、
無いなら自分で作るしかないようですね。

4/4 作ってみました
B4X:
Sub MID(xSTR1 as string,xSTR2 as string,xPOINT as long,xLEN as long) as string
'第2引数xSTR2=""の場合は参照、有りの場合は置換になります
dim wW1 as string
dim wW2 as string
'check
if xPOINT<0 or _
    xLEN<1 or _
    xPOINT+xLEN-1>xSTR1.Length then
    msgbox(xSTR1&","&xSTR2&","&xPOINT&","&xLEN,"MID_Error")
    return 'エラーで終了
end if
'--- Reference ---
if xSTR2="" then
    wW1=xSTR1.SubString2(xPOINT-1,xPOINT+xLEN-1)
    return wW1
end if
'--- Substitution ---
wW1=xSTR1.SubString2(0,xPOINT-1)
wW2=xSTR1.SubString2(xPOINT+xLEN-1,xSTR1.Length)
return wW1&xSTR2&wW2
End Sub

使い方:参照
A="ABCDEFGHIGKLMN"
B=(モジュール名).MID(A,"",3,6)
'変数Aの3桁目から6桁分を参照できます

使い方:置換
A="ABCDEFGHIGKLMN"
A=(モジュール名).MID(A,"xyz", 4, 3)
'変数Aの4桁目から3桁分を"xyz"に置換します
 
Last edited:

seck.jp

Member
Licensed User
Longtime User
質問_004:今、タイマー割込みを使用したテストアプリを製作中なのですが、インストールのタイミングで
「問題が発生したため、****** を終了します。」と異常終了してしまいます。
タイマー割込みを使用する際のコツ、又はエラーになった場合の自動復帰のやりかたなどのアドバイスをお願い致します。

標準的なBASICでは、
ON ERROR GOTO ###1 '処理中、エラーが起これば(###1)へジャンプ
(実行文)......
exit sub
###1:
(先頭から再実行、又はリスタート)
end sub
 

alfcen

Well-Known Member
Licensed User
Longtime User
On Error Gotoはないですね。

B4X:
Try
    '試して
Catch
   ' ここで上でエラーの発生の場合再開
End Try

B4AはVBに近いけどパフォーマンスの為100%同じ構文は無理でしょう。

ご覧ください:
http://www.b4x.com/android/help/core.html#keywords
 

seck.jp

Member
Licensed User
Longtime User
スマフォ・タブレットのサイズ(解像度)は様々です、どの機器にも対応するのは難しい。
基本のサイズ又は解像度で作成したデザインデータ(***.bal)をサイズ又は解像度を比較して均等に縮小又は拡大するような方法を
知っている方がおられましたら是非ご教授ください。
 

alfcen

Well-Known Member
Licensed User
Longtime User
完璧な解決がないですが、Designer/Designer Scriptの中で全てのviewsを100%xや100%yに基準してスケーリングするのは一つの方法です。
例えば、

Button1.SetLeftAndRight(30%x,60%x)
Button1.SetTopAndBottom(10%y,30%y)

最初に AutoScaleAll を入れるとフォントが自動的にスケーリングされますが、機種によって合わない場合が多いです、
ので例えば、 

d = 100dip/100 'd = 端末のスクリーンスケール
Label1.TextSize = Label1.Height * 0.7 / d

表示サイズ(解像度)だけでなく、同じ解像度で違う縦横比が本当に困っていますね。
 

seck.jp

Member
Licensed User
Longtime User
画面の比率コントロールにについて自分なりに解決できた方法を記載します。
B4X:
'--------------------------------------------------
Sub Process_Globals
Dim gsRW As FLOAT '拡大率:幅
Dim gsRH As FLOAT '拡大率:高さ
End Sub

'--------------------------------------------------
Sub Globals
Dim DW_SW,UP_SW As Button
Dim L11,L12,L13 As Label
Dim MEMO_TXT as EditText
End Sub

'--------------------------------------------------
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Main"):Activity.Title="TEST"
MAP_CONV '<--- Size Convert
End Sub

'(... Abbreviation ...)

'--------------------------------------------------
Sub MAP_CONV

Dim LV As LayoutValues:LV=GetDeviceLayoutValues
'基準幅  (360):画面設計時の値(若干の調整は必要)
gsRW=LV.Scale*(360/LV.Width)
'基準高さ(580):画面設計時の値(若干の調整は必要)
gsRH=LV.Scale*(580/LV.Height)

CONV_BUTTON(DW_SW):CONV_BUTTON(UP_SW)
CONV_LABEL(L11)
CONV_LABEL(L12)
CONV_LABEL(L13)
CONV_EDITTEXT(MEMO_TXT)

End Sub

'--------------------------------------------------
Sub CONV_BUTTON(xOBJ as Button)
xOBJ.Left    =xOBJ.Left    /gsRW
xOBJ.Top     =xOBJ.Top     /gsRH
xOBJ.Width   =xOBJ.Width   /gsRW
xOBJ.Height  =xOBJ.Height  /gsRH
xOBJ.TextSize=xOBJ.TextSize/gsRH
End Sub

'--------------------------------------------------
Sub CONV_LABEL(xOBJ as Label)
xOBJ.Left    =xOBJ.Left    /gsRW
xOBJ.Top     =xOBJ.Top     /gsRH
xOBJ.Width   =xOBJ.Width   /gsRW
xOBJ.Height  =xOBJ.Height  /gsRH
xOBJ.TextSize=xOBJ.TextSize/gsRH
End Sub

'--------------------------------------------------
Sub CONV_EDITTEXT(xOBJ as EditText)
xOBJ.Left    =xOBJ.Left    /gsRW
xOBJ.Top     =xOBJ.Top     /gsRH
xOBJ.Width   =xOBJ.Width   /gsRW
xOBJ.Height  =xOBJ.Height  /gsRH
xOBJ.TextSize=xOBJ.TextSize/gsRH
End Sub

'(... Abbreviation ...)
Designer scripts
'AutoScaleAll (Not use)

他のコントロールを使用する場合は、同じような処理を追加する必要があります。
この手法で、4インチ(Xperia)と7インチ(HP)と10インチ(lenovo)の実機でテストした結果、グッドでした。
うまく表示させるこつは、基本画面を最小の機種に合わせて作成することです、大きな画面を基準にしてしまうと縮小の際にボタンコントロールの縁などが影響し文字が入り切らない場合があります。
 
Last edited:

alfcen

Well-Known Member
Licensed User
Longtime User
遅くなりまして御免なさい。貧乏暇なし。

計算的な解決はそれでいいと思いますが、Designer Scriptを利用して、その中で
「AutoScaleAll」と言うキーワードを入れると大分簡単になります。複雑なレイアウト
の場合は自動スケーリングがうまく行かない可能性がありますが、そこで修道で仕方がないですね。
 
Top