Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-01-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Lightbulb Fórmulas químicas con Delphi

Hola,
Una consulta, esto me está pasando por novato, ¿Como puedo colocar un texto por código en un PaintBox, donde cada letra (casi) vienen o responden a un cálculo, y además colocar con diferentes TOPs?

Bueno, lo que sucede es que por ejemplo quise emplear el uso de Labels en un principio, para cada uno, pero me complicaba cuando el texto a escribir era " " (nada) y aún así Delphi me dejaba un cierto espacio. Lo que requiero es que el texto salga UNIDO y sin espacios.

Verán por ejemplo necesito mostrar (después de un cálculo) (como ejemplo) fórmulas químicas:
K-2-S-O-4, Fe-''-Te-O-3, Na-''-Cl-O-'', Hice a propósito la separación con guiones para que se me entienda, pues en realidad no puedo mostrar en este post SUBÍNDICES de: K2SO4, FeTeO3 Y NaClO, notarán que en algunos no existe letras (Subíndices) y en otros el Símbolo es de dos letras (Na, Fe) a diferencia de Potasio=K.

Mi pregunta para el Foro no es "La Química", es ¿Como colocar en un PaintBox esos textos donde cada letra "K", "Fe", "Te", etc (cada uno) que vienen de un cierto cálculo, y además mostrar nítidamente los subíndices que también vienen de otro cálculo, pero colocarlo en el PaintBox con diferente TOP y se note como subíndice?

Gracias, estaré atento a vuestras sugerencias.
Un Saludo.
Responder Con Cita
  #2  
Antiguo 15-01-2006
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 20
[Gunman] Va por buen camino
No he entendido muy bien tu problema con los labels... Podrías explicarte mejor?
__________________
l2prog.co.nr
Responder Con Cita
  #3  
Antiguo 16-01-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
En este hilo tienes algo simple:
http://www.clubdelphi.com/foros/show...near#post65920

En este otro un componente algo más sofisticado, el richview, yo uso la version gratis del mismo, aunque ahora no puedo decirte si acepta subindices superindices. http://es.trichview.com/

Otra opción sería pintar en un paintbox con cierta delicadeza.... ,me explico:

Supongamos que tienes un paintbox con un alto de 60, empiezas a escribir a una altura de 40, si necesitas un subindices, continuas en la coordenada 55,dandóle a la fuente un tamaño menor, y ya tienes el subindice.

Creo que con un simple Textout no puedes hacer el tamaño de letra más pequeña, pero puedes valerte de esto:
Código Delphi [-]

    canvas.Font.Assign(Fuente); 
   // la fuente con un tamaño menor
  // para el subindice 

  canvas.Textout(Texto);
No lo he probado, pero creo que podría llegarse a algo con esto.
Por supuesto necesitas un canvas, ahora no recuerdo si el Paintbox lo tiene, supongo que si, sino... pues quizás el Tscrollbox u otro componente.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #4  
Antiguo 16-01-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Pues si se puede hacer:
Código Delphi [-]
procedure TForm1.TheMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  var Fsub,tmp:TFont;

  procedure PintaFormula(const str:string; Fnormal, Fsubindice:TFont; C:Tcanvas);
  var Xpixel, i:Integer;

  begin
    Xpixel := 10;
    for i:=1 to Length(str) do
    begin
      if str[i] in ['0'..'9'] then
      begin
        C.Font.Assign(Fsubindice); // si es un número, lo tomo por subindice (no he visto formulas con superindece)
        C.TextOut(Xpixel,30,str[i]); //(pinto en la coordenada Y = 30, para que se vea más abajo y parezca un subindice
      end
      else
      begin
        C.Font.Assign(Fnormal); // es una letra, así que restauro la fuente del Tcanvas
        C.TextOut(Xpixel,20,str[i]); // pinto en la coordenada Y = 20 que es la normal
      end;
      Xpixel := Xpixel + C.TextWidth(str[i]); // guardo la coordenada X, la del siguiente carácter.
    end;
  end;
