unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, unit2, ComCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Edit1: TEdit;
    Memo1: TMemo;
    Timer2: TTimer;
    TrackBar1: TTrackBar;
    ComboBox1: TComboBox;
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
   // procedure AbrirCom_Escribir_y_Leer;
  end;


var
  Form1: TForm1;
  Cadena: String;          // Para leer del puerto
  Contador: integer;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.FormShow(Sender: TObject);
begin
  Contador:= 0;
  TrackBar1.Position:= 1;
  Label2.Left:= (TrackBar1.Position div 3);
  Label2.Caption:= '0.' + (inttostr(TrackBar1.Position));
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Timer1.Interval:= TrackBar1.Position;
  Timer2.Interval:= TrackBar1.Position;
  //Timer1.Interval:= (strtoint('1000') + 1) - TrackBar1.position;
  if TrackBar1.Position < 1000 then
    Begin
      Label2.Caption:= '0.' + (inttostr(TrackBar1.Position));
    end
    else
    Begin
      Label2.Caption:= '1';
    end;

      Label2.Left:= (TrackBar1.Position div 3);

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin

          Edit1.Text:= Cadena;
          Memo1.Text:= Cadena;
         // Memo1.Text:= (IntToHex(StrToInt(cadena) , 1));

          Contador:= Contador + 2;
          if Contador = 10 then
          Begin
            Contador:= 2;
          end;
end;


procedure TForm1.Timer2Timer(Sender: TObject);
//const
  //NombrePuerto = 'COM1';   // Por decir algo
var
  HandlePuerto: THandle;   // Manejador para el puerto
  //Cadena: String;          // Para leer del puerto
  dwValor: DWORD;          // Tamao de la lectura
  Sta: COMSTAT;            // Estado o tamao del buffer de lectura
  bResult: Boolean;        // Parmetro de resultado
  
begin
  // ~~~~~~~~~~~~~~~~~~~
  // Apertura del puerto
  // ~~~~~~~~~~~~~~~~~~~
  //
  // El puerto ha de abrirse con acceso exclusivo. Es una de las razones de que haya
  // un slo "Acceso telefnico a redes" que acta de servidor del puerto. Generalmente
  // tambin se abre con acceso de lectura y escritura ya que es extrao tener que leer
  // o escribir slo en l. Pero, claro, esto depende de lo que vayas a hacer con el
  // mismo. El "solapamiento" se produce slo si hay varios procesos que pueden acceder
  // al puerto a la vez y se utiliza cuando la aplicacin tiene, por ejemplo, un hilo
  // para leer y otro para escribir. Presupongo que no es el caso y que slo hay un hilo.
  // El ltimo parmetro ('hTemplate') no tiene efecto para los puertos de comunicaciones.
  //
  HandlePuerto := Windows.CreateFile(
                     PChar(ComboBox1.Text), { Nombre del puerto }
                     GENERIC_READ or
                     GENERIC_WRITE,       { Modo de apertura: Lectura/Escritura }
                     0,                   { Acceso exclusivo }
                     nil,                 { Sin atributos de seguridad }
                     OPEN_EXISTING,       { El puerto debe existir }
                     0,                   { Sin solapamiento de Lectura/Escritura }
                     0);                  { No hay "hTemplate" }

  // Comprobar que la apertura ha sido correcta
  if (INVALID_HANDLE_VALUE <> HandlePuerto) then
  begin
    // Vamos a ver si hay algo que leer...
    if (Windows.ClearCommError(HandlePuerto, dwValor, @Sta)) then
    begin
      if (0 < Sta.cbInQue) then    //... pues s
      begin
        // ~~~~~~~~~~~~~~~
        // Leer del puerto
        // ~~~~~~~~~~~~~~~
        // Redimensionar la cadena de lectura
        SetLength(Cadena, (Sta.cbInQue + 1));
        bResult := Windows.ReadFile(
                       HandlePuerto,   { Handle del puerto }
                       PChar(Cadena)^, { Puntero a los datos a leer }
                       Sta.cbInQue,    { Tamao del buffer de lectura }
                       dwValor,        { Nmero de caracteres ledos }
                       nil);           { No hay lecturas/escrituras solapadas }

        if (bResult) then  // Lectura correcta
        begin
          // Dimensionar la cadena al nmero de bytes ledos
          SetLength(Cadena, dwValor);
          // Aqu se puede hacer lo que se quiera con 'Cadena'
        end;
      end
      else
        Begin
          Label1.Caption:= 'Puerto correcto';
        end;
    end;

    // ~~~~~~~~~~~~~~~~~~~~~
    // Escribir en el puerto
    // ~~~~~~~~~~~~~~~~~~~~~
    // En general, los puertos de comunicaciones esperan un retorno de carro
    // tras lo que se enve. Tiene que ver con los bferes del puerto: cuando
    // se llena el buffer hasta un nivel o se recibe el retorno de carro se
    // enva el contenido del buffer al puerto. As que, para asegurarse, se
    // termina la cadena a escribir por esos caracteres:
    Cadena :=  (IntToHex(Contador , 1)) ; // antes 'Probando la escritura' + #13#10;
    if (Windows.WriteFile(
           HandlePuerto,   { Handle del puerto }
           PChar(Cadena)^, { Datos a escribir }
           Length(Cadena), { Longitud de los datos }
           dwValor,        { Nmero de caracteres escritos }
           nil)            { Sin solapamiento de lecturas/escrituras }
       )
    then
    begin
      // Aqu nos damos con un canto en los dientes:
      // la 'Cadena' se ha escrito en el puerto. Podemos comprobarlo si
      // miramos 'dwValor' ya que debe ser igual a 'Length(Cadena)'.
      // Si no lo es, algo ha ido mal.
    end;

    // ~~~~~~~~~~~~~~~~
    // Cerrar el puerto
    // ~~~~~~~~~~~~~~~~
    Windows.CloseHandle(HandlePuerto);
  end
  else
      begin
        Application.ProcessMessages;
        sleep(1000);
        Label1.Caption:= '    ese puerto no existe '#10#13'  se elegira el siguiente !';
        ComboBox1.ItemIndex:= ComboBox1.ItemIndex + 1;
        if ComboBox1.ItemIndex = 5 then
          Begin
            ComboBox1.ItemIndex := 0;
          end;
      end;
end;

end.