お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"パスワード処理"





◆説明◆
 パスワードによる機能制限を行います。
 このサンプルでは
1:「Form1 から Button1 をクリックすることで、Form2 が開く」という処理
 部分でパスワードの確認を行います。
2: 使用期限を初回起動時から3ヶ月としています。ただし極めて非正確な
 もので、最大1ヶ月くらいの誤差が出るものです。 (  );
3: 使用期間内はパスワード確認の正否に関わらず Form2 を表示しますが、
 使用期間が過ぎるとパスワード確認が否の場合には Form2 を表示しなくな
 る、という仕様のものです。

◆留意点◆
「使用期限」というものを設けるに当たって、初回起動時の日付をどこかに
記録しておく必要が生じます。
 ここで、例えばこれを INI ファイルやレジストリなどに記録した場合、あ
る程度のコンピュータ知識のある人なら、少々の手間はかかるものの、基本
的には無登録で永続使用が可能となります。
 残念ながら私の知識では、これを完全に防ぐ方法には思い至らないのです
が、このサンプルでは「Windows ディレクトリに密かに記録ファイルを作成
する (^^;」という方法で行います。

◆注意点◆
1: このサンプルでは "Form1.Label1.Caption" を INI ファイルなどに記録
 することを前提とし、同Caption が "OK" であればパスワード確認済みであ
 るとみなす、としています。
2: パスワード入力フォームの名前は FormPW としています。
3: FormPW も自動作成の対象となっています。

◆サンプルコード◆
=↓↓ Form1 コード ↓↓ = = = = = = = = = = =
procedure TForm1.Button1Click(Sender: TObject);
begin
     if Label1.Caption = 'OK' then
     begin
          Form2.Show;
          Exit;
     end else FormPW.ShowModal;
end;

=↓↓ FormPW コード ↓↓= = = = = = = = = = =
unit PassW;

interface

  // ・・略

implementation

{$R *.DFM}

uses
    Unit1, Unit2;
var
   HideFile: String;  // "?:Windows\隠しファイル名" 用の変数
   Fst: Boolean;      // 初回起動か否かの判定用
   m, Month: Word;

procedure TFormPW.FormShow(Sender: TObject);
var
   data: String;
   y, d: Word;
   Load: TextFile;
   SZ: Integer;
   P: PChar;
begin
     // Windows ディレクトリの取得
     P := nil;
     SZ := GetWindowsDirectory(P, 0);
     GetMem(P, SZ);
     GetWindowsDirectory(P, SZ);

     // 変数 HideFile に、隠しファイル "XXX.XXX(仮)" のフルパスを代入
     HideFile := P + '\XXX.XXX'

     // 起動日の "月データ" を m に取得
     DecodeDate(Now, y,m,d);

     Fst := False;
     try
        AssignFile(Load, HideFile);
        try
           Reset(Load);
           Readln(Load, data);

           // 隠しファイルの初回起動月を Month に代入
           Month := StrToInt(data);
        finally
           CloseFile(Load);
        end;
     except
        on EInOutError do  // もし Windows ディレクトリに
        begin              // XXX.XXX ファイルが存在しなければ
             Fst := True;  // ←初回起動と判断
             Month := m;
        end;
     end;
end;

procedure TFormPW.Button1Click(Sender: TObject);
var
   Save: TextFile;
begin
     if Edit1.Text = 'PassWordOK' then  // このサンプルのパスワード
     begin                              // が "PassWordOK"
          ShowMessage('パスワードを確認しました');
          Form1.Label1.Caption := 'OK';
          DeleteFile(HideFile);         // 隠しファイルを削除
          Form2.Show;
          Close;
     end else
     begin
          if Month > m then m := m + 12;

          if Month + 3 > m then
          begin
               ShowMessage('このソフトはシェアウェアです');
               Form2.Show;
          end else
             ShowMessage('使用期限が終了しました');
     end;

     if Fst = True then    // もし初回起動であれば
     begin                 // 今回の起動月を隠しファイルに保存
          try
             AssignFile(Save, HideFile);
             Rewrite(Save);
             Writeln(Save, IntToStr(Month));
          finally
             CloseFile(Save);
          end;
     end;

     Close;
end;

end.


◆参考までに◆
1: FormPW は自動作成ではない方が良いと思います。
2: もしこのように Windows ディレクトリ内に隠しファイルを作成する方法
 を採用される場合は、"XXX.XXX" ナドというような、見るからに怪しげな
 ファイル名は使用しない方が良いと思います。
  でも、"WinINI.buf" とか "Autoexe.buc" ナドとしても、コレはコレで
 十分怪しげなのですが・・・ (  );; コンナ ファイル ナイヨナ・・・

                                    J-OH!(VEC05267)

Original document by J-OH!       氏 ID:(VEC05267)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum