いつもお世話になってますw
今回はTListViewを使って、Listに文字列をいくつかセットしてそのセット
した物の中で同じ物があったら1個に纏めてそこだけ文字の色を変更したい
のですが、いい方法が浮かびません;;
誰か教えてくださいw
こんな感じでどうでしょう。
リスト項目を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.
それだと、新規登録時に重複チェック、ということですね。
すでに項目リストがある場合はどうなるの?
> すでに項目リストがある場合はどうなるの?
あっ、そうか、StringList に写し取って、新規登録の手順を踏めばいいのか。
なるほど。Caption だけでなく、SubItems があったりすると重複チェックが
面倒ですね。
> なるほど。Caption だけでなく、SubItems があったりすると重複チェックが
面倒ですね。
TStringList に Caption と SubItems を組み合わせた文字列を
登録するだけでいいと思うのですが...
何か見落としてる点がありますか?
> TStringList に Caption と SubItems を組み合わせた文字列を
> 登録するだけでいいと思うのですが...
そうですね。重複チェックをどの部分でやるかが問題ですけど。
Caption が同じで SubItems が違っても重複とするか、全部
同じの時だけ重複とするか、組み合わせた文字列をどのような
仕様にするか、などの細部はありますが、大枠は Basser さん
の示されたコードでいけそうですね。
返答が遅くなってすいませんでした;;
Basserさん、つっかさん、ありがとうございます!!
サンプルソースまで用意していただいてっ!
勉強しながら実装していってみたいと思いますね!!
ありがとうございます!!
>そうですね。重複チェックをどの部分でやるかが問題ですけど。
えっと、すべてのアイテムを追加した後にやろうと思ってます。
>Caption が同じで SubItems が違っても重複とするか、全部
>同じの時だけ重複とするか、組み合わせた文字列をどのような
>仕様にするか、などの細部はありますが、大枠は Basser さん
>の示されたコードでいけそうですね。
基本的にSubItemには何もいれない仕様です。TListViewのItemには
1つのカラムしか使わず文字列(数値)だけの構成です。
この時にすべてセットしたら同じ文字列があるかどうか見るような
処理にしようと思ってます。
サンプルソースを自分なりに変更して構築しているんですが
TListViewのViewStyleがvsReport以外なら全てうまく行くの
ですがViewStyleがvsReportの場合だけ文字色が変更されません
ViewStyleがvsReportだと駄目なのでしょうか?
>サンプルソースを自分なりに変更して構築しているんですが
>TListViewのViewStyleがvsReport以外なら全てうまく行くの
>ですがViewStyleがvsReportの場合だけ文字色が変更されません
>ViewStyleがvsReportだと駄目なのでしょうか?
ごめんなさい。ヘルプを読み間違えていました。
TListView のOwnerDraw プロパティを True にして下さいと書きましたが
これは間違いです。OnCustomDrawItem の場合は、False のままでいいようです。
これが原因で vsReport だとフォントカラーが変更されないみたいです。
>ごめんなさい。ヘルプを読み間違えていました。
>TListView のOwnerDraw プロパティを True にして下さいと書きましたが
>これは間違いです。OnCustomDrawItem の場合は、False のままでいいようです。
>これが原因で vsReport だとフォントカラーが変更されないみたいです。
OwnerDrawをFalseにしたらvsReportでも出来ました!!
ありがとうございましたぁ!!
ツイート | ![]() |