使って創ってApp

ソフトウェアを使ったり作ったりするブログです

Accessのリストボックスの行が選択されているか調べる

Accessのリストボックスの行が、一つでも選択されているか調べる方法を紹介します。

開発環境

選択されているかを調べる

複数選択可能かどうかでやり方が異なります。フォーム内のリストボックス名を lb として、vba のコードを書きます。

複数選択可能なリストボックスの場合

リストボックスの ItemsSelected プロパティにアクセスします。ItemsSelected プロパティは Variant型変数の配列を返し、リストボックス選択行のインデックスを格納しています。配列なので、Countプロパティにアクセスできますね。

If Me.lb.ItemsSelected.Count = 0 Then
  ' 何も選択されていない
End If

単一選択なリストボックスの場合

リストボックスの ListIndex プロパティにアクセスします。ListIndex プロパティは、リストボックスで選択されている行数から1を引いた値を返します。何も選択されていなければ、 0 - 1 で -1 を返します。

If Me.lb.ListIndex = -1 Then
  ' 何も選択されていない
End If

iOSアプリ開発でエラーメッセージを出して全ての処理を終了するfatalErrorメソッド

iOSアプリ開発で、エラーメッセージを出して全ての処理を終了するには、fatalErrorメソッドがあるよというメモ。

開発環境

fatalErrorメソッド

 コンソールに表示したいメッセージを fatalError メソッドの引数に渡します。

fatalError("とんでもないエラーが起こったよ!!!")

実行結果です。

f:id:hitxutokun:20160121000413p:plain

アプリを公開する際は、削除しましょう

iOSアプリ開発でUIAlertControllerを使ってアクションシートを作成する

iOSアプリ開発でUIAlertControllerを使ってアクションシートを作成するメモです。

アラートを作成する方法とほとんど同じです。アラートの作成方法は iOSアプリ開発でアラートを表示する - 使って創ってApp に書いてあります。

開発環境

完成予定図

f:id:hitxutokun:20160120001910p:plain

アクションシートを作成する

Show ActionSheet ボタンをタップすると、アクションシートが表示されます。アクションシートには Editボタン Deleteボタン Cancelボタンがあります。

アクションシートを表示する時にコンソールに Show ActionSheet と表示し、Edit をタップしたら Pressed Edit 、 Delete をタップしたら Pressed Delete 、Cancel をタップしたら Pressed Cancel とコンソールに表示します。

アクションシートを表示する

UIAlertViewController クラスのインスタンスと、アクションシートに表示させるボタンの数だけ UIAlertAction クラスのインスタンスを作成します。作成した action を UIAlertViewController クラスのインスタンスに登録します。

  1. UIAlertViewController クラスのインスタンスを作成
    let actionsheet = UIAlertController(title: "ActionSheet", message: "This is ActionSheet!", preferredStyle: .ActionSheet)
  2. 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")
    }

    アクションシートのボタンがタップされた時に起こす処理を、クロージャに書けます。今回はコンソールに文字を表示させます。

  3. action を actionsheet に追加する
    [action_edit, action_cancel, action_delete].forEach { (action) -> () in
    alert.addAction(action)
    }
  4. actionsheet を表示する
    self.presentViewController(actionsheet, animated: true) { () -> Void in
      print("ActionSheet Shown!")
    }

    UIViewController クラスの presentViewController メソッドで actionsheet を表示させます。クロージャに書いた処理は、アクションシートが表示された時に実行されます。

おわりに

以上のコードを実行すると、アクションシートが表示されます。完成予定図のアプリでは、Show ActionSheetボタンをタップするとアクションシートを表示するようにしています。

action を actionseet に追加した順番は

  1. action_edit
  2. action_cancel
  3. action_delete

でしたが、表示順は

  1. action_edit
  2. action_delete
  3. action_cancel

でした。

UIAlertActionStyle を Cancel に指定した action は一番下に表示されるようですね。

iOSアプリ開発でアラートを表示する

