Ver Mensaje Individual
  #1  
Antiguo 16-05-2006
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Reputación: 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