delphi.gif (306 バイト) 文字列の並び替え


Delphiでは文字列を扱うための関数や手続きがたくさん用意されていますが、文字列の集まり(コレクション、リスト)を扱うためのクラスTStringListも用意されています。これを使って文字列の並び替えを行ってみます。

wpe1.jpg (8451 バイト)

 

参照ボタン(エディットボックスの右側のボタン)を押すと、「ファイルを開く」ダイアログを開きます。
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