Windows のほとんどのアプリケーションには、PowerBuilder、Office、Cstar など、独自の初期化ファイルがあります。したがって、初期化ファイルの読み取りと書き込みは、すべての上級プログラマーが習得する必要があるテクノロジーです。初期化ファイルの読み書きはオブジェクトを使用して行うこともできますが、 Pascal のテキスト ファイルは同じ方法で読み書きされますが、初期化ファイルは通常のテキスト ファイルとは異なるため、独自の固定フォーマットを持っています (以下の初期化ファイルは ucdos で提供される rdfnt.ini ファイルであることを参照してください)。テキスト ファイルを使用して読み込む 書き込みを行うと、形式変換は非常に面倒なだけでなく、エラーが発生しやすくなります。プログラマが初期化ファイルのデータを読み書きしやすくするために、Delphi はユーザーに TIniFile クラスを提供します。非常に便利に読み書きできます。
Ucdos の rdfnt.ini ファイルの内容は次のとおりです。
[True Type フォントディレクトリ]
Dir=C:WINDOWSSYSTEM
【True Typeフォント一覧】
ARIAL.TTF=64
ARIALBD.TTF=65
アリアリ.TTF=66
アリアルビ.TTF=67
TIMES.TTF=68
TIMESBD.TTF=69
TIMESI.TTF=70
タイムズBI.TTF=71
コース.TTF=72
COURBD.TTF=73
COURI.TTF=74
クルビ.TTF=75
[すべての True Type フォントを使用する]
すべて=0
TiniFile クラスは Delphi コンポーネントではないため、Delphi の VCL テンプレートでは見つかりません。したがって、TiniFile クラスを使用するには、ユニット内で Uses inifiles ディレクティブを明示的に使用する必要があります。このクラスを使用するファイルを説明します。
TiniFile クラスには多数のメンバー関数が定義されています。より頻繁に使用されるメンバー関数をいくつか示します。
⑴作成()
関数は次のように定義されます。constructor Create(const FileName: string);
この関数は、TiniFile クラスのオブジェクトを作成します。パラメータ FileName は、読み書きされる初期化ファイルの名前です。
読み書きするファイルが Windows ディレクトリにある場合 (system.ini ファイルなど)、パスを指定せずにファイル名を直接書き込むことができます。それ以外の場合は、パスを指定する必要があります (d:ucdos dfnt.ini など)。 )。
次の規則に従って、指定したディレクトリにファイルが存在する場合は、初期化ファイルを開きます。そうでない場合は、指定したディレクトリに初期化ファイルを作成します。
⑵ReadSections()
このプロセスは次のように定義されます。 PRocedure ReadSections(Strings: TStrings);
このプロセスは、作成された TiniFile クラス オブジェクト (つまり、それに関連付けられた初期化ファイル) からすべてのノード名 (つまり、rdfnt.ini ファイルの [True Type fonts] などの [] 括弧で囲まれた部分) を読み取ります。 list]) は文字列リストに格納されます。パラメータ Strings は文字列リストの変数名です。
⑶ ReadSectionValues()
プロシージャは次のように定義されます。procedure ReadSectionValues(const Section: string; Strings: TStrings);
このプロセスでは、パラメータ Section の値 (rdfnt.ini ファイルの [True Type fonts list] など) とそれに含まれる値 (ARIALBI.TTF など) に対応するノード内の各キーワード (ARIALBI.TTF など) を変換します。 TTF キーワード値は 67) は、パラメーター Strings で指定された文字列リストに読み込まれます。
⑷ ReadSection()
プロシージャは次のように定義されます。procedure ReadSection(const Section: string; Strings: TStrings);
このプロセスは、パラメータ Section の値に対応するノード内の各キーワードを、パラメータ Strings で指定された文字列リストに読み込みます。 ReadSectionValues() との違いは、各キーワードの対応する値を読み取らないことです。
⑸ ReadString()
関数は次のように定義されます。 function ReadString(const Section, Ident, Default: string): string;
この関数は、パラメーター Section の値を持つノード名と、パラメーター Ident の値を持つキーワード名に対応するキーワード値 (たとえば、[True Type fonts list] セクションの ARIALBI.TTF キーワードの値) を返します。は67)。指定したノードまたはセクションにキーワードが存在しない場合、関数はパラメータ Default のデフォルト値を返します。戻り値は文字列データです。
指定したノードのキーワード値のデータ型が文字列ではない場合、ReadInteger() メンバー関数を使用して整数値を読み取り、ReadBool() メンバー関数を使用してブール値を読み取ることができます。
⑹ WriteString()
プロシージャは次のように定義されます。 プロシージャ WriteString(const Section, Ident, Value: string);
この処理により、パラメータSectionの値がノード名、パラメータIdentの値がキーワード名となるキーワード値がパラメータValueの値に設定される。この処理では文字列データを設定します。
指定されたノードとキーワードの両方が存在する場合は、Value の値が元の値を置き換えます。指定されたノードが存在しない場合は、関連付けられた初期化ファイルにノードが自動的に追加され、ノードの値は の値になります。パラメータ Section では、キーワードがノードの下に自動的に追加されます。ノードが存在するがキーワードが存在する場合、キーワード名はパラメータ Ident の値であり、キーワードに対応する値はパラメータ Value です。存在しない場合、キーワードはノードの下に自動的に追加されます。キーワード名はパラメータ Ident の値であり、このキーワードに対応する値はパラメータ Value の値です。
整数値を設定するには、WriteInteger() メンバー関数を呼び出します。ブール値を設定するには、WriteBool() メンバー関数を使用します。
上記の関数の機能を理解していれば、初期化ファイルの作成や読み書きは難しくありません。以下では、実際の例を使用して初期化ファイルの読み取り方法を説明します。手順は次のとおりです。
⒈ 初期化ファイルの読み取りと書き込みが必要なフォーム上に、SectionComboBox と IdentComboBox という名前の 2 つの結合リスト ボックスを配置します。SectionComboBox にはノード名が格納され、IdentComboBox には選択したノードのキー名が格納されます。 IdentValueEdit という名前の入力ボックスには、対応するキーワードの値が保存されます。 CmdChang という名前の変更コマンド ボタンを使用して、キーワードの値を変更できます。変更後、CmdSave という名前のストレージ コマンド ボタンを使用して、変更されたキーワード値を関連する初期化ファイルに保存します。フォームに対応するユニット名は IniUnit に設定され、フォーム名は IniForm に設定され、フォームのレイアウトは次の図 1 のようになります。
⒉ IniUnit ユニットのインターフェース部分では、参照する TiniFile クラスで定義されたユニット名を指定します。そして、変数記述部分にTiniFileクラスのオブジェクトを定義します。
var IniFile: TiniFile;
⒊ フォームの OnCreate イベント プロシージャを確立します。 TIniFile クラスの Create member 関数を使用して TIniFile オブジェクトを作成し、このオブジェクトを使用して d:ucdos ディレクトリ内の rdfnt.ini 初期化ファイルの読み取りと書き込みを行い、初期化ファイル内のすべてのノードを SectionComboBox 組み合わせリスト ボックスに読み取ります。 ReadSections() メンバー関数を使用して、最初のノードのすべてのキーワードを IdentComboBox に読み取ります。結合リスト ボックスで、ReadString() メンバー関数を使用して、最初のキーワードの値を IdentValueEdit 入力ボックスに送信します。
⒋ SectionComboBox結合リストボックスのOnChangeイベント処理を作成します。リスト ボックスで異なる項目 (つまり、異なるノード名) を選択する場合は、ReadSection() メンバー関数を使用して、選択したノード内のすべてのキーワードを IdentComboBox 結合リスト ボックスに読み取り、ReadString() メンバー関数を使用して読み取ります。最初のキーワードの値が IdentValueEdit 入力ボックスに送信されます。
⒌ IdentComboBox組み合わせリストボックスのOnChangeイベント処理を確立します。リスト ボックスで別の項目 (つまり、別のキーワード名) を選択する場合は、ReadString() メンバー関数を使用して、キーワードの値を IdentValueEdit 入力ボックスに送信します。
⒍ コマンドボタンCmdChangのOnClickイベントプロセスを作成します。 IdentValueEdit 入力ボックスの内容を変更可能にし (IdentValueEdit 入力ボックスはコマンド ボタンを押さないと変更できません)、コマンド ボタン CmdSave を有効に設定して、変更されたキーワード値を関連する初期化ファイルに保存できるようにします。
⒎ コマンドボタン CmdSave の OnClick イベントプロセスを作成します。キーワード値が変更された場合は、WriteString() メンバー関数を呼び出して、変更されたキーワード値をディスクに保存します。
⒏ フォームの OnDestroy イベント プロシージャを作成します。フォームが失敗すると、作成された TIniFile オブジェクトが解放され、オブジェクトによって使用されていたシステム リソースが解放されます。
この時点で、プロジェクトの実行後、初期化ファイルの読み書きがスムーズに進むようになります。もちろん、EraseSection() メンバー関数を使用して指定したセクションを削除することもできます。また、DeleteKey() メンバー関数を使用して指定したキーワードを削除することもできます。紙面の都合上、ここでは詳しく紹介しません。興味がある場合は、Delphi の使用方法のヘルプを参照してください。
このユニットのソースコードは次のとおりです。
ユニットIniUnit;
インタフェース
用途
ウィンドウ、メッセージ、SysUtils、クラス、グラフィックス、コントロール、フォーム、ダイアログ、
StdCtrls、inifile;
タイプ
TIniForm = クラス(TForm)
セクションコンボボックス: TComboBox;
ラベル 1: T ラベル;
CmdSave: TButton;
CmdChang: TButton;
IdentComboBox: TComboBox;
IdentValueEdit: TEdit;
ラベル 2: T ラベル;
ラベル 3: T ラベル;
プロシージャ FormCreate(Sender: TObject);
プロシージャ SectionComboBoxChange(Sender: TObject);
プロシージャ FormDestroy(Sender: TObject);
プロシージャ CmdChangClick(送信者: TObject);
プロシージャ CmdSaveClick(送信者: TObject);
プロシージャ IdentComboBoxChange(Sender: TObject);
プライベート
{プライベート宣言}
公共
{公的宣言}
終わり;
変数
IniForm: TIniForm;
{Delphi の TIniFile クラスを介した Windows 初期化ファイルの読み取りと書き込み}
IniFile: TIniFile;
実装
{$R *.DFM}
プロシージャ TIniForm.FormCreate(送信者: TObject);
始める
{ TIniFile クラスの Create member 関数を使用して、TIniFile ペアを作成します
オブジェクト。このオブジェクトは、d:ucdos ディレクトリ内の rdfnt.ini ファイルの読み取りと書き込みに使用されます。
読み書きするファイルが Windows ディレクトリ (system.ini など) にある場合、
パスを指定せずにファイル名を直接記述することもできます。
IniFile:=TIniFile.Create('d:ucdos dfnt.ini');
{ TIniFile オブジェクトに関連付けられた初期化ファイル system.ini 内のすべての内容
セクションを含むセクション名 ([] 括弧で囲まれた部分) はドロップダウン グループに送信されます。
コンボ リスト ボックス SectionComboBox}
SectionComboBox.Clear;
IniFile.ReadSections(SectionComboBox.Items);
{system.ini ファイルの最初のセクション名を選択}
SectionComboBox.ItemIndex:=0;
SectionComboBoxChange(送信者);
CmdSave.Enabled:=False;
終わり;
{コンボ リスト ボックスの選択されたセクションの対応する項目 IniComboBox
変数と対応する値は複数行のテキスト エディター IniMemo に送信されます。
プロシージャ TIniForm.SectionComboBoxChange(Sender: TObject);
始める
IdentComboBox.Clear;
IniFile.ReadSection(SectionComboBox.Text,
IdentComboBox.Items);
IdentComboBox.ItemIndex:=0;
IdentComboBoxChange(送信者);
終わり;
プロシージャ TIniForm.IdentComboBoxChange(Sender: TObject);
始める
IdentValueEdit.Enabled:=False;
{選択されたキーワード値を読み取る}
IdentValueEdit.Text:=
IniFile.ReadString(SectionComboBox.Text,
IdentComboBox.Text,');
終わり;
プロシージャ TIniForm.CmdChangClick(送信者: TObject);
始める
CmdSave.Enabled:=True;
IdentValueEdit.Enabled:=True;
IdentValueEdit.SetFocus;
終わり;
プロシージャ TIniForm.CmdSaveClick(送信者: TObject);
始める
IdentValueEdit.Modified の場合は開始します
IniFile.WriteString(SectionComboBox.Text,
IdentComboBox.Text、
IdentValueEdit.Text);
終わり;
IdentValueEdit.Enabled:=False;
CmdSave.Enabled:=False;
終わり;
プロシージャ TIniForm.FormDestroy(送信者: TObject);
始める
IniFile.Free {作成したオブジェクトを解放する}
終わり;
終わり。
上記の方法は、Windows 95 で Delphi 3.0 を使用したデバッグに合格しました。