問題タブ [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 - ツリーのようなデータ構造(VirtualTreeviewで使用するため)
ロブ・ケネディ氏が示唆したように、VCLコンポーネントへのデータの保存を停止し、「基礎となるデータ構造」を持たせる必要があるところまで来ました。
まず、この質問は「基礎となるデータ構造を作成するにはどうすればよいか」についてです。:)
私の階層は2つのレベルのノードで構成されています。
今、私はルートノードをループすることによって自分のものを通り抜けます。ルートノードの子ノードをループして、必要なもの(データ)を取得します。スレッドを使用してエントリを簡単に変更できるように、すべてのデータをいわゆる基になるデータ構造に格納できるようにしたいと思います(それができると思いますか?)
ただし、エントリをループする場合(現在)、結果はノードのチェック状態によって異なります。基になるデータ構造を使用している場合、ノードがチェックされているかどうかを確認するには、データ構造をループするときに、私のノードではありませんか?
2つのレベルを使用したいとしましょう。
これは親になります:
そして子供:
それは基本的に私が今していることです。コメントは、これが最善の解決策ではないと述べているので、私は提案を受け入れています。:)
私の質問をご理解いただければ幸いです。:)
ありがとう!
delphi - マウス移動時のセル内の仮想 TreeView 更新ヒント
私はかなりうまく機能しているグリッドとして TVirtualStringTree を使用しています。
ユーザーがマウスをセルの上に置いたときにヒントを表示するために、ツリービューのヒント機能を使用しています。 セルのテキストの長さに関係なくヒントを表示したいので、HintMode を hmHint に変更する必要がありました。
私が今やろうとしているのは、マウスがセル内にある場所に応じて異なるヒントを表示することです。
OnGetHint イベントを使用して、ヒントが表示される前にこれを問題なく実行できます。私の問題は、ユーザーがマウスを別のセルに移動したときにのみ、このイベントが発生することです。
ヒントが表示され、マウスが同じセル内で移動している間にヒントを更新する方法を見つけることができません
アプリケーションの OnShowHint イベントを使用して、他のコントロールの提案を見てきましたが、ヒントが消えて再び表示されないようです。
誰でもアイデアはありますか?
ありがとう
アップデート
いくつかの調査の後、誰かが解決策を思いつくのに役立つ場合に備えて、私が見つけたものは次のとおりです。
CMHintShow メソッドは、HintInfo レコードの CursoRect フィールドをセルの境界に設定します。これにより、マウスがこの矩形 (TApplication.HintMouseMessage) の外に出るまで、VCl がヒント コードを再度トリガーするのを停止するようです。
CursorRect をセル境界よりも小さい値に設定すると、ヒントが更新されます。私はさまざまな目的でいくつかの場所で VT を使用しているため、これらの変更を直接行うことはできません。この変更を必要としないソリューションを取得するとよいでしょう。
delphi - TStringListからVirtualTreeViewに追加するにはどうすればよいですか?
これが私が達成しようとしていることです
パスワードを生成する関数があり、これをTStringListに追加します。この後、VirtualTreeViewにアイテムを入力する必要がありますが、そうすることでどこにでも速く到達することができません。それはどのように正しい方法で行われるべきですか?私はまだ学んでいて、専門家ではありません。
パスワードを生成するための私の関数:
これが私がそれを呼んでいる方法です
私はこれを完全に間違った方法で行っていると思います。私は2日間試してみましたが、誰かが私にそれをどうやってやるべきかをまっすぐに教えてくれたら素晴らしいと思います。
クリス
delphi - TVirtualDrawTreeで背景が透明なノードを作成するにはどうすればよいですか?
TVirtualDrawTreeからカスタムコントロールを派生させており、DoPaintBackground
イベントをオーバーライドして、ツリービューの背景グラデーション効果を描画しています。
また、関数をオーバーライドしてDoBeforeItemPaint
、ツリービューアイテムをカスタム描画できるようにします。しかし、背景を透明にしてアイテムをペイントすることはできません。
TVirtualDrawTreeのソースを見ると、アイテムがTBitmapイメージにコピーされてからキャンバスにコピーされているように見えますが、ソースを編集してビットマップ自体に透明度オプションを設定しようとしましたが、まだ表示されません。働くこと。
また、描画する前にキャンバスをクリアしてCanvas.Brush.Style := bsClear
、アイテムを正しく埋めようとしましたが、喜びはありません。
multithreading - 他のスレッドから VT データにアクセスしても安全ですか?
セカンダリ スレッドから VirtualTreeView データを変更しても安全ですか? はいの場合、クリティカル セクション (または Synchronize メソッド) を使用する必要がありますか?
残念ながら、他のスレッドから VT のデータ レコードに書き込んでいるときに、メイン スレッドがその再描画を呼び出し、この更新によって一度に同じレコードが読み取られることになります。アプリケーションで 2 つのスレッドしか使用していないことを補足します。
何かのようなもの ...
アップデート
クリティカル セクションをコードに追加しました。この関数がレコードへのポインターのみを返す場合でも、TMyCreatedThread クラスから GetNodeData を呼び出すのは本当に危険ですか?
どうもありがとう
よろしく
delphi - 複数の仮想ツリービューノードのチェック状態を同期させるにはどうすればよいですか?
私のツリーには2つのレベルのノードがあります-それは連絡先リストスタイルのツリーです。
私の問題は、すべての「連絡先カテゴリ」ですべての連絡先をチェックしてもらいたいということです。これが現在の連絡先リストのスクリーンショットです(はい、投稿する権限があります)
ご覧のとおり、Todd Hirschはカテゴリテストカテゴリでチェックされていますが、すべての連絡先ではチェックされていません。私が達成しようとしているのは、連絡先にすべてのカテゴリで同じチェックステータスを持たせることです。
例:テストカテゴリでToddHirschをチェックします-ToddHirschはすべての連絡先(および他のすべてのカテゴリ)で自動的にチェックされます。すべての連絡先でToddHirschをチェックすると、テストカテゴリでもチェックされます。すべての連絡先でToddHirschのチェックを外すと、テストカテゴリでもチェックが外されます。
VirtualStringtreeのOnCheckingイベントを介して、ツリー内の各ノードのツリー全体をループして試してみましたが、連絡先リストが大きい場合(2000以上)は非常に遅く、5000以上の場合はさらに遅くなる可能性があります。プログラムをクラッシュさせます(アプリケーションが動作を停止しました)
何を指示してるんですか?
これは、連絡先が1回だけチェックされるようにするために使用するコードです。(それは私が今望んでいるものではありませんが、私が今使っているものです。)
delphi - VirtualStringTreeで1つのオブジェクトを複数回表示することは可能ですか?
現在VST(VirtualStringTree)を使用してデータを保存しているので、プログラムのデータ構造を本当に書き直す必要があることに気付きました(今ではありませんが、締め切りは月曜日です)。
私が達成したいのは、連絡先リストの構造です。ルートノードはカテゴリであり、子は連絡先です。全部で2つのレベルがあります。
ただし、複数のカテゴリに表示するには連絡先が必要ですが、同期する必要があります。特にチェックステート。
現在、同期を維持するために、ツリー全体をループして、変更されたばかりのIDと同じIDを持つノードを見つけます。ただし、ノードの数が非常に多い場合、これを行うのは非常に遅くなります。
それで、私は考えました:複数のカテゴリで連絡先オブジェクトの1つのインスタンスを表示することは可能でしょうか?
注:正直なところ、私はこの用語に100%精通していません。インスタンスとは、1つのオブジェクト(またはレコード)であるため、ツリー全体を調べて同じIDの連絡先オブジェクトを見つける必要はありません。
次に例を示します。
ご覧のとおり、ToddHirschはテストカテゴリとすべての連絡先に表示されます。しかし、舞台裏では、これらは2つのPVirtualNodeであるため、ノードの1つ(CheckStateなど)のプロパティ、またはノードのデータレコード/クラスの何かを変更すると、2つのノードは同期されません。そして現在、それらを同期できる唯一の方法は、ツリーをループして、同じ連絡先を収容するすべてのノードを見つけ、それらとそのデータに変更を適用することです。
要約すると、私が探しているのは、1つのオブジェクト/レコードを使用して、ツリー内の複数のカテゴリに表示する方法です。1つのノードがチェックされるたびに、同じContactオブジェクトを格納する他のすべてのノードもチェックされます。
ここで意味がありますか?
delphi - TVirtualStringTreeでフォーカスボックスの色を変更するにはどうすればよいですか?
この写真のように、フォーカスボックスのTVirtualStringTreeの境界線の色を変更する必要があります。
delphi - Delphi に最適な無料のサードパーティ ツリー実装は何ですか?
仮想ツリービューで使用でき、メモリをあまり消費せず、使いやすく、VT と同じくらい高速なツリー実装が必要です (つまり、データを VT 自体に保存する場合)。
私は Linas の svTree を試してみました。これは使いやすいですが、期待したほど高速ではなく、メモリ フレンドリーでもありませんでした。
また、私のアプリが何千ものノードを管理することを指摘したいだけです。:)
おすすめの無料ライブラリを教えてください。また、仮想ツリービューで使用する方法の最小限のデモを作成できますか?
delphi - データ構造と VirtualStringTree の PVirtualNodes を分離してデータを格納しますか?
そのため、独自の別のデータ構造を作成することをいじっています。ようやく動作するようになりましたが、古い方法に比べてメモリ使用量がとてつもなく高いことに気付きました。
これをテストするために、同じテスト アプリを作成しましたが、データは PVirtualNodes に保存します。
それぞれ 1000 個の子を持つ 1000 個のルートを追加すると、個別のデータ構造は約 208 MB を使用していましたが、PVirtualNode は約 160 MB しか使用していませんでした。また、わずかに高速でした。
別のデータ構造を使用すると、メモリの使用量が減り、高速になるはずだと思っていましたが、代わりにそれが代償だと思いますか?
「PVirtualNode にデータを保存する」のソースは次のとおりです: http://pastebin.com/j6L2eHJt
「別のデータ構造にデータを保存する」のソースは次のとおりです: http://pastebin.com/iSwR0hW1