-1

Delphi 4 の TScrollBox コントロール内で TImage コントロールを使用しています。ここでは、それに応じて高さを増やして TImage コントロールにデータを入力しています。

私の機能は、そのレコードを強調表示していくつかの検証を行うために X、Y パラメータを使用しているマウスダウン イベントに基づいています。

ここでの問題は、X、Y が整数型パラメーターであり、-32768 から 32767 の間の値を返すことです。レコードの高さが 32767 を超えると問題に直面します。Mousedown イベントが Y 値を返すのは、私の機能に負の原因があるためです。

この問題を解決するには 2 つの方法があります。

  1. この問題を解決するための回避策。

  2. Delphi 4 の別の組み込みコンポーネントを代替として使用する。

以下で説明するように、1つの汚いアプローチを知っています(これも正しくないが、現在は機能している可能性があります)が、より良い解決策を探しています。

if Y < 0 then 
begin
      Y := Y + 65536;
end
else
begin
     if ScrollBox1.VertScrollBar.Position > 32767 then
        Y := Y + 65536;
end;

この問題のより良い解決策をアドバイスしてください

4

2 に答える 2

1

マウス座標は通常、WMMouseMove メッセージから取得されます。このメッセージのレコード定義は次のとおりです。

type TLMMouse = record
  Msg: Cardinal;
  Keys: PtrInt;
  case Integer of
    0: (XPos: SmallInt;
        YPos: SmallInt;);
    1: (Pos: TSmallPoint;);
    2: (Dummy: LPARAM;
        Result: LRESULT;);
end;

マウス メッセージは座標を 2 つの smallint にパックするため、この問題を回避する方法はありません。

GetCursorPos は 2 つの Int32 を持つ TPoint レコードを提供することに注意してください。ただし、これはコントロールが使用する関数ではないため、これによるメリットはありません。

于 2011-12-28T12:29:02.817 に答える
1

それを解決する3番目の方法があります。Scrollbox の使用をやめ、指定した X、Y 座標で画像の一部をレンダリングできる独自のスクロール バー ハンドルを持つ独自のコントロールを記述します。実際には、作成した単純な TControl ベースのコンポーネントにスクロールバーを追加することで、これを行うことができます。Delphi でビルトイン コントロールを使用することに固執する場合、実際には、かすかにばかげたことをしていることになります。独自のコントロールを数行のコードで記述できます。サード パーティのコントロールを使用したくない場合は、これが正しい答えです。

2 番目の選択肢は、実際には Delphi 開発者の 99% が選択する解決策ですが、この機能を既に備えているサードパーティ製の画像ビューア コントロールに切り替えることです。明らかに、車輪を再発明しても意味がありません。あなたの質問は、サードパーティのコントロールを追加できないことを規定しているようです。

Scrollboxes + TImage は、パフォーマンスの観点からはひどいソリューションです。特に、巨大な画像を GDI メモリに完全に読み込んで画像を含める必要がある場合はなおさらです。高さ 32K ピクセル、高さ 1000 ピクセル以上の画像が深刻な問題なくメモリに読み込まれることに驚いています。あなたの現在のアイデアは、Scrollbox の制限 (この質問に答えた他の人によってよく説明されています) によって制限されるだけでなく、(非常に大きな画像の場合) 理想的ではない GDI の画像処理機能によって制限されます。

好むと好まざるとにかかわらず、自分で作成するか、delphi 用の画像ビューアを使用してください。リンク先のページでは、Ahmoy Law による Image Visualizer for Delphi v.1.00.00 が良さそうです。

于 2011-12-28T18:22:35.513 に答える