Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Labels ó TPaintBox ó TBitMap (https://www.clubdelphi.com/foros/showthread.php?t=31734)

Deiv 16-05-2006 16:14:23

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

chrids506 18-05-2006 15:09:56

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.


La franja horaria es GMT +2. Ahora son las 11:51:50.

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