begin
  Fsub := TFont.Create; // creo una fuente para los subindices
  tmp := TFont.Create; // fuente del paintbox;
  tmp.Assign(PaintBox1.Canvas.Font);
  PaintBox1.Font.Size:= 12; 
  // le tengo que poner 12, porque la fuente que elegí tenía como tamaño mínimo
 // 8 por tanto, despues no deja decrementar la fuente

  Fsub.Assign(PaintBox1.Font);
  Fsub.Size:= Fsub.Size -2; // tamaño de subindice 2 puntos menor a la normal

  PintaFormula('K2SO4',tmp,Fsub,PaintBox1.Canvas);

 tmp.Free; // libero las fuentes
 Fsub.Free;
end;

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 16-01-2006 a las 12:15:27.
Responder Con Cita
  #5  
Antiguo 16-01-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Gracias Lepe!,
vuestras sugerencias los revisaré llegando a casa, estoy en un Cibercafe.

Para Gunman:

Hable de los Labels Unidos inicialmente para mostrar la FORMULA QUIMICA (digamos SALES). Realizo el cálculo de los subíndices, y le digo al programa si viene o no con paréntesis? o sea, por dar un par de ejemplos: K2SO4 (sin paréntesis) Fe2(SO4)3 (con paréntesis).

Pero si volvemos a observar, por ejemplo en 'Fe2(SO4)3' los subíndices 2 y 3 NO SE VEN COMO SUBÍNDICES, y los paréntesis COMO que NO ESTÁN AL MEDIO. Por ello necesitaba dibujar cada Label ADYACENTE (unidos) cada uno pero con diferentes TOP. Ejemplo, después del cálculo para Fe2(SO4)3:

- Primero alineo todos los TOP = 100 (a uno mismo)

//E = Elemento, s1 = 1er subíndice, r1 = Radical, s2 = 2do subíndice, y s3 = 3er subíndice

Label1.Caption:=E; Label1.left:= 50; //Elemento='Fe'
Label2.Caption:=s1; Label2.left:= Label1.Left+Label1.width;
Label2.Top:=110; //como subíndice(mas abajo)='2'

Label3.Caption:='('; Label3.left:= Label2.Left+Label2.width;
Label3.Top:=103; //mas abajito

Label4.Caption:=r1; Label4.left:= Label3.Left+Label3.width; //Radical='SO'

Label5.Caption:=s2; Label5.left:= Label4.Left+Label4.width;
Label5.Top:=110; //como subíndice(mas abajo)='4'

Label6.Caption:=')'; Label6.left:= Label5.Left+Label5.width;
Label6.Top:=103; //mas abajito

Label7.Caption:=s3; Label7.left:= Label6.Left+Label6.width;
Label7.Top:=110; //como subíndice(mas abajo)='3'

Esa era la idea, eso de los Left y Top, estoy adivinando ya que en este momento no tengo Delphi a mano, el mismo código lo estoy sacando de la cabeza a recordatorio por si notan errores.

La situación es que cuando el programa calcule OTRO, por ejemplo para K2SO4, no existe paréntesis ni "algunos" subíndices, entonces tendré que indicarle:

Label3.Width:=0;
Label6.Width:=0;
Label7.Width:=0;

Ya que si coloco = ' ' (nada) Delphi aún así me coloca un cierto ancho para mostrame los Labels.
¡Todo bien pero............. al volver digamos a calcular el mismo: Fe2(SO4)3 Ya no me muestra los Labels '(' , ')' y '3' obvio porque anteriormente Width los puse a = 0 (cero) verdad?.

De ahí nació mi pregunta en el Foro de como solucionar esta situación, por lo que crei conveniente mejor mostrar en un PaintBox.

Revisaré el ejemplo de Lepe, aunque mi experiencia como novato no me queda claro todavía.
¿Alguna otra sugerencia?
Gracias.
Responder Con Cita
  #6  
Antiguo 16-01-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Deiv no tendrás problema, el código lo he compilado en Delphi 6 y no uso rutinas raras.

Simplemente coloca ese trozo de código en una ventana que tenga un paintbox1. A continuación pulsa CTRL + SHIFT + C, para que delphi autocomplete la clase.

despues al evento OnMouseDown de la ventana le añades el evento TheMouseDown.

hecho, al hacer clic en la ventana, fuera del paintbox, se pintará el K2SO4 con subindices.

Básicamente el código ese, lo que hace es partir de dos fuentes distintas, una usada para escribir las letras y parentesis (Fnormal) y otra para escribir los subíndices(Fsubindice), solo se diferencian en el tamaño de la letra.

