Accessのリストボックスの行が選択されているか調べる
Accessのリストボックスの行が、一つでも選択されているか調べる方法を紹介します。
開発環境
選択されているかを調べる
複数選択可能かどうかでやり方が異なります。フォーム内のリストボックス名を lb として、vba のコードを書きます。
複数選択可能なリストボックスの場合
リストボックスの ItemsSelected プロパティにアクセスします。ItemsSelected プロパティは Variant型変数の配列を返し、リストボックス選択行のインデックスを格納しています。配列なので、Countプロパティにアクセスできますね。
' 何も選択されていない
End If
単一選択なリストボックスの場合
リストボックスの ListIndex プロパティにアクセスします。ListIndex プロパティは、リストボックスで選択されている行数から1を引いた値を返します。何も選択されていなければ、 0 - 1 で -1 を返します。
' 何も選択されていない
End If
iOSアプリ開発でUIAlertControllerを使ってアクションシートを作成する
iOSアプリ開発でUIAlertControllerを使ってアクションシートを作成するメモです。
アラートを作成する方法とほとんど同じです。アラートの作成方法は iOSアプリ開発でアラートを表示する - 使って創ってApp に書いてあります。
開発環境
完成予定図
アクションシートを作成する
Show ActionSheet ボタンをタップすると、アクションシートが表示されます。アクションシートには Editボタン Deleteボタン Cancelボタンがあります。
アクションシートを表示する時にコンソールに Show ActionSheet と表示し、Edit をタップしたら Pressed Edit 、 Delete をタップしたら Pressed Delete 、Cancel をタップしたら Pressed Cancel とコンソールに表示します。
アクションシートを表示する
UIAlertViewController クラスのインスタンスと、アクションシートに表示させるボタンの数だけ UIAlertAction クラスのインスタンスを作成します。作成した action を UIAlertViewController クラスのインスタンスに登録します。
-
UIAlertViewController クラスのインスタンスを作成
let actionsheet = UIAlertController(title: "ActionSheet", message: "This is ActionSheet!", preferredStyle: .ActionSheet) -
UIAlertAction クラスのインスタンスを作成
let action_edit = UIAlertAction(title: "Edit", style: .Default) { (action) -> Void in
print("Edit Pressed")
}
let action_delete = UIAlertAction(title: "Delete", style: .Destructive) { (action) -> Void in
print("Delete Pressed")
}
let action_cancel = UIAlertAction(title: "Cancel", style: .Cancel) { (action) -> Void in
print("Cancel Pressed")
}アクションシートのボタンがタップされた時に起こす処理を、クロージャに書けます。今回はコンソールに文字を表示させます。
-
action を actionsheet に追加する
[action_edit, action_cancel, action_delete].forEach { (action) -> () in
alert.addAction(action)
} -
actionsheet を表示する
self.presentViewController(actionsheet, animated: true) { () -> Void in
print("ActionSheet Shown!")
}UIViewController クラスの presentViewController メソッドで actionsheet を表示させます。クロージャに書いた処理は、アクションシートが表示された時に実行されます。
おわりに
以上のコードを実行すると、アクションシートが表示されます。完成予定図のアプリでは、Show ActionSheetボタンをタップするとアクションシートを表示するようにしています。
action を actionseet に追加した順番は
- action_edit
- action_cancel
- action_delete
でしたが、表示順は
- action_edit
- action_delete
- action_cancel
でした。
UIAlertActionStyle を Cancel に指定した action は一番下に表示されるようですね。
iOSアプリ開発でアラートを表示する
iOSアプリ開発でアラートを表示するメモです。
開発環境
完成予定図
Show Alert ボタンをタップすると、アラートが表示されます。アラートには OK ボタンと Cancel ボタンがあります。
アラートを表示する時にコンソールに Show Alert と表示し、OK をタップしたら Pressed OK 、 Cancel をタップしたら Pressed Cancel とコンソールに表示します。
アラートを表示する
UIAlertViewController クラスのインスタンスと、アラートに表示させるボタンの数だけ UIAlertAction クラスのインスタンスを作成します。作成した action を UIAlertViewController クラスのインスタンスに登録します。
-
UIAlertViewController クラスのインスタンスを作成
let alert = UIAlertController(title: "Alert", message: "This is alert!", preferredStyle: .Alert) -
UIAlertAction クラスのインスタンスを作成
let action_ok = UIAlertAction(title: "OK", style: .Default) { (action) -> Void in
print("OK Pressed")
}
let action_cancel = UIAlertAction(title: "Cancel", style: .Cancel) { (action) -> Void in
print("Cancel Pressed")
}アラートのボタンがタップされた時に起こす処理を、クロージャに書けます。今回はコンソールに文字を表示させます。
-
action を alert に追加する
alert.addAction(alert_ok)
alert.addAction(alert_cancel) -
alert を表示する
self.presentViewController(alert, animated: true) { () -> Void in
print("Alert Shown!")
}UIViewController クラスの presentViewController メソッドで alert を表示させます。クロージャに書いた処理は、アラートが表示された時に実行されます。
おわりに
以上のコードを実行すると、アラートが表示されます。完成予定図のアプリでは、Sho Alertボタンをタップするとアラートを表示するようにしています。
Swift2.1の範囲演算子
Swift2.1で範囲演算子(Range Operators)を使うメモ。
公式ドキュメントを参考にしました。
実行環境
- Swift 2.1.1
範囲演算子って?
0から5までの範囲の数字を得るなど、指定した範囲の数字を得る演算子のことです。
Closeed Range Operator
a...bのように書き、aからbを含む数字を返します。
print("Hello")
}
// Hello
// Hello
// Hello
// Hello
Half-Open Range Operator
a..<bのように書き、aからbを含まない数字を返します。
a<bである必要があります。aとbが同値の場合は、空の範囲が返されます。
print("Hello")
}
// Hello
// Hello
// Hello
NSScannerクラスをSwift2.1で少し使ってみました2
NSScannerクラスをSwift2.1で少し使ってみました - 使って創ってAppの続きです。
NSScannerクラスをもう少し使ってみましょう。
下記のサイトを参考にしました。
実行環境
- Swift 2.1.1
空白スペースと改行はスキャンが続行される
スキャンに指定した文字列と違う文字列をスキャンしても、その文字列をスキップしてスキャンを続行することができます。デフォルトでは、空白スペースと改行がスキップされます。検索対象を空白スペースや改行にすると、それらを検索してくれます。
let scanner = NSScanner(string: source)
var result: NSString?
scanner.scanString("This", intoString: &result)
print(result!)
// This
検索対象から特定の文字を除外する
カンマ・空白スペース・改行をスキップしてスキャンするようにしてみます。
skipset.formUnionWithCharacterSet(NSCharacterSet(charactersInString: ","))
let theScanner = NSScanner(string: ",,,\n,, , This is a pen.")
theScanner.charactersToBeSkipped = skipset
var result: NSString?
theScanner.scanString("This", intoString: &result)
print(result!)
// This
カンマ空白スペース区切りの文字列を、カンマ区切りで分割する
コードはこんな感じ。
whitespaceAndPunctuationSet.formUnionWithCharacterSet(NSCharacterSet(charactersInString: ","))
let theScanner = NSScanner(string: "Takeda, Oda, Tyousokabe, Uesugi")
theScanner.charactersToBeSkipped = whitespaceAndPunctuationSet
var name: NSString?
while theScanner.scanUpToString(",", intoString: &name) {
print(name!)
}
// Takeda
// Oda
// Tyousokabe
// Uesugi
カンマ・空白スペース・改行をスキップ対象にしています。scanUpToStringメソッドでカンマを指定してるので、カンマが見つかった場合のスキャン開始位置がカンマになりそうですが、カンマはスキップ対象なのでスキャン開始位置になりません。今回の場合、一つ目のカンマを見つけた後のスキャン開始位置は Oda の O です。
もう少し難しい文字列をスキャンする
名前と年齢が name:~~ age:~~で書かれ、カンマで区切られる文字列をスキャンします。名前と年齢を抽出します。
let whiteSpaceAndCommaCharset = NSMutableCharacterSet.whitespaceCharacterSet()
whiteSpaceAndCommaCharset.formUnionWithCharacterSet(NSCharacterSet(charactersInString: ","))
let scanner = NSScanner(string: busyous)
scanner.charactersToBeSkipped = whiteSpaceAndCommaCharset
var busyoName: NSString?, busyoAge: Int32 = 0
while !scanner.atEnd {
scanner.scanString("name:", intoString: nil)
scanner.scanUpToString(" ", intoString: &busyoName)
scanner.scanString("age:", intoString: nil)
scanner.scanInt(&busyoAge)
print("拙者、\(busyoName!)と申す。齢\(busyoAge)なり。")
}
// 拙者、武田と申す。齢25なり。
// 拙者、上杉と申す。齢24なり。
// 拙者、織田と申す。齢56なり。
まとめ
- NSScannerクラスは、文字列を初めから終わりまで順番にスキャンする
- スキャン開始位置や、検索対象から特定の文字列を含めないようにできる
スキャン開始位置を頭で追うことが、このクラスを使うのに重要なことだなと感じました。
NSScannerクラスをSwift2.1で少し使ってみました
NSScannerクラスをSwift2.1で少し使ってみました。NSScannerクラスは、規則的な文字列を最初から順番に検索するのに役立つかなと思いました。わかったところまで記事にします。
下記のサイトを参考にしました。
実行環境
- Swift 2.1.1
NSScannerクラスって?
NSScannerクラスは、文字列を最初から最後まで順番にスキャン(文字列比較)し続けるクラスです。文字列と数字を分割したりできます。
まずは使ってみる
-
数字をスキャン
let str = "18 years old."
let scanner = NSScanner(string: str)
var age: Int = 0
scanner.scanInteger(&age)
print(age)
// 18 -
同じ文字列までスキャン
let source = "This is a pen"
let scanner = NSScanner(string: source)
var str: NSString?
scanner.scanUpToString(" a", intoString: &str)
print(str!)
// This is
スキャンして、スキャンする
一度スキャンしたら、そのスキャンした次の文字がスキャン開始位置になります。
scanUpTo~~メソッドでスキャンしたら、次のスキャン開始位置はscanUpTo~~メソッドで指定した文字列の先頭になります。
let scanner = NSScanner(string: source)
let str1, str2 NSString?
scanner.scanString("This", intoString: &str1)
scanner.scanUpToString(".", intoString: &str2)
print("str1:\(str1!) str2:\(str2!)")
// str1:This str2:is a pen
// スキャン開始位置は「.」
This と is の間にはスペースがあるのに、str2の結果の先頭にスペースがありません。これは、This がスキャンされた後の開始位置が 「is」の「i」 になっているためです。デフォルトでは、空白スペースと改行はスキャン開始位置を決める際にスキップされます。