¿Alguien conoce la manera de hacer que un TPanel creado en tiempo de ejecución se autoajuste a la dimensión de su Caption?
Gracias,

Saludos
 
	 
					
				
				
				
					
				
			
				
			Escrito 12 febrero 2015 - 12:31

 
					
				
				
				
					
				
			
				
			Escrito 13 febrero 2015 - 03:36
Panel1.Width:= self.Canvas.TextExtent(Panel1.Caption).cx + 20;
Self.Font.Name:= Panel1.Font.Name;
Self.Font.Size:= Panel1.Font.Size;
Self.Font.Style:= Panel1.Font.Style;
Panel1.Width:= self.Canvas.TextExtent(Panel1.Caption).cx + 20;
 
					
				
				
				
					
				
			
				
			Escrito 13 febrero 2015 - 07:39
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TPanel = class(ExtCtrls.TPanel)
protected
function CanAutoSize(var NewWidth, NewHeight: Integer): Boolean; override;
end;
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TPanel.CanAutoSize(var NewWidth, NewHeight: Integer): Boolean;
var
S: TSize;
begin
Result:= inherited CanAutoSize(NewWidth, NewHeight);
S:= Canvas.TextExtent(Caption);
if NewWidth < S.cx then NewWidth:= S.cx + (BorderWidth+BevelWidth)*2 + 2;
if NewHeight< S.cy then NewHeight:= S.cy + (BorderWidth+BevelWidth)*2;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Panel1.AutoSize:= true;
end;
end.
 
					
				
				
				
					
				
			
				
			Escrito 13 febrero 2015 - 12:41


Supongo que funcionará la propiedad Align, pienso usarla con alLeft y márgenes.El +20 es por dejar un poco de margen solamente.
 
					
					 
					
				
				
				
					
				
			
				
			Escrito 13 febrero 2015 - 01:18
Funciona en el contexto del Canvas que la llama, incluido su tipo de fuente ya definido en él. En este caso debes usar el Canvas del TPanel.esa función supongo que trabaja "sobre" GetTextExtent y tendrá en cuenta el contexto de dispositivo de ese panel y por ende la tipografía del mismo, etc.
El ejemplo que puse es una clase derivada que sustituye a la original TPanel en la unit donde la uses. También probé creando dináminamente TPanels.Ahora tengo que adecuarlo a la creación dinámica de TPanels, que irán dentro de un arreglo dinámico
 
					
				
				
				
					
				
			
				
			Escrito 16 febrero 2015 - 02:12

procedure TfrmCajaReg.ActualizarInfoEntrada;
var
I, N: Integer;
begin
N:= ListaCadBusq.Count;
case TE of
Busq:
begin
I:= 0;
SetLength(panArr, N * SizeOf(TPanel));
while I < N do
begin
panArr[I]:= TPanel.Create(Self);
with panArr[I] do
begin
Caption:= ListaCadBusq.Strings[N-I-1];
Parent:= panAjusteInfoText;
Width:= Canvas.TextExtent(ListaCadBusq.Strings[N-I-1]).cx + 10;
Align:= alLeft; // Esta línea antes figuraba al principio
Alignment:= taCenter;
end;
I:= I+1;
end;
end;
end;
end;

 
					
					 
					
				
				
				
					
				
			
				
			Escrito 16 febrero 2015 - 02:31
