wifrstfasnriov
@wifrstfasnriov (KA TO)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【VB.NET】デスクトップアプリのデータ一時保存

知りたいこと

visual studioのwindowsフォームアプリでデスクトップアプリを作っています。
教えていただきたいことがあります。
ユーザーの操作によって生成され、アプリを立ち上げている間だけ保持しておけばよいデータがあります。データ形式はxmlです。
こういったデータは一般的にどのように保存するのでしょうか。
一般的な手法が知りたいです。

イメージは以下の通りです(あくまでイメージです)。

  1. アプリ立ち上げる
  2. ユーザーの操作によってXMLデータ生成(ここで作ったデータをしばらく保持していたい)
  3. アプリ上でボタンを押すと、そのボタンが持っているIDに対応した情報をXMLから探してきて、画面に表示
  4. ユーザーがアプリを閉じる(これ以降データ保持不要)

考えたこと

例えばアプリを立ち上げている間だけでなく、閉じてからも保持していたいデータであれば、ユーザーのPCのどこか(C:\Users\ユーザー名\このあたりとか?)に保存させるようにすればよいと思います。
またデータが大きいのであればデータベースを用意してそこに保存するようにすべきなのだろうと思います。
しかし今回はユーザーが操作している間だけ保持していればよいデータでなおかつデータ量もそれほど大きくはありません。
極端な話無色透明のLabelコントロールを作って、そこにテキストとして入れておけば十分やりたいことは満たせます。さすがに文字数制限に引っかかる気がしますが、それぐらいしか困る要素がありません。とはいえあまりにプリミティブというか…なんか違うだろう感がすごいです。
以前VBAを触っていたので、excelならファイルを読み取り専用にしておいて、シートに書き込んで保存せずに閉じるといった動きに、wordならdocx内のCustomXmlPartsにxmlごと保存しておく動きにするのになあと思っています。
ユーザーのPCのどこかにxmlファイルを生成しておいておいて、アプリを閉じると同時にそのファイルを破棄するというやり方もありますが、できればアプリ内で完結させたいと思っています。

IT業界で働いているわけではないため、こういう場合の一般的なやり方というものがあるのかすらわかりません。
よろしくお願いいたします。

0

5Answer

「スコープ」という性質で分類すると、VB.NETの変数には3種類あります。
初心者のためのVB.NETの基本 ~変数編~

データを格納しても保持されるのはプロシージャが終わるまで

なのは、プロシージャ(メソッド)内で宣言された「ローカル変数」です。

一方、フォームもクラスの一種で、フォームに配置したラベルなどのコントロールは「メンバ変数」に当たります。
つまりフォームを閉じるまで保持しておきたいデータは、ラベルと同じように「フォームのメンバ変数」にしておけば、フォームを閉じるまで保持されます。

シングルトンはもっと複雑なことをするようになると必要になってくることもありますが、この件に関しては使わなくても問題ない上にけっこう難しいことまで勉強しなければいけなくなるため、今回については忘れた方がいいと思います。
(@Verclene さんの言ってることが間違っているわけではまったくないのですが、@wifrstfasnriov さんは別にプログラムの勉強をしたいわけではないようなので、そこまで手を出すと本来の目的とは違う方向に進みそうで)

1Like

Comments

  1. @wifrstfasnriov

    Questioner

    ありがとうございます。フォームのプロパティという表現で得心いきました。なるほどなるほど。やってみます。大変助かりました。

そもそもアプリ内で完結する処理に対してわざわざXMLみたいな大層なものを使う意味もよく分かりませんが……
そこまで大きなデータでなければシングルトンなインスタンスでも作っておけば,アプリ起動中のみストア可能な場所ができると思います.

0Like

アプリ上でボタンを押すと、そのボタンが持っているIDに対応した情報をXMLから探してきて、画面に表示

一意なIDに対応する値を検索するような感じなら、Dictionaryクラスにデータを格納すればよいと思います。

0Like

Comments

  1. > それらにデータを格納しても保持されるのはプロシージャが終わるまでで、次にプロシージャが走ったときにはデータは残っていないと思うのですが間違っているでしょうか。

    ローカル変数なら消えますが、クラスメンバとしてプロパティやフィールドに記憶させれば、クラスのインスタンスが存在する限りは残ってますよ。
  2. @wifrstfasnriov

    Questioner

    ありがとうございます。一連のプロシージャが終わったらその時点でインスタンス化したオブジェクトは全て破棄されると思っていました。
    そうなると下の押した回数メッセージ表示ボタンでいうと、2回目以降はNewキーワードでインスタンス化しなくても既にオブジェクトがあるってことですね。どうやって前回作ったオブジェクトを拾ってくるんだろう…。
    いろいろとびっくりです。勉強し直してきます。

一般的な手法が知りたいです。

アプリ終了後は保持しなくていいなら、「ファイルに保存せずメモリ上だけで保持する」のが一般的です。

極端な話無色透明のLabelコントロールを作って、そこにテキストとして入れておけば十分やりたいことは満たせます。

これでいいと思います。

さすがに文字数制限に引っかかる気がしますが、それぐらいしか困る要素がありません。とはいえあまりにプリミティブというか…なんか違うだろう感がすごいです。

なら、透明ラベルのかわりに文字列変数に格納するくらい。
とはいえユーザーID別にデータを持つということなので、@radian-jp さんが提案しているディクショナリにしておくと楽でしょうね。

内容
ディクショナリのKey string ユーザーID
ディクショナリのValue string データ文字列(XML)

たぶんXML化しない方が楽なんじゃないかと思いますが、「データ形式はxmlです」とのことなので上の表はXML化する部分はすでにできているという想定です。
どうせ外部とやり取りするデータではなくアプリの内部的なデータでしかないのなら、まずは自分がやりやすい方法で意図したとおりに動くものを作ることを優先した方がいいでしょう。
「IT業界で働いているわけではないけど自前でなんとかしたい」ということなら、今後のことを考えてきちんと設計することの優先度は低いでしょうし。

0Like

みなさまご回答ありがとうございます。クラスやdictionaryはxml作る過程で使うので使い方はわかっているつもりなのですが、それらにデータを格納しても保持されるのはプロシージャが終わるまでで、次にプロシージャが走ったときにはデータは残っていないと思うのですが間違っているでしょうか。
すごく単純化した話ですが、ボタンを押すと「このボタンを押したのはこれで3回目です。」みたいなメッセージを表示するようなボタンを作ったとします。プロシージャの最後にメッセージの表示をするとします。この場合すでに2回押されたという情報がどこかに書いてあるからそれに+1して3回目と言えるのだと思います。この2という情報をクラスに持たせることができるのでしょうか。シングルトンなインスタンスという言葉を初めて聞いたので調べたのですが、単に1つしかインスタンス化できないクラスと理解しました。もしかしてこれだとインスタンス化する度に前回インスタンス化したときの情報が呼び起こされるのでしょうか。流石にそんなことないですよね…。

0Like

Your answer might help someone💌