8

Is there a way to wrap the text in a TPanel.Caption in Delphi (in my case Delphi 6)?

Ken White
  • 123,280
  • 14
  • 225
  • 444
wonderer
  • 3,487
  • 11
  • 49
  • 59

2 Answers2

11

Not by default, I'm afraid. As you can see from the sourcecode for TPanel, the text is drawn by the DrawText( )-windows API:

procedure TCustomPanel.Paint;
{snip}
begin
  {snip}
  Flags := DT_EXPANDTABS or DT_SINGLELINE or
    VerticalAlignments[FVerticalAlignment] or Alignments[FAlignment];
  Flags := DrawTextBiDiModeFlags(Flags);
  DrawText(Handle, PChar(Caption), -1, Rect, Flags);
end;

You can either derive and override the Paint-method, or you could just use a label instead.

Gabriel
  • 20,797
  • 27
  • 159
  • 293
Vegar
  • 12,828
  • 16
  • 85
  • 151
  • 7
    +1 for suggesting using a label. Just drop it inside the TPanel (if you want the borders) and set the anchors. – Bruce McGee Aug 13 '09 at 22:02
  • 1
    +1 for showing that many questions can be answered easily by just having a quick look at the VCL source code. – mghie Aug 14 '09 at 04:13
0

Here is code that actually works:

const
  Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER);
  VerticalAlignments: array[TVerticalAlignment] of Longint = (DT_TOP, DT_BOTTOM, DT_VCENTER);
var
  Rect: TRect;

   ... 
    
   if ShowCaption AND (Caption <> '') then
    begin
     Rect := GetClientRect;
     Canvas.Brush.Style := bsClear;
     Canvas.Font := Self.Font;
     Flags := DT_NOPREFIX OR
              DT_WORDBREAK OR
              VerticalAlignments[VerticalAlignment] OR
              Alignments[Alignment];
     Flags := DrawTextBiDiModeFlags(Flags);
     DrawText(Canvas.Handle, PChar(Caption), Length(Caption), Rect, Flags);
    end;
Gabriel
  • 20,797
  • 27
  • 159
  • 293