文字列の並び替え
Delphiでは文字列を扱うための関数や手続きがたくさん用意されていますが、文字列の集まり(コレクション、リスト)を扱うためのクラスTStringListも用意されています。これを使って文字列の並び替えを行ってみます。
参照ボタン(エディットボックスの右側のボタン)を押すと、「ファイルを開く」ダイアログを開きます。
OKボタンを押すと、FileNameエディットボックスに表示されているファイルを開いてTStringListオブジェクトに読み込みます。
Resetボタンを押すと、TStringListをクリアします。
Saveボタンを押すと、「ファイルに保存」ダイアログを開き、TStringListオブジェクトの内容をファイルに保存します。
Sortボタンを押すと、TStringListの文字列コレクションを昇順に並び替えます。
ソース(青色部分が記述した部分です)
{ ******************************************************************
文字列の並べ替え (TStringListの例)
******************************************************************* }
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
txtFileName: TEdit;
cmdBrowse: TButton;
cmdOK: TButton;
OpenDialog1: TOpenDialog;
cmdReset: TButton;
cmdSave: TButton;
SaveDialog1: TSaveDialog;
cmdSort: TButton;
procedure cmdBrowseClick(Sender: TObject);
procedure cmdOKClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure cmdResetClick(Sender: TObject);
procedure cmdSaveClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure cmdSortClick(Sender: TObject);
private
{ Private 宣言 }
m_filename: string;
m_tokens: TStringList;
procedure MakeStringList;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ 参照ボタン }
procedure TForm1.cmdBrowseClick(Sender: TObject);
begin
// 「ファイルを開く」ダイアログを開いてフィル名を得る
if OpenDialog1.Execute = True then
m_filename := OpenDialog1.FileName
else
m_filename := '';
txtFileName.Text := m_filename;
end;
{ OKボタン }
procedure TForm1.cmdOKClick(Sender: TObject);
begin
MakeStringList; { トークンのリストを作る }
end;
{ 初期化 }
procedure TForm1.FormCreate(Sender: TObject);
begin
m_tokens := TStringList.Create; // 文字列リストオブジェクトを作る
end;
{ 閉じるとき }
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
m_tokens.Free;
end;
{ トークンのリストを作る }
{ 注意: m_tokens.LoadFromFile(m_filename)としたほうが簡単です。ファイル操作
例として作ってあります。 }
procedure TForm1.MakeStringList;
var
token: string;
f: TextFile;
begin
// ファイルを開く
if m_filename = '' then
Exit;
AssignFile(f, m_filename);
Reset(f);
// 最初のトークンを得る
Readln(f, token);
// トークンがある間繰り返す
while Eof(f) = False do
begin
m_tokens.Add(token);
Readln(f, token);
end;
CloseFile(f);
MessageDlg('文字列リストを読み込みました。', mtInformation, [mbOK], 0);
end;
{ トークンリストをクリアする }
procedure TForm1.cmdResetClick(Sender: TObject);
begin
m_tokens.Clear;
end;
{ トークンリストを保存する }
procedure TForm1.cmdSaveClick(Sender: TObject);
begin
if SaveDialog1.Execute = True then
begin
m_tokens.SaveToFile(SaveDialog1.FileName);
end;
end;
{ 並べ替える }
procedure TForm1.cmdSortClick(Sender: TObject);
begin
m_tokens.Sort;
MessageDlg('文字列を並べ替えました。', mtInformation, [mbOK], 0);
end;
end.
入力データ例
AAA
BAB
BBA
ACC
BAA
AAB
CAC
ABC
BCA
ソート結果
AAA
AAB
ABC
ACC
BAA
BAB
BBA
CAC