TListViewで同じものを1個にまとめれますか?

解決


えり  2004-04-24 01:25:28  No: 8542

いつもお世話になってますw

今回はTListViewを使って、Listに文字列をいくつかセットしてそのセット
した物の中で同じ物があったら1個に纏めてそこだけ文字の色を変更したい
のですが、いい方法が浮かびません;;
誰か教えてくださいw


Basser  2004-04-24 19:38:19  No: 8543

こんな感じでどうでしょう。
リスト項目をTStringListで管理します。
TListView のOwnerDraw プロパティを True にして下さい。

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    ListView1: TListView;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
  private
    FListItems: TStringList;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FListItems:= TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FListItems.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i:Integer;
begin

  // リスト重複項目チェック処理
  i:= FListItems.IndexOf(AnsiUpperCase(Edit1.Text));

  if (i = -1) then
  begin

    // 未登録項目名の場合は、各リストに項目名のみ登録
    FListItems.Add(AnsiUpperCase(Edit1.Text));
    with ListView1.Items.Add do Caption:= Edit1.Text;

  end
  else
    if (FListItems.Objects[i] = nil) then
    begin
      // 重複項目確認用に Objects プロパティに適当な値をセット
      FListItems.Objects[i]:= TObject(1);
      // リストビューの再描画
      ListView1.Invalidate;
    end;

end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  i: Integer;
begin

  if (Item = nil) then Exit;

  // Font.Colorの設定
  i:= FListItems.IndexOf(AnsiUpperCase(Item.Caption));
  if (i = -1) then Exit;
  if (FListItems.Objects[i] = nil) then
    Sender.Canvas.Font.Color:= clWindowText else
    Sender.Canvas.Font.Color:= clRed;

end;

end.


つっか  2004-04-24 19:45:13  No: 8544

それだと、新規登録時に重複チェック、ということですね。
すでに項目リストがある場合はどうなるの?


つっか  2004-04-24 19:48:11  No: 8545

> すでに項目リストがある場合はどうなるの?

あっ、そうか、StringList に写し取って、新規登録の手順を踏めばいいのか。
なるほど。Caption だけでなく、SubItems があったりすると重複チェックが
面倒ですね。


Basser  2004-04-24 20:30:00  No: 8546

> なるほど。Caption だけでなく、SubItems があったりすると重複チェックが
面倒ですね。

TStringList に Caption と SubItems を組み合わせた文字列を
登録するだけでいいと思うのですが...
何か見落としてる点がありますか?


つっか  2004-04-24 21:46:22  No: 8547

> TStringList に Caption と SubItems を組み合わせた文字列を
> 登録するだけでいいと思うのですが...

そうですね。重複チェックをどの部分でやるかが問題ですけど。
Caption が同じで SubItems が違っても重複とするか、全部
同じの時だけ重複とするか、組み合わせた文字列をどのような
仕様にするか、などの細部はありますが、大枠は Basser さん
の示されたコードでいけそうですね。


えり  2004-04-26 18:05:56  No: 8548

返答が遅くなってすいませんでした;;

Basserさん、つっかさん、ありがとうございます!!
サンプルソースまで用意していただいてっ!
勉強しながら実装していってみたいと思いますね!!

ありがとうございます!!


えり  2004-04-26 22:34:33  No: 8549

>そうですね。重複チェックをどの部分でやるかが問題ですけど。
  えっと、すべてのアイテムを追加した後にやろうと思ってます。

>Caption が同じで SubItems が違っても重複とするか、全部
>同じの時だけ重複とするか、組み合わせた文字列をどのような
>仕様にするか、などの細部はありますが、大枠は Basser さん
>の示されたコードでいけそうですね。
  基本的にSubItemには何もいれない仕様です。TListViewのItemには
1つのカラムしか使わず文字列(数値)だけの構成です。
この時にすべてセットしたら同じ文字列があるかどうか見るような
処理にしようと思ってます。


えり  2004-04-27 23:40:41  No: 8550

サンプルソースを自分なりに変更して構築しているんですが
TListViewのViewStyleがvsReport以外なら全てうまく行くの
ですがViewStyleがvsReportの場合だけ文字色が変更されません
ViewStyleがvsReportだと駄目なのでしょうか?


Basser  2004-04-28 01:57:25  No: 8551

>サンプルソースを自分なりに変更して構築しているんですが
>TListViewのViewStyleがvsReport以外なら全てうまく行くの
>ですがViewStyleがvsReportの場合だけ文字色が変更されません
>ViewStyleがvsReportだと駄目なのでしょうか?

ごめんなさい。ヘルプを読み間違えていました。
TListView のOwnerDraw プロパティを True にして下さいと書きましたが
これは間違いです。OnCustomDrawItem の場合は、False のままでいいようです。
これが原因で vsReport だとフォントカラーが変更されないみたいです。


えり  2004-04-28 03:22:56  No: 8552

>ごめんなさい。ヘルプを読み間違えていました。
>TListView のOwnerDraw プロパティを True にして下さいと書きましたが
>これは間違いです。OnCustomDrawItem の場合は、False のままでいいようです。
>これが原因で vsReport だとフォントカラーが変更されないみたいです。

  OwnerDrawをFalseにしたらvsReportでも出来ました!!
  ありがとうございましたぁ!!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加