問題タブ [tvirtualstringtree]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - 仮想 StringTree のヒント ウィンドウが画面に表示されない
このスクリーンショットを参照してください。中央にあるのは、TVirtualStringTree コントロールによって生成され、画面に残されている小さなヒント ウィンドウです。これらのヒント ウィンドウは、アプリケーションが終了するまでそこに残ります。問題は、ツリービューのヒントが表示され、マウスがその隣のウィンドウにすばやく移動したときに発生します。
これを回避する方法、またはこれを回避するのが難しい場合に消去されていないヒント ウィンドウをクリアする方法について何か考えはありますか?
数日前に同様の質問をしましたが、スクリーンショットのヒント ウィンドウは同じように見えますが、同じ問題ではありません。その問題、ヒント テキストは表示されず、そのような未完了のヒント ウィンドウのみが表示されます。この問題、ヒント テキストは表示されますが、ヒント ウィンドウが完全に消去されない場合があります (上記で説明したように)。それが明確であることを願っています。
delphi - TVirtualStringTreeでフォーカスボックスの色を変更するにはどうすればよいですか?
この写真のように、フォーカスボックスのTVirtualStringTreeの境界線の色を変更する必要があります。
delphi - 基本的な Delphi TVirtualTreeView ノード アイコンの上にオーバーレイ アイコンを表示する最適な方法
標準の TTreeView から TVirtualStringTree を使用するようにツリー ビューを変換しています。私の最後の課題は、既知のノード アイコンの上に「合格/不合格」ステータス インジケーターを描画する必要がある機能を実装することです。私が使用したTTreeViewで:
その結果、以下に示すように、基本アイコンの上に赤い十字が表示されます。
TVirtualStringTree を使用して、より良い方法を見つけるか、必要なオーバーレイ アイコンの位置について、よりよく知られている位置を取得したいと考えました。私がやっている:
これが最善の解決策ですか?恐ろしいノードレベルの呼び出しなしで、基本アイコンの左上隅を取得するより良い方法はありますか?
string - TVirtualStringTree の InitNode イベントで文字列を割り当てるとアクセス違反が発生する
Delphi 2007 で問題なく動作する特定のコード。ただし、Delphi 2009 では例外が発生します。
アクセス違反は、アドレス $00000000 の読み取りを示しています。
問題は文字列を割り当てるときにのみ存在し、数値に対して機能します。
Data.Text
また、デバッガー オプションを使用して手動で割り当てると、AV が取得されません。動作します。
正直なところ、私は迷子になっています。誰か助けてください。
delphi - VirtualStringTree スクロールバーを更新するには?
VirtualStringTree の問題を解決するのに苦労しています。
- Node.NodeHeight
NodeData
で最初に追加したものがあります - またはDefaultNodeHeight。
ここでの問題は、各NodeHeightを異なるサイズに変更することでした。その結果、VirtualStringTree は正しいスクロールを提供せず、他のノードが見えなくなりました。
誰でも助けてもらえますか?
delphi - VirtualStringTree セルペイント
さて、次の問題があります。
いくつかのブール変数に応じて、ツリー セルをさまざまな色でペイントしました。例:
- isProcessService、
- isProcessInDebugger、
- isProcessService、
- isProcessElevated、
- isProcessNet、
- isProcessOwner、
- isProcessinJob、
- isProcessPacked、
- isProcessMarkedForDeletion、
- isProcessMarkedForCreation : ブール値;
したがって、BeforeCellPaint では、次のようなブール値に基づいてセルの背景色をペイントします。
質問は:
プロセスが作成または削除されるかどうかに応じて、セルを緑または赤にペイントするにはどうすればよいですか (色を少なくとも 1 秒間そのままにしてから、元の値に戻しますか?)
つまり、プロセスが作成され、セルが緑色にペイントされ、しばらく待ってから、isProcessService、is ProcessOwner などに応じて元の色に戻ります...
最大の問題は、非ブロック モードでこれが必要なことです (スリープを使用できません。そうしないと、ツリーもフリーズするため、色の変化が認識されません)。
それでもフォローできない場合は、プロセスが作成または削除されたときに Process Explorer または Process Hacker が行うのと同じ動作を模倣しようとしています。どちらのアプリケーションも、これらのプロセスのセルの背景を赤または緑で 1 秒間ペイントしてから、セルの元の色に戻します。
参考までに、wmi 経由でプロセスの作成または削除の通知を受け取ります。
delphi - キャッシュシステムを使用してデータを更新するVirtualStringTree
さて、私はVirtualStringTreeを使用して一種のプロセスマネージャーを作成しています...
1000msに設定されたタイマーでツリーを更新したために問題が発生しました(CPU使用率が高すぎて、アプリケーションが大量のデータ(約20列を埋める)を取得できません。
それで、ある種のキャッシュシステムを構築して、何かが変更されたときにのみツリーを更新できるようにするにはどうすればよいのでしょうか。これが、アプリケーションのCPU使用率を大幅に低下させる鍵であると思われます。
をちょきちょきと切る:
アプリケーションが起動したら、実行中のすべてのプロセスでツリーを埋めます。これは一度だけ呼び出されることを覚えておいてください。後でアプリケーションを実行すると、新しいプロセスまたはwmiを介して終了するプロセスの通知を受け取ったので、後でタイマーで次のプロシージャを呼び出してツリーを更新する必要はありません...
必要なすべてのデータを取得して、次のようにツリーに保存するクラスがあります。
したがって、実行中のすべてのプロセスを列挙したい場合は、次のように呼び出します。
問題は、変更されたデータだけでなく、すべてを列挙しているときにここから始まります。これは、CPUを大量に消費します。
基本的に、タイマーはCPU使用率と、次のようなプロセスから取得できるすべてのメモリ情報にのみ必要です。
- Priv.Memory
- ワーキングセット
- ピークワーキングセット
- 仮想サイズ
- PageFileの使用法
- PageFileのピーク使用量
- ページフォールト
- CPU使用率
- スレッド数
- ハンドル数
- GDIハンドル数
- ユーザーハンドル数
- 合計CPU時間
- ユーザーCPU時間
- カーネルCPU時間
したがって、上記のデータをキャッシュして比較する必要があると思います。データが変更された場合、またはどのように、そして何が最も効率的か疑問に思っているだけではないでしょうか。
delphi - 各フィールド値を手動で設定せずに PVirtualNode にデータを書き込む
このノード データ レコードがあるとします。
VirtualStringTree を設定するには、次のようにします。
これで問題なく動作しますが、簡単にしたいので、レコードに新しいフィールドを追加するたびに AddToTree メソッドを変更する必要はありません。
だから私はこれを試しました:
これはコンパイルされますが、VTが何も表示してPVirtualNode
いないため、データを取得していないように見えます。また、OnGetText イベントを中断すると、変数が空であることがわかります。
私は何を間違っていますか?:)
delphi - VirtualStringTree - 複数行のノードとテキストの垂直方向の中央揃え
VirtualStringTree のノードが複数行 (Node.States の vsMultiline) の場合、そのノードのすべての列 (複数行の列を除く) のテキストを垂直方向に中央揃えするにはどうすればよいですか?
OnBeforeCellPaint
(を使用して)を使用してみましTargetCanvas.TextOut()
たが、これはテキストをまったく描画しません。デフォルトでは、複数行ノードのテキストは常にノードの上部に描画されます。
(複数行でないノードの場合、テキストは垂直方向の中央に描画されます)。
delphi - TVirtualStringTree ノードを非表示にするにはどうすればよいですか?
私が間違っていなければ、TVirtualStringTree ツリービューに非表示のノードを作成することはできません。これを行うための有効なプロパティ、可視プロパティ、またはその他のプロパティがないためです。私はこれについて正しいですか?
はいの場合、ノードを非表示にする方法を教えてください。
私のツリーの構造:
- 1 つのノード
- 別のノード
- サブノード 1
- サブノード 2
- ...
- サブノード 15
- サブノード 16 (見えない!)
- さらに別のノード
- さらに別のノードからのサブノード 1
- さらに別のノードからのサブノード 2
ツリー全体で FirstNode/GetNextNode ループを実行すると、サブノード 16 を見つけることができ、最初の列のテキストを出力できます。また、ノードを調べて、たとえば、前の兄弟はいるが次の兄弟はなく、ノードの高さが 18 であることを確認できます。
それで、どうやってこれをしたのですか?