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; Button2: TButton; Timer1: TTimer;
Timer2: TTimer;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
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 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 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 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 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; Button2: TButton; Timer1: TTimer;
Timer2: TTimer;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
public
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 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 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 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 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