TTreeViewのノードの再編集を促すには?

解決


みみ  2006-01-06 14:26:07  No: 19516  IP: 192.*.*.*

お世話になります。

今、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;

イベントがグルグル回る?などと考えてみたもののさっぱりわかりません。
どなたか、このようなことをやったことのある方、ご教授願えますか。

よろしくお願いします。

編集 削除
これはどうかなー、べただけど  2006-01-06 14:34:18  No: 19517  IP: 192.*.*.*

TTreeView:SaveToStreamを使用して編集前のデータを隠し持っておく。
間違いが起きた時点でTTreeView:LoadFromStreamで差し戻す
こんな説明でわかるかな?

編集 削除
みみ  2006-01-06 15:09:55  No: 19518  IP: 192.*.*.*

前の値自体は、Node.Textで取得可能なのでSに入れてあげれば値は戻せるのです。
Node.EditTextを実行した時に、変な表示(文字数分真っ白でその後ろにカーソルがいる状態)になってしまうのです。
本来なら、テキストが反転して編集状態になると思っているのですが。。。

ちなみに、当方Delphi2005です。バージョンは関係ないかな・・・。

編集 削除
にしの  2006-01-07 00:13:28  No: 19519  IP: 192.*.*.*

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でも再現しました。

編集 削除
みみ  2006-01-19 18:39:26  No: 19520  IP: 192.*.*.*

遅くなってもう押し分けありません。

MLを参照しました。
TVM_EDITLABELというのは、MLに出てくるMessageForDelayのことだと思うのですが、
TVM_EDITLABELの定義はどこにあるのでしょう・・・。
調べてみたもののなにかunitを追加する必要があるのかわかりませんでした。

編集 削除
みみ  2006-01-19 18:57:10  No: 19521  IP: 192.*.*.*

自己解決しました。
const TVM_EDITLABEL = WM_USER + 100;
というような定義が必要だったのですね。

アドバイスありがとうございました。

編集 削除
みみ  2006-01-19 19:20:35  No: 19522  IP: 192.*.*.*

解決と書いたのですが、、、
constで定義すればいい!と浮かれて解決を押してしまいました。
実際、定義する値が違うようで、EDIT状態になってくれませんでした。
定義する値は何なのでしょう。

編集 削除
みみ  2006-01-19 19:30:58  No: 19523  IP: 192.*.*.*

一人でレスを増やしてすいません。。。

const TVM_EDITLABEL = 4417;  //0x1100+ 0x40 (TV_FIRST + TVM_EDITLABELW by CommCtrl.h)

で対応できました。

これでいいのかなぁ。。。

こういう使い方じゃダメ!と言う方いましたら、レスをお願いします。

編集 削除
にしの  2006-01-19 19:54:53  No: 19524  IP: 192.*.*.*

usesに、CommCtrlを追加すればOKです。
Delphiのバージョンによってはないかもしれませんが。
# Delphi7Proには入っています

編集 削除
みみ  2006-01-19 20:06:06  No: 19525  IP: 192.*.*.*

にしのさん、ありがとうございます。

ComCtrlsとCommCtrlは違うのですね。。。

無事解決できました。
ありがとうございました。

編集 削除