2011-12-28 13 views
-1

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

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

ここで、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; 

+0

両方のマウスコードが32ビット整数にパックされることはありませんか?もしそうなら、これは固有のものです。 –

+0

ここでの簡単なテストでは、スクロールボックスの高さを32767以上に設定できません。どうすればいいですか? –

+0

32k x 32kピクセル以上の画像を読み込んでいませんか? –

答えて

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つのsmallintsの座標をパック、あなたの問題を回避する方法はありません。

GetCursorPosは、2つのInt32を持つTPointレコードを提供しますが、これはコントロールが使用する関数ではないため、この点は恩恵を受けません。

+1

GetCursorPosは非同期なので、とにかく正しいことではありません。 GetMessagePosは適切かもしれませんが、16ビットのコードにも制限されています。 –

+0

この機能をカスタマイズする方法はありますか? – Dev

+0

@Nilesh、Windowsのメッセージは石で投げられません。 – Johan

1

解決方法は3つあります。スクロールボックスの使用を中止し、指定されたX、Y座標で画像の一部をレンダリングできる独自のスクロールバーハンドルを使用して独自のコントロールを作成します。実際には、スクロールバーをあなたが書いた単純なTControlベースのコンポーネントに追加することでこれを行うことができます。 Delphiで組み込みのコントロールを使用することを主張する場合は、実際には何か微妙なことをするでしょう。独自のコントロールを書くことは、コードのいくつかの行で行うことができ、第三者のコントロールを使用したくない場合は正解です。

デルファイの開発者の99%が選択する第2の選択肢は、実際にはこの機能を持つサードパーティの画像ビューアコントロールに切り替えることです。明らかに、ホイールを再発明するポイントはありません。あなたの質問には、サードパーティのコントロールを追加できないと規定されているようです。

Scrollboxes + TImageは、特に画像を格納するために膨大な画像をGDIメモリに完全にロードする必要がある場合には、パフォーマンスの面で恐ろしいソリューションです。私は驚いていますが、重大な問題を起こすことなく32Kピクセルの高さ×1000ピクセルの高さの画像がメモリにロードされることにも驚いています。あなたの現在のアイデアはScrollboxの制限(この質問に答えた他の人がうまく説明している)によって制限されるだけでなく、GDIの画像処理機能によって制限されています。

あなたが好きかどうかにかかわらず、あなた自身で書くか、image viewer for delphiを使用してください。リンクされたページで、Image Visualizer for Delphi v.1.00。Ahmoy Lawの00は私にはよく見えます。

関連する問題