2011-07-31 5 views
2

ラベルの値をソートしようとしています。私は整数値のラベルをたくさん持っています。ラベルは、Label1、Label2、[...]のように呼び出され、ImはFindComponentを介してアクセスします。配列に格納された整数値をソートするのに問題はありませんが、ソート後にどのラベルにどの値が入っているのか分かりません。私の目標は、それらのラベルをその値で並べ替えることが好きなので、その値で並べ替えられたラベルを持つ配列のようになります。イムは、この時点で立ち往生:( 例えば:デルファイのラベルの値のソート

Label1.Caption := 10; 
Label2.Caption := 4; 
Label3.Caption := 7; 

for i := 1 to 3 
do some_array[i] := StrToInt(TLabel(FindComponent('Label' + IntToStr(i))).Caption); 

sortarray(some_array); 

今、私は配列をソートしているが、イムは、その対応する場所になりまた、店舗のラベル番号いくつかの並べ替えの手順を欠いている誰かが私を指摘することができ

答えて

1
。?

代わりに、整数の配列を作成するのではなく、TLabelコントロールの配列を作成します。これを使用すると、整数の配列と同じように並べ替えることができます。実際、MyLabel: TLabel与え、あなたは簡単にStrToInt(MyLabel.Caption)として関連付けられた整数を得ることができます。

さらに、FindComponentアプローチはあまり効率的ではありません。私はします

const 
    ALLOC_BY = 100; 
    MAGIC_TAG = 871226; 
var 
    i: Integer; 
    ActualLength: integer; 
    FLabels: array of TLabel; 
begin 
    SetLength(FLabels, ALLOC_BY); 
    ActualLength := 0; 
    for i := 0 to ControlCount - 1 do 
    if Controls[i] is TLabel then 
     with TLabel(Controls[i]) do 
     if Tag = MAGIC_TAG then 
     begin 
      if ActualLength = length(FLabels) then 
      SetLength(FLabels, length(FLabels) + ALLOC_BY); 
      FLabels[ActualLength] := Controls[i]; 
      inc(ActualLength); 
     end; 
    SetLength(FLabels, ActualLength); 

    SortArray(FLabels) // with respect to the StrToInt(CurLabel.Caption) of each 
        // CurLabel: TLabel. 

もちろん、ラベルの数がわかっている場合は、チャンク割り当てをスキップできます。

アレイに含める各ラベルのTagMAGIC_TAGに設定されていることを確認します。

別のオプションは、

FLabelDataArray[i].Value := StrToInt(FLabelDataArray[i].Control.Caption); 

は一度だけ計算される

type 
    TLabelData = record 
    Control: TLabel; 
    Value: integer; 
    end; 

FLabelDataArray: array of TLabelData; 

アレイを作成することであろう。

+2

ラベルを並べ替えるのはナンセンスだと私は思っていますか?ラベルは保管のために使用しないでください。実際のストレージ(配列やTList など)を使用し、それをソートする必要があります。 –

+0

@Rudy:私は完全に同意します。しかし、私はこの質問を受けたので、私はそれに答えました。私ができることはあまりありません。 –

+0

私の答えを見てください。人々は学ぶことができます。

0

Andreasによると、値をソートするのではなく、ラベルを動的配列に配置します。あなたは、このような配列にそれらを持っていると、このようにそれらを並べ替える:

uses 
    Generics.Defaults, Generics.Collections; 

procedure SortLabels(var Labels: array of TLabel); 
var 
    Comparison: TComparison<TLabel>; 
    Comparer: IComparer<TLabel>; 
begin 
    Comparison := function(const Left, Right: TLabel): Integer 
    begin 
     Result := StrToInt(Left.Caption)-StrToInt(Right.Caption); 
    end; 
    Comparer := TDelegatedComparer<TLabel>.Create(Comparison); 
    TArray.Sort<TLabel>(Labels, Comparer); 
end; 
+0

私はdelphi 7を使用しています。 ( – Klemik

+0

ジェネリック医薬品は見つかりませんでした。 –

1

も古いDelphiのバージョンで動作します間に合わせのn-ソリューションを、Sort方法とObjects性質を持っているTStringListを、使用することです1つのオブジェクトをリストの各エントリに関連付けることができます。

リストは辞書順にソートされているため、文字列に変換するときに整数に0を埋め込む必要があることに注意してください。

var 
    list: TStringList; 
    i: integer; 
    lab: TLabel; 
begin 
    Label1.Caption := '10'; 
    Label2.Caption := '4'; 
    Label3.Caption := '7'; 

    list := TStringList.Create; 
    try 
    for i := 1 to 3 do begin 
     lab := TLabel(FindComponent('Label' + IntToStr(i))); 
     list.AddObject(Format('%10.10d', [StrToInt(lab.Caption)]), lab); 
    end; 

    list.Sort; 

    for i := 0 to list.Count-1 do 
     Memo1.Lines.Add(list[i] + #9 + TLabel(list.Objects[i]).Name); 
    finally 
    list.Free; 
    end; 
end; 

出力は次のようになります。

0000000004 Label2 
0000000007 Label3 
0000000010 Label1 

また、代わりにlist.Sortのおlist.Sorted := trueを使用している場合、あなたは(list.IndexOfまたはlist.Findを使用して)ボーナスとしてlistのバイナリ検索を取得します。

編集:としてルディは、TLabelなどのビジュアル・コンポーネントがデータのみを表示するため、およびいないことを記憶し、操作するために使用されるべきである、と言います。このために適切なデータ構造を使用し、プログラムのロジックをユーザーインターフェイスから分離することをお勧めします。

+0

これは私にとって最高でした;ありがとう – Klemik

+0

@Klemikこれが最良の答えだったら、それを受け入れることを検討してください。http://meta.stackexchange com/questions/5234/how-does-accept-an-answer-work –

0

他の人からも言われたように、私はあなたがこの作業に適切なアプローチを取っているとは思わない。しかし、あなたの質問に基づいて、簡単なハックは、そのキャプションの値を格納するために、各ラベルにタグプロパティを使用することです:

Label1.Caption := '10'; 
Label1.Tag:=10; 
Label2.Caption := '4'; 
Label2.Tag:=4; 
Label3.Caption := '7'; 
Label3.Tag := 7; 

次にあなたが「配列整数の」エントリを照合することによって、適切なラベルを見つけることができますラベルのタグプロパティ

アゲイン:ルディと他の人がコメントしたように、このタスクへのアプローチは、はるかに望ましいからである、と私の解決策は、あなたのアプローチに準拠しています。タグのプロパティ自体は、古くからの 'label'や 'goTo'のようなデルファイに組み込まれたハックであり、古くからの復旧を試みるときのように、コードが書かれていないか、あるいは何かを覚えていて、緊急事態のための迅速な対応が必要です。

関連する問題