¿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