問題タブ [virtualtreeview]
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 - 各フィールド値を手動で設定せずに 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 であることを確認できます。
それで、どうやってこれをしたのですか?
delphi - 仮想ツリービュー (TVirtualStringTree) で項目グループごとにヘッダー バーを含むマスター/詳細ビューを作成する
TVirtualStringTree から次のような結果を得ようとしています。
TVirtualStringTree
(Mike Lischke によるメインの Virtual Treeview コントロール) を直接使用するか、それをサブクラス化して継承されたコントロールを変更するか、 TVirtualDrawTree
.
これが私が得ることができるものであり、私が直面している問題を示しています:
私が抱えている問題は、列 0 のテキストが仮想ツリービュー コントロールの水平領域全体を占めるように見えないことです。高度なデモには仮想ツリービュー デモがあり、複数行のテキストが表示され、必要なことを行っているように見えますが、ヘッダー行の下に必要な詳細列 (ノードとして表示) と組み合わせて適用する方法がわかりません。ノード、写真のノード)。
これが私が試したものです:
- BeforeCellPaint イベントの ContentRect.Right を変更します。
- で設定
toGridExtensions
しTreeOptions.MiscOptions
ます。
contentRect を変更しようとした方法を示すコード サンプルを次に示します。
アップデート:
以下で受け入れられた回答を使用すると、次のようになります。
delphi - svTreeデータ構造を保存およびロードするにはどうすればよいですか?
VirtualStringTreeコンポーネントを使用して単純な連絡先マネージャーを実装しようとしています。すべてテキストを含む3列のみのリストビューコンポーネントのように設定しました。
データ構造には、別のStackOverflowの質問で言及されたLinasのsvTreeを使用しています。
私はこのような記録を宣言しました:
フォームのOnCreateには、次のものがあります。
TEditsからのデータを次のように追加しています。
これをストリームまたはファイルに保存してロードバックするにはどうすればよいですか?MyTree.SaveToFile('C:/Test.dat')
とを使用してみMyTree.LoadFromFile('C:/Test.dat')
ましたが、ロードバックすると、ツリービューにデータが含まれず、空白行のみが含まれます。
delphi - VirtualTreeView の Firemonkey バージョン
人気のあるVirtualTreeViewの Firemonkey バージョンが準備中かどうか知っている人はいますか? また、カスタム コントロールを Firemonkey に移植した経験を集めて、仮想ツリー ビューを Firemonkey に移植するのにどれだけの作業が必要かを見積もることができる人はいますか? このコントロールが必要であり、Firemonkey への切り替えは、このコントロールを機能させることができる場合にのみオプションです。
ありがとう!
delphi - TVirtualStringTreeに複製を追加しない方法は?
2つのVirtualStringTreeがあり、最初のVSTにデータが入力されており、2番目のVSTを確認して、最初のVSTにまだ存在しないノードを追加したいと思います。または、最初のVSTと重複していない2番目のVSTのノードを追加したいと思います。
D7を使用しています。
delphi - VirtualStringTreeスクロールバーを表示するにはどうすればよいですか?
form1に1つのVirtualStringTree(VST1)を配置し、それにいくつかのデータを追加しました。垂直スクロールバーはノードの数に関係なく表示され、ノードの高さのデフォルトのプロパティについては何もしませんでした。次に、VST1をform2にコピーし、VST2という名前を付けたところ、VST2のスクロールバーが表示されなくなりました。VST2のparent
コントロールとalign
プロパティを変更しました(何度もテストしましたが、alignとその親のプロパティを変更する順序を思い出せません)。最後にスクロールバーがどのように表示されるかわかりません。次に、VST2をform3にコピーし、VST3という名前を付けました。そして今、私がどのようにテストしたとしても、VST3のデータがウィンドウビューを超えている場合、その垂直スクロールバーは表示されません。
VSTのプロパティが多すぎますが、どのプロパティを設定する必要がありますか?
編集:
[編集]:
最初にアインに感謝します。
注意深くテストしたところ、同じ関数を2回以上呼び出すと、そのvirticalscrollbarが表示されることがわかりました。何かのようなもの:
button1を初めてクリックすると、垂直スクロールバーが表示されません。2回目以上の場合は、完全に表示されます。
なぜ?、それを解決する方法は?
ありがとう
performance - VirtualStringTree Correct/recommended use
I have been using virtualstringtree for a while now. I use it for two different things, first a s a normal tree for selecting ,displaying data and secondly as a grid to show outputs from SQL statements.
All my data loaded in to the trees is from a database. For the tree example, i have a parentId field to distinguish the heirarchy, and for the grid examples i simply use an SQL statement with a customized record for each tree (that is unique).
My questions relates to the preferred/best way to populate the tree. I have read from the VST docs that you should use the onInitNode event along with rootnodecount. However i have found that using the AddChild() method to be very similar, even though it is not encouraged.
Let me show some (simplified) examples:
1. Heirarchy
2. Grid
So essentially i am bypassing the RootNodeCount and OnInitNode methods/property and using the old fashioned way to add nodes to the tree. It seems to work fine. Note in the example i create and destroy my queries at runtime.
The reason i started using the tree in this manner is that i could load all the data in the tree once and then free the TQuery after i had finished using it. I was thinking that regardless of keeping the TQuery alive/created i would still need to use my rData record to store the data, hence using up more memory if i did not destroy the TQuery. Currently my application uses about 250+MB when fully loaded, and can increase when i run SQL reports and display them in the VST. I have seen it use about 1GB of ram when i have run a SQL report with 20000+ nodes and 50+ columns. What i would like to know if the way i am using the VST incorrect with regards to minimizing memory usage?
Would i be better off creating a query for the lifetime of the tree and using the onInitNode event? So that when data is requested by the tree it fetches it from the TQuery using the onInitNode/OnInitChildren event (i.e. the pure virtual paradigm of the tree)? Thus i would need to keep the TQuery alive for the duration of the form. Would there be any memory benefit/performance benefit in using it this way?
In the above situations the i can see the difference for the grid example would be far less (if any) than the heirarchy - due to the fact that all nodes need to be initialized when populated.
delphi - データの1つのコピーを使用して複数のVirtualStringTreeを同期します
VirtualStringTreeに表示されるデータの階層があります。私はこの階層をアプリケーションで複数回使用していますが、ツリーの描画/表示方法にわずかな変更を加えています。私のメソッドは現在、AddChild()プロシージャを使用してノードを追加しているため、アプリケーションの実行時にデータの複数のコピーがあります。
これらのツリーを統合し、実際のデータを指す「マスター」ツリーを作成しますが、「スレーブ」ツリーは同じデータを指すようにします。
これを達成できるかどうか/どのように達成できるかは少しわかりません。マスターツリーをロードして、そのNodeDataに、保持しているデータの場所へのポインターを入力し、すべてのスレーブツリーについて、同じポインターをノードデータに格納するだけでよいと思います。
しかし、私はあまり運がありません。
私の現在のコードは次のようになります:
マスターツリーをスレーブツリーにコピーする手順
スレーブツリーがgetCellTextを取得するための手順
現時点では、ノードは正しい階層に追加されていますが、スレーブツリーのテキストは表示されていません。どんな助けでもいただければ幸いです。