Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-05-2005
Avatar de FNADALO
FNADALO FNADALO is offline
Miembro
 
Registrado: oct 2003
Ubicación: Palma de Mallorca
Posts: 97
Poder: 21
FNADALO Va por buen camino
Question Ajuste del width de un objeto al maxlegth

Queridos compañeros
Estoy creando un objeto por código concretamente un DBEdit donde le estoy
pasando las propiedades que necesito el DataSource el DataField el Maxleng
pero al width quería ponerle el mismo tamaño que el maxlength se lo paso por código pero o me reduce el objeto o lo amplia demasiado, e calculado que
un caracter son 12 Pixel más o menos, y le pasaba al width la longitud del maxlenght * 12 espacios más o menos calculado, pero nada de nada, alguien
puede ayudarme. Gracias.
Responder Con Cita
  #2  
Antiguo 25-05-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Prueba esto:
Código Delphi [-]
Edit1.Width:=Canvas.TextWidth(Edit1.Text);

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 26-05-2005
Avatar de FNADALO
FNADALO FNADALO is offline
Miembro
 
Registrado: oct 2003
Ubicación: Palma de Mallorca
Posts: 97
Poder: 21
FNADALO Va por buen camino
Wink

Gracias Marcos efectivamente funciono pero recorta el ultimo caracter,
como sabia que más o menos un caracter son 12 Pixels, a lo que me pasastes
le sume 12 y Ok.
Responder Con Cita
  #4  
Antiguo 26-05-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
De donde has sacado que un caracter son 12 pixels? Porque si usas Courier New de tipo de letra... todo ok, pero en cuanto usas letras no proporcionales... adios el tema...

El código de Marcos funciona muy bien, teniendo en cuenta un detalle. En el código propuesto, estaría usando el Canvas de ¿?¿?¿?¿ se supone que de la ventana. Si el DBEdit tiene puesta una fuente distitnta a la de la ventana, por eso no te da el ancho exacto.

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 26-05-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
De momento se me ocurre esta pequeña chapuza para arreglar la posible diferencia en los tipos de letra:
Código Delphi [-]
 procedure TForm1.Button1Click(Sender: TObject);
 Var
 fName:String;
 fSize:Integer;
 begin
 fName:=Form1.Font.Name;
 fSize:=Form1.Font.Size;
 Form1.Font.Name:=Edit1.Font.Name;
 Form1.Font.Size:=Edit1.Font.Size;
 Edit1.Width:=Canvas.TextWidth(Edit1.Text);
 Form1.Font.Name:=fName;
 Form1.Font.Size:=fSize;
 end;
Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #6  
Antiguo 26-05-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Código Delphi [-]
function FontWidth(const Fuente:TFont;const Texto:string):Integer;
var c:TCanvas;
    h:HWND;
begin
  try
    c:= TCanvas.Create;
    c.Handle := GetDeviceContext(h);

    c.Font.Assign(Fuente);
    Result := c.TextWidth(Texto);
  finally
    FreeAndNil(c);
  end;
end;

function FontHeight(const Fuente:TFont;const Texto:string):Integer;
var c:TCanvas;
    h:HWND;
begin
  try
    c:= TCanvas.Create;
    c.Handle := GetDeviceContext(h);

    c.Font.Assign(Fuente);
    Result := c.TextHeight(Texto);
  finally
    FreeAndNil(c);
  end;
end;
El objeto de este codigo, es que ultimamente por los foros veo mucho esta misma pregunta, por supuesto, si tenemos la propiedad Canvas a mano, pues consultamos los métodos TextWidth y TextHeight.

Si no tenemos el canvas.... pues lo creamos nosotros y punto. La verdad, es excesivo crear un canvas, un handle y todos los recursos asociados para ver el tamaño de un string. Si se necesita para un string .... se llama a estas funciones y listo.

Si tenemos que hallar el ancho para varios strings, se debería crear el Canvas, el handle, hacer el bucle necesario comprobando el tamaño de todos los string que tenemos y despues liberar el canvas.

Es decir: No abusemos de estas rutinas, retocarlas y meterlas en vuestro código, llamar a estas funciones dentro de un bucle es EXCESIVO.

Queda claro no? Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 26-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Lepe
llamar a estas funciones dentro de un bucle es EXCESIVO.
Queda claro no?
¿Estás enojado?



Una observación:

Según entendí de la pregunta original, se require ajustar el ancho del DBEdit a la lóngitud máxima posible, misma que se especifica como parámetro. Es decir, que no se tiene disponible la cadena en sí que tiene la longitud máxima, de manera que TextWidth no funcionaría aquí, a menos que se sepa cuál es el caracter de mayor anchura y se forme una cadena de longitud máxima con dicho caracter.

Así que, una opción podría ser usar la función GetTextMetrics, aplicada a Canvas.Handle, para obtener una estructura TEXTMETRICS que es un registro uno de cuyos campos es tmMaxCharWidth que es el ancho del caracter más ancho de la fuente utilizada. Este valor se multiplicaría por la longitud máxima y el valor se asignaría a DBEdit.Width.

// Saludos
Responder Con Cita
  #8  
Antiguo 26-05-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Siendo un DbEdit conectado a un campo texto, sabemos de antemano cual es el máximo ancho que puede ocupar.
Código Delphi [-]
 Dbedit2.Field.Size;

Y por lo tanto al abrir el formulario podemos darle el máximo ancho al vuelo, y luego en el evento que convenga por ejemplo OnExit ajustarlo al ancho final del texto introducido.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #9  
Antiguo 26-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cierto Marcos, pero aún así hay que tener en cuenta el ancho físico de los caracteres. Es decir, no podemos simplemente poner

DBEdit.Width := DBEdit.Field.Size

ya que el lado izquierdo está medido en pixeles mientras que el lado derecho está medido en número de caracteres.

// Saludos
Responder Con Cita
  #10  
Antiguo 26-05-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Yo me refería a que hechos los cálculos oportunos y determinar cual es ancho de caracter que se está utilizando aplicarlo al crear el formulario, con las funciones antes indicadas.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
Respuesta



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 06:22:59.


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