Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-05-2004
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
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;
Siempre se me queda corto (y eso que aún no he intentado cambiar las fuentes, el estilo ni nada)

¿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)
Responder Con Cita
  #2  
Antiguo 01-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 01-05-2004
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 01-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 01-05-2004
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 01-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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:

Código Delphi [-]
procedure TForm1.Ajustar;
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]);
  ClientWidth := w + 12;
end;

Hasta luego.

Responder Con Cita
  #7  
Antiguo 01-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

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

Responder Con Cita
  #8  
Antiguo 01-05-2004
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
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?
Responder Con Cita
  #9  
Antiguo 01-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Cita:
Empezado por salvica
¿Donde debo calcular el ancho de línea, antes de visualizar el Form o al "repintar" el TListBox?
Eso depende de cómo estes llenando el listbox. Si este está lleno en tiempo de diseño, o se llena antes de mostrar la forma, el evento OnShow es el adecuado.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 01-05-2004
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
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
El problema viene, que al visualizar el form, este no se ajusta al texto máximo del TListBox (para que se vea toda la línea)

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;
Todos los TListBox están sincronizados y responden al teclado, solo eso... que no se vé el texto completo

Haber si te vale de algo
Responder Con Cita
  #11  
Antiguo 01-05-2004
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Cita:
Empezado por jachguate
Eso depende de cómo estes llenando el listbox. Si este está lleno en tiempo de diseño, o se llena antes de mostrar la forma, el evento OnShow es el adecuado.
Bueno, pues parece ser que no 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;
Alguien puede indicarme un manual sobre el orden de los eventos en los controles?

Lo dicho, agradecido por el tiempo perdido
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 11:47:29.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi