4

Delphi 7 と Delphi 2010 で動作する TVirtualStringTree を含むフォームを作成しました。2 つのプラットフォーム間を移動すると、ツリー イベントで「...パラメータ リストが異なります..」というメッセージが表示され、文字列がTWideString (D7) と文字列 (D2010) の間で型が変化しています。このエラーを抑制するために私が見つけた唯一のトリックは、次のようにコンパイラ ディレクティブを使用することです。

{$IFDEF TargetDelphi7}
procedure VirtualStringTree1GetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
{$ELSE}
procedure VirtualStringTree1GetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: string);
{$ENDIF}

イベントが実装されている場所でこれを繰り返します。簡単な解決策がありませんか?ありがとう。

4

4 に答える 4

1

私は3つの解決策を提案することができます。私自身のコードでは、ソリューション(1)を使用しました。これは、私のアプリケーションでは、Delphi7とDelphi2010の間で共有する必要のあるコードがほとんどないためです。

  1. 実行したとおりに実行し(IFDEF-コンパイルする)、実行時にイベントハンドラーを割り当てます。コードを変更するだけで、要件リストは同じままです。良い解決策ではありません。
  2. TVirtualTreeから派生した新しいコンポーネント(たとえば、TMyVirtualTree)を作成して、両方のプラットフォームで同じ署名を持つ独自のバージョンのOnGetTextイベントを提供します。たとえば、単に「文字列」を使用するようにします。利点:コードはD7とD2010の両方で機能しますが、VirtualTreeコードを変更する必要はありませんが、他の開発者がコードを開きたい場合は、ハッキングされたTMyVirtualTreeコンポーネントをインストールする必要があります。
  3. TVirtualTree自体を変更し、D7とD2010の両方で同じタイプ(文字列)を使用するように変更します。これにより、コードはD7とD2010の両方で機能し、コードはバニラTVirtualTreeを使用してD2010で機能しますが、新しい開発者がD7でコードを開きたい場合は、ハッキングされたソースからVirtualTreeを再構築する必要があります。
于 2010-04-21T11:55:43.930 に答える
1

VirtualTreesユニットで新しい型を宣言することもできます。

{$IFDEF TargetDelphi7}
type
  VTString = type WideString;
{$ELSE}
type
  VTString = type string;
{$ENDIF}

すべてのイベント シグネチャをこの新しいタイプを使用するように変更します。これにより、.dfm ファイルの互換性を維持し、これらの条件をなくすことができます。

于 2010-04-20T15:10:51.940 に答える
1

古いコンパイラの定義を使用して、VirtualTrees.pasuse に変換されたため、この古い質問は解決されたと思います。UnicodeString

{$ifndef COMPILER_12_UP}
type
  UnicodeString = WideString;
{$endif COMPILER_12_UP}

UnicodeStringがいつ導入されたのかはわかりませんが、最近は(かわいそうな, 誰も彼を愛していない -私は彼がどのように感じているか知っていますstring)の別名であることは知っています.UnicodeStringWideString

于 2011-06-13T14:14:56.070 に答える
1

最も簡単な解決策は、D7 と D2010 用に別々のソース フォルダーとコンポーネント フォルダーを維持することです。最終的には時間と頭痛の種を節約できます。

于 2010-04-20T13:53:39.600 に答える