2011-12-28 5 views
-1

Delphi 4에서 TscrollBox 컨트롤 내에서 TImage 컨트롤을 사용하고 있습니다. 여기에 따라 높이를 늘려 TImage 컨트롤의 데이터를 채 웁니다.TImage 컨트롤 제한을 극복하십시오.

내 기능은 X, Y 매개 변수를 사용하여 해당 레코드를 강조 표시하여 유효성을 검사하는 mousedown 이벤트를 기반으로합니다.

X, Y는 정수형 매개 변수이며 -32768에서 32767 사이의 값을 반환합니다. 내 레코드가 32767 높이를 초과 할 때 문제가 발생합니다. Mousedown 이벤트가 Y 값을 음수로 반환하면 내 기능에 문제가 발생합니다.

이 문제를 해결하려면 두 가지 방법이 있습니다,

  1. 어떤 해결 방법이 문제를 해결합니다.

  2. 델파이 4의 다른 내장 구성 요소를 대신 사용합니다.

아래에 언급 된 것처럼 하나의 더티 접근법 (이 경우도 올바르지 않지만 현재는 작동 중임)을 알고 있지만 더 나은 해결책을 찾고 있습니다.

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

는 마우스 좌표가 보통 WMMouseMove 메시지에서 파생 된

+0

때때로 두 개의 마우스 코드가 32 비트 int에 포장되어 있지 않습니까? 그렇다면 이것은 내재적입니다. –

+0

여기 간단한 테스트에서 스크롤 상자의 높이를 32767 이상으로 설정할 수 없습니다. 어떻게 할 수 있습니까? –

+0

32k x 32k 픽셀보다 큰 이미지를로드하는 중입니까? –

답변

1

이 문제에 더 나은 솔루션을 조언을 주시기 바랍니다,이 메시지에 대한 기록의 정의는 다음과 같다 :

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 개의 작은 값으로 채 웁니다. 문제가 해결되지 않습니다.

GetCursorPos는 두 개의 Int32가있는 TPoint 레코드를 제공하지만이 기능은 컨트롤에서 사용하는 기능이 아니므로이 기능을 사용하지 않아도됩니다.

+1

GetCursorPos는 비동기이기 때문에 옳지 않습니다. GetMessagePos가 적절하지만 16 비트 코드로 제한됩니다. –

+0

이 기능을 사용자 정의 할 수있는 방법이 있습니까? – Dev

+0

@Nilesh, 아니요, Windows 메시지가 돌로 처리되지 않습니다. – Johan

1

해결 방법 중 세 번째가 있습니다. Scrollbox 사용을 중단하고, 사용자가 지정한 X, Y 좌표에서 이미지의 일부를 렌더링 할 수있는 자체 스크롤 막대 핸들을 사용하여 자체 컨트롤을 작성하십시오. 사실 당신이 작성한 간단한 TControl 기반 구성 요소에 스크롤 막대를 추가하여이를 수행 할 수 있습니다. Delphi에서 내장 컨트롤을 사용하기를 원한다면 실제로 희미한 일을 할 것입니다. 자신의 컨트롤을 작성하는 것은 몇 줄의 코드에서 수행 할 수 있으며, 타사 컨트롤을 사용하지 않으려는 경우 올바른 대답입니다.

두 번째 대안은, 실제로 델파이 개발자 중 99 %가 선택하는 솔루션은 이미이 기능을 갖춘 타사 이미지 뷰어 컨트롤로 전환하는 것입니다. 분명히, 바퀴를 재발 명하는 지점이 없다. 귀하의 질문에 제 3 자 컨트롤을 추가 할 수 없다고 명시되어있는 것 같습니다.

Scrollboxes + TImage는 특히 그림을 포함하기 위해 거대한 이미지를 전체적으로 GDI 메모리로로드해야하는 경우 성능 측면에서 끔찍한 솔루션입니다. 저는 32K 픽셀 높이의 1000+ 픽셀 고화질 이미지가 심각한 문제없이 메모리에로드되는 것에 놀랐습니다. 현재의 아이디어는 Scrollbox의 제한 사항 (이 질문에 답한 다른 사람이 잘 설명 했음)으로 인해 제한받지 않을뿐만 아니라 GDI의 이미지 처리 기능에 의해 제한됩니다 (매우 큰 이미지의 경우).

마음에 드시 든간에 직접 작성 하시거나 image viewer for delphi을 사용하십시오. 연결된 페이지에서 Image Visualizer for Delphi v.1.00.Ahmoy Law의 00은 나에게 잘 어울립니다.