Se analiza la tira de caracteres y si es un número, se usa la fuente de Subindices, además de ponerlo un poco más abajo....igual que haces tú con el top de los labels, yo lo hago mediante la coordenada Y = 20, Y = 30.

Esto se hace con cada letra, así que ha de tenerse en cuenta que vamos avanzando una letra cada vez, para que la siguiente letra no se pinte encima de la anterior; esto se hace a través de la variable Xpixel.

Si necesitas algo más, dinoslo

saludos
__________________
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 17-01-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Thumbs up

Lepe,
He probado tu código y funciona de maravilla,
solo un par de preguntas más por favor, para mis pobres conocimientos no puedo deducir donde está el problema en:
1.- Ya sea tal como me enviaste: TForm1.FormMouseDown(..), ya sea que el código le coloco en un Button: TForm1.Button1Click(..), ¿no sé por qué razón responde SOLO al DOBLE CLICK? y no a UNO.
2.- Y si hago un tercer click este me vuelve a dibujar otro y se sobrepone cual si fuera un label con sombra.
¿A que se debe todo ello?
Un saludo
Responder Con Cita
  #8  
Antiguo 17-01-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Tienes razón debía haber posteado el código para un botón, pero no le dí importancia, usé un programa que tenía hecho, y el evento que más corage me dió fuel el mouseDown.

Quizás sin querer estes usando el evento DblClick del botón, que es el de doble clic, fijate porque la diferencia en el nombre es mínima.

En cuanto a la sombra, antes de llamar a PintaFormula puedes añadirle: Paintbox1.Repaint;


Ese efecto es normal. El Paintbox es un control para dibujar, pero cuando se necesite redibujar el control, por ejemplo, si pasas una ventana delante del explorador de windows por encima de tu programa, verás que el paintbox se borra, y la formula que había puede quedar parcialmente borrada.

Lo que quiero decir, es que en el evento del PaintBox OnPaint, tienes que llamar a todo el código ese, para que se dibuje la fórmula cada vez que se tenga que redibujar el paintbox.

Windows debe redibujar una ventana o los controles que tenga dentro, muy frecuentemente, y como no sabe lo que hay pintado en el PaintBox, debes decirselo tú, y redibujarlo a mano llamando a esa rutina.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 17-01-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Smile

Hola,

Creo que me expliqué mal, ya que no quise decir doble click, sino que al hacer un solo click con el evento TForm1.Button1Click(..) no funciona, y solamente repitiendo (volviendo hacer un nuevo click) recién me muestra la fórmula. En otras palabras en el primer click no me responde, en el segundo sí ¿por qué?

Estoy utilizando Delphi 7, tendrá algo que ver?

Lo de la sombra lo probaré en cuanto llegue a casa, pero esta aparece después de mi tercer click, es decir: 1er click=nada, segundo click=fórmula, 3er click=con especie de sombra o montado mas abajo.

Un saludo
Responder Con Cita
  #10  
Antiguo 19-01-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
acabo de ver un pequeño error relacionado con la sombra que comentas:

Código Delphi [-]
  Fsub := TFont.Create;
  tmp := TFont.Create;

  PaintBox1.Canvas.Font.Size:= 12;
  tmp.Assign(PaintBox1.Canvas.Font);

  with PaintBox1.Canvas do
   FillRect(Rect(0,0,Width,Height));

  Fsub.Assign(PaintBox1.Canvas.Font);
  Fsub.Size:= Fsub.Size -2;

  PintaFormula('K2SO4',tmp,Fsub,PaintBox1.Canvas);

 tmp.Free;
 Fsub.Free;

El tema está en que cambiaba la fuente del Paintbox, cuando en realidad quería cambiar la fuente del Paintbox1.canvas

De ahí que no lo hiciera bien.

En cuanto a los 3 clics de ratón ... ni idea, acabo de probarlo y me funciona correctamente desde un botón.

Al evento Paint del Paintbox1, asignale tambien el evento del botón, con eso, siempre que haga falta repintarlo, se pondrá la formula, digamos que sería como un Label, algo persistente.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #11  
Antiguo 20-01-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Question

Claro, no era sombra, sino que se sobreescribía cambiando el tamaño de la fuente (DISMINUÍA), estuve revisando el código (con los ARREGLOS), interesante forma de trabajar tiene, ahora por ejemplo:

