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 16-05-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Unhappy Labels ó TPaintBox ó TBitMap

Hola,
Estoy intentanto hacer el intercambio de valencias químicas en un óxido (cuando cruzan), no sé si voy por el camino correcto, pero lo estoy realizando con Labels: primero blinkan las valencias, luego estas se intercambian. Me preguntaba si se podía hacer en un TPaintBox, intenté y pareciera que estoy haciendo algo mal porque en el proceso del recorrido al intercambiarse se sobreponen borrando un elemento. ¿Cual sería el camino más correcto? No me hacía ningún problema con los Labels con ningún elemento, pero la pregunta surgió cuando tuve al Amoniaco como ejemplo (NH4) y ese subíndice "4" en los Labels me molestaba, en su caso debía crear "uno adicional" (como subíndice) dejando un espacio insulso para el resto de los elementos. Por lo que intententé como dije en un TPaintBox me era más fácil escribir subíndices con una procedure (gracias a la orientación de LEPE), pero ahora el problema está en el recorrido al intercambiar las valencias en el código se solapa el gráfico.

¿Alguien puede orientarme como soluciono esta operación en un TPaintBox? ¿Existe otra forma mas elegante de encarar estos procesos?

Código con Labels:
4 Labels con captions: a.caption:=Fe; b.caption:=O; Exp1.caption:=3; Exp2.caption:=2; (los 2 últimos más pequeños en Fuente para exponentes)
Timers en FALSE (100 de interval)


Código Delphi [-]
unit ConLabel;
Interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ExtCtrls, StdCtrls;
type
  TForm1 = class(TForm)
    a: TLabel;
    b: TLabel;
    Exp1: TLabel;
    Exp2: TLabel;
    Button1: TButton; //Dibuja los elementos y blinkan las valencias
    Button2: TButton;     //Hace recorrer (intercambiar) las valencias
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  parpadeo:boolean=false;
  i:integer=1;
  j:integer=1;
  FirstOne:boolean=false;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin //LLama al blinkado de valencias
  if FirstOne = false then
    begin
      Exp1.left:= 66;
      Exp1.Top:=31;
      Exp2.left:= 102;
      Exp2.top:=31;
      i:=0;     j:=0;
    end;
  timer2.Enabled:=false;
  Timer1.Enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin   //Blinkan las valencias
  if parpadeo then
     begin
        parpadeo:=False;
        Exp1.visible:=False;
        Exp2.visible:=False;
     end
  else
     begin
        parpadeo:=True;
        Exp1.visible:=True;
        Exp2.visible:=True;
     end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin  //Cruzan (se intercambian) las valencias
    Exp1.left:= Exp1.Left+i+4;
    Exp1.Top:=Exp1.top+i;
    Exp2.left:= Exp2.Left-(i+3);
    Exp2.top:=Exp2.top +i;
    i:=i+1;
    if i>5 then
    begin
      timer2.enabled:=false;
      Exp1.Visible:= True;
      Exp2.Visible:= True;
      firstone:=false;
    end
end;
procedure TForm1.Button2Click(Sender: TObject);
begin //LLama al cruce de valencias parando el blinkado
   timer1.Enabled:=false;
   Exp1.Visible:= True;
   Exp2.Visible:= True;
   timer2.Enabled:=true;
end;
end.







Código con TPaintBox:


Código Delphi [-]
unit ConPaint;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ExtCtrls, StdCtrls;
type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;      //Dibuja los elementos y blinkan las valencias
    Button2: TButton;      //Hace recorrer (intercambiar) las valencias
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  parpadeo:boolean=false;
  i:integer=0;
  j:integer=0;
  FirstOne:boolean=false;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin //Dibuja los elementos y LLama al blinkado de valencias
  if FirstOne = false then
    begin
      PaintBox1.Canvas.Font.Color:=clBtnface;
      PaintBox1.Canvas.TextOut(45+i,j+5,'3');
      PaintBox1.Canvas.TextOut(95-i,j+5,'2');
      i:=0;     j:=0;
    end;
  PaintBox1.Canvas.Font.Color:=clBlack;
  PaintBox1.Canvas.Font.Name:= 'Arial';
  PaintBox1.Canvas.Font.Size:=28;
  PaintBox1.Canvas.TextOut(10,20,'Fe');
  PaintBox1.Canvas.TextOut(65,20,'O');
  timer1.Enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin  //Blinkan las valencias
   PaintBox1.Canvas.Font.Size:=18;
   if parpadeo then
     begin
       parpadeo:=False;
       PaintBox1.Canvas.Font.Color:=clred;
     end
   else
     begin
       parpadeo:=True;
       PaintBox1.Canvas.Font.Color:=clBtnface;
     end;
   PaintBox1.Canvas.TextOut(45,5,'3');
   PaintBox1.Canvas.TextOut(95,5,'2');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin //LLama al cruce de valencias parando el blinkado
  if FirstOne = false then
    begin
      PaintBox1.Canvas.Font.Color:=clBtnface;
      PaintBox1.Canvas.TextOut(45+i,j+5,'3');
      PaintBox1.Canvas.TextOut(95-i,j+5,'2');
      i:=0;     j:=0;
    end;
  timer1.Enabled:=false;
  PaintBox1.Canvas.Font.Color:=clred;
  timer2.Enabled:=true;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin //Cruzan (se intercambian) las valencias
  PaintBox1.Canvas.TextOut(45+i,j+5,'3');
  PaintBox1.Canvas.TextOut(95-i,j+5,'2');
  Inc(i);   Inc(j);
  if I>37 then
    begin
      timer2.enabled := false;
      FirstOne:= false;
    end;
end;
end.

Saludos

Última edición por Deiv fecha: 16-05-2006 a las 23:24:11.
Responder Con Cita
  #2  
Antiguo 18-05-2006
Avatar de chrids506
chrids506 chrids506 is offline
Miembro
 
Registrado: abr 2006
Posts: 70
Poder: 19
chrids506 Va por buen camino
Para poner el texto transparente (que no sea todo el cuadro) creo que esto sirve:
Código Delphi [-]
 PaintBox1.Canvas.Brush.Style := bsClear;

ahora, lo que tienes que hacer es en un bmp temporal, cada vez que mueves las valencias, dibujas el fondo, las letras grandes, las valencias, y luego lo "vuelcas" sobre el tpaintbox con .Draw(), así además solucionas el parpadeo.
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
Crear un TBitmap a partir de un Buffer joecool Gráficos 6 19-04-2007 20:56:37
TImage o TBitMap en RichEdit Deiv Gráficos 5 05-02-2006 16:25:20
Guardar porción de un TBitmap Sr_Sombrero Gráficos 1 21-09-2005 20:30:05
Access Violation al cargar un Tbitmap en mi componente pepe2000 OOP 3 22-01-2005 13:27:59
Labels Verticales KAISSER Impresión 3 11-06-2003 10:07:02


La franja horaria es GMT +2. Ahora son las 08:03:49.


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