PDA

Ver la Versión Completa : Labels ó TPaintBox ó TBitMap


Deiv
16-05-2006, 16:14:23
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)


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:


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

chrids506
18-05-2006, 15:09:56
Para poner el texto transparente (que no sea todo el cuadro) creo que esto sirve:
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.