お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





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

"TList.AddとTList.Sort"





{ 先日はまった、TList.AddとTList.Sortの使い方のサンプルです。
使い方:
  (1)フォーム上にメモとボタンを2つずつ配置する
  (2)Button1とButton2のOnClickのイベントとしてButton1.Clickを共有する
  (3)プログラムを実行し、Memo1に数値を入力
  (4)Button1/Button2をクリックするとMemo2にMemo1の内容を昇順/降順にソー
トした結果をそれぞれ出力する }

var
  myList: TList;

{ TList.Sortの引数には、2つのPointer型の引数を取りInteger型の結果を返す
関数を指定する。関数の戻り値は
    Item1 < Item2ならば <0
    Item1 = Item2ならば =0
    Item1 > Item2ならば >0
である }

{ 昇順ソートの関数 }
function AscSort(Item1, Item2: Pointer): Integer;
begin
    if Integer(Item1^) < Integer(Item2^) then
        AscSort := -1
    else if Integer(Item1^) = Integer(Item2^) then
        AscSort := 0
    else
        AscSort := 1;
end;

{ 降順ソートの関数 }
function DescSort(Item1, Item2: Pointer): Integer;
begin
    if Integer(Item1^) < Integer(Item2^) then
        DescSort := 1
    else if Integer(Item1^) = Integer(Item2^) then
        DescSort := 0
    else
        DescSort := -1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    Memo1.Lines.Clear;
    Memo2.Lines.Clear;
    myList := TList.Create; { myListを生成する }
end;

{ ボタンが押されたら、myListにMemo1の内容を整数値として保存する
その後昇順又は降順でソートし、結果をMemo2に書き込む }
procedure TForm1.Button1Click(Sender: TObject);
var
    x: ^Integer;
    cnt: Integer;

begin
    Memo2.Lines.Clear;

    for cnt := 0 to Memo1.Lines.Count - 1 do
    begin
    { TListに格納されるのは、値へのポインタであるため
     新しい領域を確保してやる必要がある }
        New(x); 
        { Memo1の中身を、Integerとして保存 }
        x^ := StrToInt(Memo1.Lines[cnt]);
        myList.Add(x);
    end;

    if (Sender as TButton).Name = 'Button1' then
        myList.Sort(AscSort)   { Button1が押されたら昇順ソート }
    else
        myList.Sort(DescSort); { Button2が押されたら降順ソート }

    { ソートされたmyListの中身をMemo2に書き出す }
    for cnt := 0 to myList.Count - 1 do
    begin
        Memo2.Lines.Add(IntToStr(Integer(myList.Items[cnt]^)));
    end;

    { 確保した記憶域を解放する }
    for cnt := 0 to myList.Count - 1 do
    begin
        Dispose(myList.Items[cnt]);
    end;

   { myListをクリア }
    myList.Clear;
end;



                                     97/10/25(土) 20:24 CELL(BYH06053)

Original document by CELL        氏 ID:(BYH06053)


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

Copyright 1996-2002 Delphi Users' Forum