![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
|
Ajustar un Form al ancho de un texto
Hola y gracias por adelantado
![]() Estoy intentando ajustar un Form a la línea más larga de un TListBox y después de estrujarme el "coco" ya no sé si cortarme las venas o dejármelas crecer ![]() Lo intento en el evento OnShow del form tal que así Código:
var
i : integer;
w : integer;
begin
w := 0;
for i:=0 to Lista.Items.Count-1 do
if( Lista.Canvas.TextWidth(Lista.Items[i])>w ) then
w := Lista.Canvas.TextWidth(Lista.Items[i]);
Form1.Width := w;
end;
¿Donde estoy metiendo la pata???????? Lo dicho, agradecido por la ayuda que podais prestarme Nota: Antes de que me echeis la bronca, que conste que me he leido el foro de cabo a rabo, con búsquedas, a pelo y sigo como entré (ni repajolera idea) |
|
#2
|
||||
|
||||
|
te has olvidado de los bordes... de los de la forma, y de los del listbox...
Has de hacer: Form1.ClientWidth := w + Unos5o10PixelsPorElBordeDelList; Hasta luego ![]()
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
|
#3
|
||||
|
||||
|
Gracias por responder tan rápido
![]() Lo del borde ya lo sé, pero como de todas formas se come casi un cuarto del texto, no nos vamos a pegar por 10 ó 12 pixels de nada ![]() No se te ocurre nada? Dicen que cuatro ojos ven más que dos, ¿donde me estoy colando? Abrazotes Salvador |
|
#4
|
||||
|
||||
|
en que versión de delphi estas trabajando???
Yo acabo de hacerlo en mi ya desempolvado delphi4, y con 12 pixels funciona de maravilla!
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
|
#5
|
||||
|
||||
|
Hola jachguate, buenas noches-madrugadas desde Albacete
Estoy utilizando Delphi-7 porque quiero pasar los trabajos que tengo en la 3 a Kylix y aún no he instalado Linux, asi que como verás el salto es olímpico En Delphi-3 siempre he utilizado esa forma de ajustar los Forms y funcionaba ¿? El trabajo consiste en visualizar la respuesta de una query a un servidor mySql y que el usuario escoja entre una de los textos que devolvió el servidor, pero siempre se me queda unos dos cetímetros corto (utilizo un monitor de 19 pulgadas a 1024x800) y quiero que se vea en otros con menos resolución, por lo que he de ajustar el forma de salida en tiempo de ejecución Gracias, voy a probar a utilizar la propiedad ClientWidth del TListBox para ver si funciona |
|
#6
|
||||
|
||||
|
Pues yo hice la prueba original en delphi4, pero ahora la he compilado en delphi7 y funciona perfectamente...
La resolución del monitor no creo que tenga nada que ver... por si las dudas, yo uso 1280x1024. el código:
Hasta luego. ![]() |
|
#7
|
||||
|
||||
|
solo he de resaltar que este código, en caso de estar vacio el ListBox, reducirá la forma a "invisible"...
![]() Hasta luego, y buenas noches, en Guatemala, buenos dias en Albacete ![]() ![]() |
|
#8
|
||||
|
||||
|
Lo más gracioso del caso, es que en el evento OnShow le he puesto que me escriba en una etiqueta y me dá un ancho de línea de 651, mientras que en el evento OnDrawItem del TListBox le he puesto otra y me dá lineas con 744 y 780
¿porqué esta diferencia? ¿Donde debo calcular el ancho de línea, antes de visualizar el Form o al "repintar" el TListBox? |
|
#9
|
||||
|
||||
|
Cita:
Hasta luego. ![]()
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
|
#10
|
||||
|
||||
|
Haber si soy capaz de explicarlo sin ocupar más de 500.000 líneas
![]() Tengo un form principal en el que le meto una clave y llama a un segundo form (con ShowModal) que con la clave del anterior hace una consulta a un servidor de mySql, el cual responde con una serie de registros que almaceno en un TListBox (hasta aqui todo funciona) Este es el código del form principal Código:
Application.CreateForm(TWin_GetNubes, Win_GetNubes); with Win_GetNubes do begin if( Alias='BAJAS' ) then CLV_GRUPO := '001' else if( Alias='MEDIAS' ) then CLV_GRUPO := '002' else CLV_GRUPO := '003'; GroupBox_TABLA.Caption := ' TIPOS DE NUBES ' + Alias + ' '; ShowModal; Free; end; // del with Este es el código del for problematico Código:
procedure TWin_GetNubes.Form_OnShow(Sender: TObject);
var
Activo : integer;
Ancho : integer;
Cadena : string;
begin
Ancho := 0;
with Query_NUBES do begin
SQL.Clear;
SQL.Add( 'SELECT * FROM nubes WHERE grupo=''' + CLV_GRUPO + '''');
SQL.Add( ' AND orden<''100''');
SQL.Add( ' ORDER BY orden;' );
Open;
if IsEmpty then begin
{no hacer nada}
end else begin
First;
Activo := -1;
while not eof do begin
Cadena := FieldByName('NOTAS' ).AsString;
if( ListBox_NOTAS.Canvas.TextWidth(Cadena)>Ancho )
then Ancho := ListBox_NOTAS.Canvas.TextWidth(Cadena);
ListBox_GRUPO.Items.Add( FieldByName('GRUPO').AsString );
ListBox_ORDEN.Items.Add( FieldByName('ORDEN').AsString );
ListBox_CLV_SYNOP.Items.Add( FieldByName('CLV_SYNOP').AsString );
ListBox_CLV_METAR.Items.Add( FieldByName('CLV_METAR').AsString );
ListBox_CLV_TCU.Items.Add( FieldByName('CLV_TCU').AsString );
ListBox_NOTAS.Items.Add( Cadena );
if( FieldByName('ORDEN').AsString=CLV_ORDEN )
then Activo := ListBox_ORDEN.Items.Count-1;
Next;
end;
GroupBox_TABLA.Height := (ListBox_NOTAS.Items.Count*(ListBox_NOTAS.ItemHeight+2));
Win_GetNubes.ClientWidth := Ancho + ListBox_CLV_SYNOP.Width + 32;
Win_GetNubes.Height := Panel_SUPERIOR.Height + Panel_SEPARADOR_1.Height + GroupBox_TABLA.Height + Panel_INFERIOR.Height;
Panel_BOTONES.Left := (Win_GetNubes.Width-Panel_BOTONES.Width) div 2;
{ activar las listas }
ListBox_GRUPO.ItemIndex := Activo;
ListBox_ORDEN.ItemIndex := Activo;
ListBox_CLV_SYNOP.ItemIndex := Activo;
ListBox_CLV_METAR.ItemIndex := Activo;
ListBox_CLV_TCU.ItemIndex := Activo;
ListBox_NOTAS.ItemIndex := Activo;
ListBox_CLV_SYNOP.SetFocus;
end;
end;
Win_GetNubes.Caption := '['+IntToStr( Ancho )+']';
Win_GetNubes.Activate;
end;
![]() Haber si te vale de algo |
|
#11
|
||||
|
||||
|
Cita:
hay que ponerlo en el evento OnDrawItem del TListBox (o sea al "repintarlo") y sumarle 15 del borde ![]() Gracias a todos, teneis pagado un carajillo en el bar de la esquina ![]() Son la 04:00 (locales) en Albacete y parece que la cosa funciona Os pongo el código por ai a algún otro le vale ![]() Código:
{$R *.xfm}
var
WIN_ANCHO : integer; // global al form, inicializar a CERO en el OnCreate
procedure TForm1.ListBox_OnDrawItem(Sender: TObject;
Index: Integer; Rect: TRect; State: TOwnerDrawState;
var Handled: Boolean);
var
newArea : TRect; // para que pinte el área completa
oldStyle : TFontStyles; // el estilo de la fuente del TListBox
begin
newArea.Left := 0;
newArea.Top := 0;
newArea.Right := Rect.Right + 1;
newArea.Bottom := Rect.Bottom + 1;
with (Sender as TListBox).Canvas do begin
oldStyle := Font.Style;
Font.Style := [fsBold];
if( TextWidth((Sender as TListBox).Items[Index])>WIN_ANCHO ) then begin
WIN_ANCHO := TextWidth((Sender as TListBox).Items[Index]);
Win_GetNubes.ClientWidth := WIN_ANCHO + 15;
end;
Font.Style := oldStyle;
if( (odSelected in State) or (odFocused in State) )
then Font.Style := [fsBold] // seleccionado o con el fofo, a negrita
else Font.Style := []; // texto normal
FillRect( newArea );
TextOut( Rect.Left, Rect.Top, (Sender as TListBox).Items[Index] );
end;
end;
Lo dicho, agradecido por el tiempo perdido |
![]() |
|
|
|