- 1er click = COMO SIEMPRE no muestra NADA,
- 2do click = RECIÉN Muestra la Fórmula,
- 3er click = Se DISMINUYE el TAMAÑO de la FUENTE del PaintBox (LETRAS) - Esta es la NOVEDAD!!

- 1er click = Al parecer la Procedure PintaFormula() no trabaja la primera vez, y solo en el segundo click funciona.

Me pasé varios minutos buscando el error, y solo al cambiar el tamaño en:

PaintBox1.Font.Size:= 8;

- 1er click= ¡¡HURRA!! al fin muestra la Fórmula, al 1er click,
- 2do click= No pasa nada, todo OK.
- 3er click= Todo OK.

Aunque encontré el error, PERO NO SÉ EXPLICARLO, es que en las Propiedades de mi PaintBox la Fuente-Size estaba en = 8 y no coordinaba me parece lo que por código se escribía: PaintBox1.Font.Size:= 12; cuando igualé el tamaño de la fuente en la propiedad con el código, FUNCIONA AL PRIMER CLICK. En resumen si igualo el tamaño de las propiedades con el tamaño por código, a cualquier tamaño que fuere responde al primer click.

Ahora solamente me queda averiguar, haber si me dais una mano, ¿por qué ahora al 2do click se disminuye (cambia) el tamaño de la Fuente del PaintBox (LETRAS) o lo que sería para el programa los símbolos químicos?. Como inicialmente mencioné si igualo las propiedades del Size=8 no tengo ninguno de los problemas con los click (pareciera que tengo que estar supeditado a la fuente=8???) . Interesante....
Saluditos
Responder Con Cita
  #12  
Antiguo 21-01-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Obviamente no has comprendido mi último mensaje.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #13  
Antiguo 21-01-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Wink

Código Delphi [-]
 PaintBox1.Font.Size:= 12; 
// le tengo que poner 12, porque la fuente que elegí tenía como tamaño mínimo
// 8 por tanto, despues no deja decrementar la fuente
......... donde tenía el tamaño mínimo???

Cita:
El tema está en que cambiaba la fuente del Paintbox, cuando en realidad quería cambiar la fuente del Paintbox1.canvas
Sigo experimentando, ya parezco Laboratorio tanto hablar de quimica.....
Responder Con Cita
  #14  
Antiguo 25-01-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
....................................
Responder Con Cita
  #15  
Antiguo 26-01-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
A este proyecto que envio en fichero adjunto, no le veo ningun fallo, y todo se hace por código.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 10-10-2007 a las 20:58:14.
Responder Con Cita
  #16  
Antiguo 29-01-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Smile Gracias

Lepe, encontré el error y es que como enviaste 2 post con el código:
Código Delphi [-]
tmp.Assign(PaintBox1.Canvas.Font);
PaintBox1.Font.Size:= 12; 
Fsub.Assign(PaintBox1.Font);
Fsub.Size:= Fsub.Size -2;

Era un juego visual, pues en aquel estaba primero tmp, luego PaintBox, en el segundo de abajo estaba al revés por lo que obvie esa parte
Código Delphi [-]
PaintBox1.Canvas.Font.Size:= 12; //ERROR, YO LO TENÍA = PaintBox1.Font.Size
tmp.Assign(PaintBox1.Canvas.Font);
with PaintBox1.Canvas do
    FillRect(Rect(0,0,Width,Height));
Fsub.Assign(PaintBox1.Canvas.Font);
Fsub.Size:= Fsub.Size -2;
Ese error me achicaba las letras, y no me dejaba pintarlo al primer click.
FIN DE ESTE HILO.
Thanks Lepe
Saludos
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Forever Loyal to Delphi Delfino Noticias 1 24-12-2005 13:31:04
Formulas en Delphi Fita Varios 1 05-11-2005 00:23:22
La increíble tecla F1 en Delphi dec Varios 1 31-08-2005 22:26:45
Novedades en Delphi 2005 Al González Noticias 12 04-12-2004 03:46:02
¿Cual es el futuro de Delphi? Voutarks Debates 33 13-04-2004 19:29:08


La franja horaria es GMT +2. Ahora son las 05:05:12.


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