iOSアプリ開発でアラートを表示するメモです。

開発環境

完成予定図

f:id:hitxutokun:20160118225004p:plain

Show Alert ボタンをタップすると、アラートが表示されます。アラートには OK ボタンと Cancel ボタンがあります。

アラートを表示する時にコンソールに Show Alert と表示し、OK をタップしたら Pressed OK 、 Cancel をタップしたら Pressed Cancel とコンソールに表示します。

アラートを表示する

UIAlertViewController クラスのインスタンスと、アラートに表示させるボタンの数だけ UIAlertAction クラスのインスタンスを作成します。作成した action を UIAlertViewController クラスのインスタンスに登録します。

  1. UIAlertViewController クラスのインスタンスを作成
    let alert = UIAlertController(title: "Alert", message: "This is alert!", preferredStyle: .Alert)
  2. 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")
    }

    アラートのボタンがタップされた時に起こす処理を、クロージャに書けます。今回はコンソールに文字を表示させます。

  3. action を alert に追加する
    alert.addAction(alert_ok)
    alert.addAction(alert_cancel)
  4. alert を表示する
    self.presentViewController(alert, animated: true) { () -> Void in
      print("Alert Shown!")
    }

    UIViewController クラスの presentViewController メソッドで alert を表示させます。クロージャに書いた処理は、アラートが表示された時に実行されます。

おわりに

以上のコードを実行すると、アラートが表示されます。完成予定図のアプリでは、Sho Alertボタンをタップするとアラートを表示するようにしています。

Swift2.1の範囲演算子

Swift2.1で範囲演算子(Range Operators)を使うメモ。

公式ドキュメントを参考にしました。

developer.apple.com

実行環境

範囲演算子って?

0から5までの範囲の数字を得るなど、指定した範囲の数字を得る演算子のことです。

Closeed Range Operator

a...bのように書き、aからbを含む数字を返します。

for _ in 0...3 {
  print("Hello")
}
// Hello
// Hello
// Hello
// Hello

Half-Open Range Operator

a..<bのように書き、aからbを含まない数字を返します。

a<bである必要があります。aとbが同値の場合は、空の範囲が返されます。

for _ in 0...3 {
  print("Hello")
}
// Hello
// Hello
// Hello

NSScannerクラスをSwift2.1で少し使ってみました2

NSScannerクラスをSwift2.1で少し使ってみました - 使って創ってAppの続きです。

NSScannerクラスをもう少し使ってみましょう。

下記のサイトを参考にしました。

nshipster.com

実行環境

空白スペースと改行はスキャンが続行される

スキャンに指定した文字列と違う文字列をスキャンしても、その文字列をスキップしてスキャンを続行することができます。デフォルトでは、空白スペースと改行がスキップされます。検索対象を空白スペースや改行にすると、それらを検索してくれます。

let source = "   \n   \n\n     This is a pen."
let scanner = NSScanner(string: source)
var result: NSString?

scanner.scanString("This", intoString: &result)
print(result!)
// This

検索対象から特定の文字を除外する

カンマ・空白スペース・改行をスキップしてスキャンするようにしてみます。

let skipset = NSMutableCharacterSet.whitespaceAndNewlineCharacterSet()
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

カンマ空白スペース区切りの文字列を、カンマ区切りで分割する

コードはこんな感じ。

let whitespaceAndPunctuationSet = NSMutableCharacterSet.whitespaceCharacterSet()
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 busyous = "name:武田 age:25, name:上杉 age:24, name:織田 age:56"

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クラスは、規則的な文字列を最初から順番に検索するのに役立つかなと思いました。わかったところまで記事にします。

下記のサイトを参考にしました。

nshipster.com

実行環境

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 source = "This is a pen."
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」 になっているためです。デフォルトでは、空白スペースと改行はスキャン開始位置を決める際にスキップされます。

続き書きました

NSScannerクラスをSwift2.1で少し使ってみました2 - 使って創ってApp