2010-04-27 4 views
15

좋아, 여기에 문제가있다. 패널에 라벨 구성 요소가 있습니다. 레이블이 alClient로 정렬되어 있고 단어 랩을 사용할 수 있습니다. 텍스트는 한 줄에서 여러 줄까지 다양합니다. 모든 텍스트에 맞게 패널의 높이와 레이블의 크기를 다시 조정하고 싶습니다.TLabel에 필요한 크기를 계산하십시오

텍스트와 패널 너비를 알 때 레이블의 높이를 어떻게 얻습니까?

답변

15

당신은 tfCalcRect와 tfWordBreak 플래그와 함께 TCanvas.TextRect 방법을 사용할 수 있습니다

var 
    lRect : TRect; 
    lText : string; 

begin 
    lRect.Left := 0; 
    lRect.Right := myWidth; 
    lRect.Top := 0; 
    lRect.Bottom := 0; 

    lText := myLabel.Caption; 

    myLabel.Canvas.TextRect( 
      {var} lRect, //will be modified to fit the text dimensions 
      {var} lText, //not modified, unless you use the "tfModifyingString" flag 
      [tfCalcRect, tfWordBreak] //flags to say "compute text dimensions with line breaks" 
     ); 
    ASSERT(lRect.Top = 0); //this shouldn't have moved 
    myLabel.Height := lRect.Bottom; 
end; 

TCanvas.TextRect는 Windows API에서 DrawTextEx 함수에 대한 호출을 래핑합니다.

tfCalcRecttfWordBreak 플래그는 Windows API의 DT_CALCRECTDT_WORDBREAK 값에 대한 델파이 래퍼입니다. 당신은 당신이

label.width에 대한 한 줄의 코드를 사용할 수 있습니다 msdn

+4

TextRect 행 앞에 myLabel.Canvas.Font : = myLabel.Font를 추가해야합니다. –

2

alTop을 정렬하고 AutoSize를 유지하면 TLabel은 캡션을 설정 한 후 자동으로 높이를 조정합니다.

+0

이것은 실제로 작동하지 않거나 부분적으로 만 작동합니다. 어떤 이유로 든 라벨이 오른쪽에있는 텍스트를 자릅니다. 새 줄이있을 때 줄 바꿈 된 텍스트 만 표시합니다. 따라서 새로운 줄이없는 긴 텍스트가있는 경우에는 줄 바꿈을하지 않고 전체 텍스트를 볼 수 없습니다. – Asped

+0

@Asped이 기능은 Delphi XE2에서 올바르게 작동하는 것으로 보이며 올바르게 줄 바꿈을 자동으로 높이를 조정합니다. – Alister

10

TextWidth 및 TextHeight를 사용하십시오.

는 여기에 예를 참조하십시오 http://www.greatis.com/delphicb/tips/lib/fonts-widthheight.html

TextWidth 텍스트는 것이 얼마나 넓은 당신을 말할 것이다, 다음은 제어 폭에 의해 당신이 필요로 얼마나 많은 행 볼 것을 나눌 수 있습니다

. 나머지 부분은 추가 행이어야합니다.

+0

단어 랩을 사용하고 추가로 1 줄의 여분이 필요하면 이것이 잘못 될 수도 있습니다. –

+0

이것은 멋지므로 확인란이나 라디오 크기를 결정할 수 있습니까? 폰트와 컴포넌트의 크기가 변하는 것을 발견했습니다 ... 상자가 더 크거나 작다는 것을 의미합니다 ... –

3

DrawTextEx 문서에 미치는 영향에 대한 자세한 정보를 확인할 수 있습니다 = label.canvas.textwidth (label.caption);

또는 객체 검사기에서 label autosize 속성을 true로 사용할 수 있습니다.

+1

키를 다시 크기를 조정하려고합니다. –

관련 문제