お世話になります。
今、TTreeViewを使用しているのですが、
NODEの編集を行った直後のonEditedイベントでNODEのテキストのチェックを行おうと考えております。
チェック自体は、onEditedイベントのパラメータ:Sを使用して加納なのですが、エラーだった場合、このノードを編集状態にしたいと思っています。
そこで、以下の様にコードを書いたのですが、TreeViewのノードの表示がおかしくなってしまいます。
procedure TForm1.TreeView1Edited(Sender: TObject; Node: TTreeNode;
var S: string);
begin
//チェックを行いエラーだったら再編集
if (チェック条件) = エラー then
begin
S := Node.Text; //テキストを戻す
Node.EditText; //再編集状態にする
end;
end;
イベントがグルグル回る?などと考えてみたもののさっぱりわかりません。
どなたか、このようなことをやったことのある方、ご教授願えますか。
よろしくお願いします。
TTreeView:SaveToStreamを使用して編集前のデータを隠し持っておく。
間違いが起きた時点でTTreeView:LoadFromStreamで差し戻す
こんな説明でわかるかな?
前の値自体は、Node.Textで取得可能なのでSに入れてあげれば値は戻せるのです。
Node.EditTextを実行した時に、変な表示(文字数分真っ白でその後ろにカーソルがいる状態)になってしまうのです。
本来なら、テキストが反転して編集状態になると思っているのですが。。。
ちなみに、当方Delphi2005です。バージョンは関係ないかな・・・。
Delphi-MLにありました。
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=068052
//Node.EditText; //再編集状態にする
PostMessage(Node.TreeView.Handle, TVM_EDITLABEL, 0, Integer(Node.ItemId));
これでいけるかと。
ちなみに、Delphi7でも再現しました。
遅くなってもう押し分けありません。
MLを参照しました。
TVM_EDITLABELというのは、MLに出てくるMessageForDelayのことだと思うのですが、
TVM_EDITLABELの定義はどこにあるのでしょう・・・。
調べてみたもののなにかunitを追加する必要があるのかわかりませんでした。
自己解決しました。
const TVM_EDITLABEL = WM_USER + 100;
というような定義が必要だったのですね。
アドバイスありがとうございました。
解決と書いたのですが、、、
constで定義すればいい!と浮かれて解決を押してしまいました。
実際、定義する値が違うようで、EDIT状態になってくれませんでした。
定義する値は何なのでしょう。
一人でレスを増やしてすいません。。。
const TVM_EDITLABEL = 4417; //0x1100+ 0x40 (TV_FIRST + TVM_EDITLABELW by CommCtrl.h)
で対応できました。
これでいいのかなぁ。。。
こういう使い方じゃダメ!と言う方いましたら、レスをお願いします。
usesに、CommCtrlを追加すればOKです。
Delphiのバージョンによってはないかもしれませんが。
# Delphi7Proには入っています
にしのさん、ありがとうございます。
ComCtrlsとCommCtrlは違うのですね。。。
無事解決できました。
ありがとうございました。
ツイート | ![]() |