初めまして私はVB6.0の初心者でVB6.0について勉強しています。現在以下のようなiniファイル操作について分からないことがあります。
・プログラム内容
テキストボックスにログインID(例えばenshu)を入力しOKボタンを押して、iniファイル(例えばrenshu.ini)にある情報と照合してもしiniファイルに無かったら「ログインできません」というメッセージボックスを出すプログラム。
条件
・フォームにテキストボックス(Text1.Text)とコマンドボタン(OKボタン)がある
・Iniファイルの形式(renshu.ini)
IDNO(セクション名)
OK_ID(キー名)1 = “enshu”(ログインID)
OK_ID(キー名)2 = “ren”(ログインID)
OK_ID(キー名)3 = “shu”(ログインID)
上のような形式が不特定多数ある
・Iniファイルの保存場所
c:\work\renshu.ini
私の場合以下のように書きました。
Private Sub OK_Click() 'OKボタンがクリックされたら
If Text1.Text <> GetIniString("IDNO", "OK_ID", "c:\work\renshu.ini") Then '入力したログインIDがiniファイルに無い場合
'メッセージ表示
MsgBox "ログインできません"
End If
End Sub
としましたがメッセージボックスが表示されません。なぜなのでしょうか。教えてください。宜しくお願いいたします。
No.7ベストアンサー
- 回答日時:
もし、何人だろうが挙げられている方法で処理するなら、例えば…
Dim i as Integer 'カウンタ
Dim tmpID as String 'IDテンポラリ
Dim idExists as Boolean 'ID存在フラグ
idExist = False 'ID未発見状態に
i = 0 'カウンタ初期化
Do
i = i + 1
tmpID = GetIniString("IDNO", "OK_ID" & CStr(i), "c:\work\renshu.ini")
'Iniにキー値が存在しなかった場合はGetIniStringの戻りが""になるとして、
'その場合は処理終了とする
If tmpID = "" Then Exit Do
'入力がIniのIDにヒットしたらフラグを立ててループから抜ける
If Text1.Text = tmpID Then
idExists = True
Exit Do
End If
Loop
'ループ後にIDが未発見ならメッセージ出力
If Not idExists Then
MsgBox "ログインできません"
End If
…こんな感じので どうでしょ? テストはしてませんが…
これの前提条件として、OK_IDn の n は、必ず1から連番で存在しなければいけません。
(抜け番号は存在してはならない)
また、必ずログインIDは1文字以上登録されていなければいけません。
(抹消とかの対応のために、IDとして使用不可な文字を決めておいて、
その文字を抜け番の判定に使う、なんて方法も考えられますが)
あと、上のソースではインデントに全角Space使ってますので変換してください。
でも…あまり多くなるようでしたら、やっぱりDBの使用をお勧めしますね。
管理大変ですし。
K-Sogacchiさん、ご回答ありがとうございます。
あと確認の意味で、質問があります。宜しくお願いします。
>Dim i as Integer 'カウンタ
このカウンタとはOK_IDn のnをさしているのでしょうか。
>Dim tmpID as String 'IDテンポラリ
このIDテンポラリとはどういうことでしょうか。テキストボックスに入力したIDが一時的に保存状態になっているということでしょうか。
>idExist = False 'ID未発見状態に
これは、入力したIDがiniファイルに無かった場合という考え方で合っているでしょうか。
初歩的な質問ですみません。
No.13
- 回答日時:
たびたびすみません、No.7ですが、念のために補足を。
当然ではありますが、No.12のように処理を行う場合、ユーザIDに
「not found」は設定できません(汗)。
厳密に言えば、プログラムの「穴」になりますので、頭の片隅に
入れておいてください。
あと、…何も考えずに答えだけ書いてしまいましたが、なぜ32767まで
止まらずにカウントして、挙句にエラーが出たのか、No.12に書いた内容を
踏まえてコードを読めば判断できるとは思いますので、頑張って考えてみてください。
No.12
- 回答日時:
再びNo.7です。
すみません、最初の方で、見つからなかった際の文字列について言及してたんですね。
んでは、以下の部分は、
'Iniにキー値が存在しなかった場合はGetIniStringの戻りが""になるとして、
If tmpID = "" Then
Exit Do 'その場合は処理終了とする
End If
以下に変えてください。
'Iniにキー値が存在しなかった場合はGetIniStringの戻りが"not found"になるので、
If tmpID = "not found" Then
Exit Do 'その場合は処理終了とする
End If
…あと、今回の場合はたぶん有り得ないとは思いますが、あまりにIniに登録されている内容が
多くて、32767件を超えていると、同じようなエラーになります。
これは、Integer型が32767までしか対応していないためなので、そういう場合は
カウンタや関連する変数をLong型に変更する等の対応が必要になります。
データ型は、細かい事は覚えなくてもいいけど概念だけは理解しないと、
後できっと泥沼にはまりますよ。
No.11
- 回答日時:
No.7です。
>このカウンタとはOK_IDn のnをさしているのでしょうか。
そうです。CStrで文字列にして連結することにより、調べるキー値を設定しています。
>このIDテンポラリとはどういうことでしょうか。テキストボックスに入力したIDが一時的に保存状態になっているということでしょうか。
いえ、そうではありません。
GetIniStringで取得した文字列を、ループ中の 後の処理で複数回使用するので、
わざわざGetIniStringを複数回発行しないよう、1回発行したらその結果を
憶えておくためのテンポラリです。
この辺は、ソースの「書き方」レベルの話ですね。人によって多少書き方は
変わる可能性がありますが…
>これは、入力したIDがiniファイルに無かった場合という考え方で合っているでしょうか。
いえ、該当行での処理は、そうではありません。
該当行では、Iniにあったかどうかを憶えておくための、ON・OFFのスイッチ
(一般的に「フラグ」という呼び方をすることが多いです)を、初期状態として、
まずOFFに(BooleanなのでFalseに)しています。
で、ループ中にIni内で発見されればスイッチをON(True)にしてループを抜け、
ループ中に発見されないまま終了条件(If tmpID = "" Then Exit Do の部分)に達したら
スイッチがONにならない(Falseのまま)でループを抜けるわけです。
この手の処理方法は、私の中では常套手段なんですが… たぶん慣れれば分かりやすいと思いますよ。
ご回答ありがとうございます。
あともう一つ質問があります。
下のプログラムを実行しました。具体的にはテキストボックスにIniに無いID(例えばabcd)を入力して実行させたら「実行時エラー'6':オーバーフローしました」という警告表示が出て、デバッグするとi=i+1の行が黄色になってしまいその行にカーソルを合わせると「i = 32767」と出ます。一体何が原因なのでしょうか。お知恵をお貸しください。宜しくお願いします。
Private Sub Command1_Click()
Dim i As Integer 'カウンタ
Dim tmpID As String 'IDテンポラリ
Dim idExists As Boolean 'ID存在フラグ
idExists = False 'ID未発見状態に
i = 0 'ID初期化
Do
i = i + 1
tmpID = GetIniString("IDNO", "OK_ID" & CStr(i), "c:\work\renshu.ini")
'Iniにキー値が存在しなかった場合はGetIniStringの戻りが""になるとして、
If tmpID = "" Then
Exit Do 'その場合は処理終了とする
End If
If Text1.Text = tmpID Then '入力がIniのIDにヒットしたらフラグを立ててループから抜ける
idExists = True
Exit Do
End If
Loop
If Not idExists Then 'ループ後にIDが未発見ならメッセージ出力
MsgBox "ログインできません"
End If
End Sub
No.10
- 回答日時:
確かに、redfox63氏の指摘通り、私の書いたやり方は、特に行数が多くなると
レスポンスが悪くなるはずです。1000とか超えると現実的じゃないレスポンスに
なるかも…
理由は、(あくまで推測ですが)GetPrivateProfileStringが、内部的に
「単純に先頭からLine Inputで1行ずつ読みながら文字列検索する」という動作を
していると仮定すると、以下の形のIniだと…
[IDNO]
OK_ID1=xxx
OK_ID2=xxx
:
:
OK_ID100=xxx
…OK_ID1を見つけるのに、2行読む事になります。
OK_ID2だと3行です。OK_ID100は101行です。
となると、100行あったら、読むのは100行じゃなくて
2+3+4+……+101 行になります。
おまけに、GetPrivateProfileStringを発行するごとに、ファイルのOpen、Closeも
行っているはずですので、更に遅くなります。
GetPrivateProfileSection(これの存在は初めて聞きました…)で一気に取得するか、
Iniファイルといえど結局は基本的にただのテキストファイルなので、
自力で読みながら文字列解析するか、の方が、あくまでIniファイルを
使用するならば現実的なのかもしれません。
No.9
- 回答日時:
K-Sogacchi氏の回答のように、Iniファイルをなめてやれば 1000人だろうと2000人だろうと可能です
ただ、レスポンスが悪くなったり無駄が多いのでより効率的に認証させたいならと思い#6の回答内容となります
毎回 GetPrivateProfileStringで検索するより
GetPrivateProfileSectionでセクションごとデータを取得して
改行などで配列に分割、この配列を検索する
といった手法もあるでしょう
No.8
- 回答日時:
NO.7です。
すみません、バグがありました(汗)idExist = False 'ID未発見状態に
ではなく、
idExists = False 'ID未発見状態に
ですね。
No.6
- 回答日時:
一般的な話をすれば 100人とか照合しないといけないのであれば
照合用のIDとパスワードといった組み合わせで入力をさせるようにします
そうすれば GetIniStringの現在キーにしている ID_OKxxといった物が不要になります
つまりIDとして入力される "enshu"、"ren"、"shu"などをキーにして データのパスワードをGetIniStringで引き出すといった具合にします
もっと管理する人数が増えるのであれば データベースを使うように考えましょう
ご回答頂きありがとうございます。
それではテキストボックスに入力したIDデータ1つとiniファイルにあるIDデータ全部(IDデータの数が10未満でもよい)を比較することは不可能なのでしょうか。お知恵をお貸しください。宜しくお願いします。
No.5
- 回答日時:
> GetIniStringで取得したデータとText1.Textは同一ではありませんでした。
> 一体何が原因なのでしょうか。
単に『同一ではありませんでした』といわれても原因なんて分かりません
WinAPIのGetPrivateProfileStringでエラーになったのか、その他のロジックが悪いのか
実行した結果ssが『何々』でしたとか lngRetの値が『云々』でしたといった返答をしましょう
# われわれ回答者はあなたのすぐそばで見ているわけではありません
他の方も回等しているように
GetIniStringの引数garKeyの与え方がまずいため返り値が"not found"になっているのであろうと思います
garKeyに "OK_ID1"、"OK_ID2"、"OK_ID3"などを与えて検査するようにしましょう
ご回答ありがとうございます。
Private Sub Command1_Click()
Dim ID As String 'iniファイルから文字列を取得する関数
ID = GetIniString-("IDNO", "OK_ID4", "c:\work\renshu.ini") '関数を変数IDに格納----★
If Text1.Text <> ID Then
MsgBox "ログインできません"
End If
End Sub
>garKeyに "OK_ID1"、"OK_ID2"、"OK_ID3"などを与えて検査するようにしましょう
GetIniString("IDNO", "OK_ID4", "c:\work\renshu.ini") のキー名の部分を"OK_ID1"、"OK_ID2"、"OK_ID3"という風に変更してテキストボックスに★と違うログインIDを入力した結果「ログインできません」とでました。ただGetIniString関数で取得できるデータはひとつだけで、iniファイルにあるログインIDが不特定多数(例えばiniファイルにログインIDが100個ある場合)と照合するときには不向きです。こういう場合GetIniStringの引数のキー名の部分をどのように表せばよいのでしょうか。ご教授ください。宜しくお願いします。
No.4
- 回答日時:
前にも書いたんだけど、
GetIniString("IDNO", "OK_ID", "c:\work\renshu.ini")
↓
GetIniString("IDNO", "OK_ID1", "c:\work\renshu.ini")
GetIniString("IDNO", "OK_ID2", "c:\work\renshu.ini")
GetIniString("IDNO", "OK_ID3", "c:\work\renshu.ini")
なのでは?
"OK_ID"≠"OK_ID1"ですから…
それと、OK_ID1="AAA"のように記述すると、"も入ってしまうのでは?
いきなり比較しないで、他の方の回答のようにイミディエイトウィンドウに表示してみましょう。
Dim ID As String
ID = GetIniString("IDNO", "OK_ID", "c:\work\renshu.ini")
Debug.Print ID
If Text1.Text <> ID Then
・・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- Visual Basic(VBA) エクセルのマクロについて教えてください マクロを実行すると メッセージボックスが表示されて okをク 4 2023/07/05 19:32
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Chrome(クローム) 入力フォームの履歴を消したい 2 2023/06/29 13:02
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- Yahoo!メール Yahooアカウントにログインできなくなって困っています。 2 2023/05/16 02:28
- Visual Basic(VBA) Excel VBA ユーザーフォーム1のコンボボックスに別ブックの値を反映させたいです。 6 2023/03/21 16:12
- ヤフオク! ヤフーアカウントについての質問です。 「不正利用が疑われる操作もしくは行為が検知されたため、利用規約 5 2022/08/29 20:22
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
unicode文字列(日本語)のファイ...
-
VBAで新しい日付順にファイルを...
-
テキストファイルを直接置換す...
-
access vbaでCSVファイルを文...
-
バッチでiniファイルの編集
-
UNIX コマンドへの引数について
-
ExcelVBAで以下のマクロを作成...
-
VB6側からテキストファイルをク...
-
特定フォルダ内のテキストファ...
-
VBAでPowerPointからExcelにデ...
-
複数行の文字列を変数として使...
-
Excel.VBA テキストファイルを...
-
コマンドプロンプトの「%1」と...
-
大量のフォルダからひとつのフ...
-
バッチでテキストファイルから...
-
コマンドプロンプトのエラーに...
-
バッチ処理でファイルの中身を...
-
公文書のxmlファイルの開き方が...
-
xcopyで特定のファイルのみをコ...
-
コマンドプロンプト標準出力と...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
時間短縮のために、テキストフ...
-
複数行の文字列を変数として使...
-
特定フォルダ内のテキストファ...
-
fortranでのcsvファイルを出力...
-
VBAで新しい日付順にファイルを...
-
Excel.VBA テキストファイルを...
-
VB6側からテキストファイルをク...
-
VBAでPowerPointからExcelにデ...
-
テキストファイルの行頭に文字...
-
BCPユーティリティの使用法_...
-
バッチでiniファイルの編集
-
unicode文字列(日本語)のファイ...
-
テキストファイルを直接置換す...
-
ある文字列を含む行の抽出
-
RandomとBinaryモードの違い
-
access vbaでCSVファイルを文...
-
VB.NETでテキストファイルからH...
-
iniファイルとの比較(iniファイ...
-
ソースコードの差分がある行番...
-
VBSを用いてIPアドレスを取得し...
おすすめ情報