Ir al contenido


Foto

ASyncPro en delphi 2009


  • Por favor identifícate para responder
20 respuestas en este tema

#1 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 10 junio 2009 - 11:22

Queria saber si saben de algun componente que pueda usar en delphi 2009 que haga lo mismo que hacen los APRO?.

Si no los hay, puedo crear algun procedimiento que me realice lo que hago con el datapacket y con el manejador del puerto serial.

gracias
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 10 junio 2009 - 11:32

Hola, estoy viendo que los componentes APro ya pueden ser instalados en Delphi2009, checa este enlace:

http://sourceforge.n...forum_id=887465

Por otro lado, hacer un procedimiento no debe de complicarse desde el API de windows, puedes tomar como referencia el hilo de Puertos seriales donde nuestro amigto seoane nos ha puesto un excelente código.

La idea del DataPacket es que debes de tener al menos dos de los siguientes datos:

1. Caracter de Inicio de la Cadena
2.1 Caracter de Fina de la Cadena ó
2.2 Número de caracteres que vas a leer a partir de recibir el caracter de inicio de la cadena.

No creo que debamos tener problema para hacer algo muy entretenido con eso, en cuanto tenga mi laptop disponible subo algo de código.

Salud OS
  • 0

#3 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 10 junio 2009 - 06:37

gracias egostar por tu respuesta y tu promesa

En el link que pusiste no veo nada sobre poder instalar apro en delphi 2009, solo vi que alguien hizo la
pregunta, pero no tiene respuesta.

Pero nada me quedo esperando por el codigo, para ir probando y asi dejar de utilizar o utilizar lo menos posible  componentes de terceros, siguiendo asi tu filosofia.

gracias de nuevo


  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 10 junio 2009 - 06:41

gracias egostar por tu respuesta y tu promesa

En el link que pusiste no veo nada sobre poder instalar apro en delphi 2009, solo vi que alguien hizo la
pregunta, pero no tiene respuesta.

Pero nada me quedo esperando por el codigo, para ir probando y asi dejar de utilizar o utilizar lo menos posible  componentes de terceros, siguiendo asi tu filosofia.

gracias de nuevo


Vaya, ese enlace lo obtuve de una discusión en embarcadero al respecto y colocaron ese enlace, seguramente mi inglés me ha fallado, yo entendí­ que ya estaba disponible :s  :$ :D

Ya mañana tengo mi laptop funcionando al 100, la promesa está hecha :)

Salud OS
  • 0

#5 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 11 junio 2009 - 07:23

En el menu de la pagina del enlace esta el item FORUMS y en los submenus el Open Discussion y el Help ahi encontraras algunos comentarios sobre los APRO y su funcionamiento en delphi2009 ten en cuenta que la version de liberacion es un RC por lo que puede haber detalles de funcionamiento.
  • 0

#6 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 11 junio 2009 - 11:32

hola a todos

estoy tratando de instalar el componente apro en delphi 2009 y para ello
abri el archivo A407_R120.dproj y lo compile, hasta aqui todo bien.
Luego abri el archivo A407_D120.dproj pero no encuentro donde debo darle para que se instale. 

Esto lo estoy haciendo segun el readme siguiente, el cual viene con el componente

. Installation


To install TurboPower APRO into your IDE, take the following steps:

  1. Unzip the release files into a directory (e.g., d:\apro).

  2. Start Delphi or C++Builder.

  3. Add the source subdirectory (e.g., d:\apro\source) to the IDE's
    library path.

  4. Open & compile the runtime package specific to the IDE being
    used.

  5. Open & install the designtime package specific to the IDE being
    used. The IDE should notify you the components have been
    installed.



  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 11 junio 2009 - 11:50

Hola

Del lado derecho vas a ver una sección llamada Project Manager, ahi seleccionas con el boton derecho del mouse y te muestra el menú contextual donde está la opción Install.

Salud OS
  • 0

#8 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 11 junio 2009 - 06:02

gracias

ya lo instale, solo tenia que hacer lo que me indicaste y ahora voy a probarlo.

El link de donde lo baje es este:
http://tib.s.songbea...werAsyncPro.zip

No se si podia poner el link aqui, pero sino, que alguien me informe para quitarlo y no volver a hacerlo.

PD. Lei las normas y es software libre y no le estamos haciendo publicidad, pero ustedes son los que saben.
  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 11 junio 2009 - 06:27

Pues no le veo problema, de hecho ese enlace también está en la página de embarcadero, muchas gracias por el dato.

Salud OS
  • 0

#10 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 30 junio 2009 - 09:36

Egostar, Tu Promesa todavia esta pendiente. Espero que saques algo de tiempo para hacer algo del codigo.


  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 30 junio 2009 - 10:29

Egostar, Tu Promesa todavia esta pendiente. Espero que saques algo de tiempo para hacer algo del codigo.


Hola

Vamos a ver un ejemplo muy sencillo usando solo el componente TApdComPort y sus eventos OnTriggerAvail y OnTriggerData.



delphi
  1. var
  2.   CRTrig: Word;
  3.   Linea: String;
  4.  
  5. procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
  6. var
  7.   I : Word;
  8. begin
  9.   for I := 1 to Count do
  10.       Linea := Linea + ApdComPort1.GetChar; //Se leen los caracteres recibidos
  11. end;
  12.  
  13. procedure TForm1.ApdComPort1TriggerData(CP: TObject; TriggerHandle: Word);
  14. begin
  15.   if TriggerHandle = CRTrig then begin //cuando es fin de paquete se realizarán las operaciones
  16.     Edit2.Text := Linea;
  17.   end;
  18. end;
  19.  
  20. procedure TForm1.FormShow(Sender: TObject);
  21. begin
  22.   CRTrig := ApdComPort1.AddDataTrigger(#13, False); //Asignamos el caracter CR como el fin del paquete
  23. end;



Salud OS
  • 0

#12 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 01 julio 2009 - 05:19

Gracias por tu respuesta Egostar
Cual es la diferencia entre OnTriggerAvail y OnTriggerData y datapacket?

- Recuerda que la idea es ver como realizar algunos procedimientos sin usar los componenentes APRO.

Por ejemplo ese codigo que pusiste, pero sin el componente Apro. Y mi pregunta inicial sobre el DATAPACKET, que
es el que utilizo actualmente. Como hacer lo mismo sin necesidad de usar APRO.

Ejemplo del codigo que me ayudaste a mejorar:



delphi
  1. procedure TCENTRAL.ApdDataPacket1StringPacket(Sender: TObject;
  2.   Data: string);
  3.  
  4. var
  5.   codigo, buffer: string;
  6.   detalle, formato, csid, evento: string;
  7. begin
  8.   buffer := data + formatdatetime('  dd.mm.yyyy hh:mm:ss', now);
  9.  
  10.   case buffer[1] of
  11.     '1':
  12.       begin
  13.         formato := '4+2';
  14.         evento := Trim(Copy(Buffer, 16, 1)) + Trim(Copy(Buffer, 17, 4));
  15.           // para evitar realizar la concatenación de una cadena de caracteres fijos.
  16.       end;
  17.     '3':
  18.       begin
  19.         formato := 'sia';
  20.         evento := Trim(Copy(Buffer, 15, 2)) + trim(copy(buffer, 17, 4));
  21.       end;
  22.     '4':
  23.       begin
  24.         evento := 'Cid';
  25.         detalle := Trim(Copy(Buffer, 11, 3)) + '-' +
  26.           Trim(Copy(Buffer, 14, 3)) + '-' +
  27.           Trim(Copy(Buffer, 17, 4));
  28.       end;
  29.     #0:
  30.       begin
  31.         formato := 'nulo';
  32.       end;
  33.     ' ':
  34.       begin
  35.         evento := '0';
  36.       end;
  37.   end;




Viendo el codigo que pusiste, No tendria necesidad de usar datapacket, porque podria manejarlo con estos eventos del apdcomport?

Me gustaria me indicaras los pro y los contra de esto.





  • 0

#13 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 01 julio 2009 - 09:25



delphi
  1. var
  2.   Form1: TForm1;
  3.   CRTrig: Word;
  4.   Linea : String;
  5. implementation
  6.  
  7. {$R *.dfm}
  8.  
  9. procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
  10. var
  11.   I : Word;
  12.  
  13. begin
  14. for I := 1 to Count do
  15.       linea := linea + ApdComPort1.GetChar; //Se leen los caracteres recibidos
  16.       end;
  17.  
  18. procedure TForm1.ApdComPort1TriggerData(CP: TObject; TriggerHandle: Word);
  19. begin
  20.   if TriggerHandle = CRTrig then begin //cuando es fin de paquete se realizarán las operaciones
  21.     ListBox1.Items.Add( linea );
  22.       linea:='';
  23.  
  24.  
  25.     end;
  26. end;
  27.  
  28.  
  29. procedure TForm1.FormShow(Sender: TObject);
  30. begin
  31.   CRTrig := ApdComPort1.AddDataTrigger('',FALSE); //Asignamos el caracter DC4 como el fin del paquete (#14)
  32. end;
  33.  
  34. end.



Hola Egostar

Este codigo me funciona casi perfecto y no tendria que utilizar el objeto datapacket.

Pero tengo dos problemas

1.-La primera cadena que llega, se ve completa pero sin el caracter que indica el fin de la cadena. Sin embargo la 2da cadena que llega indica el fin de la cadena pero al principio y asi siguen viendose las demas cadenas.

2.- El caracter que indica el fin de la cadena es el #14 o DC4, pero si no lo pongo como grafico no funciona, Es decir tengo que ponerlo en su formato grafico para que funcione, Porque? .


- Sobre el primer problema, trate cambiando el for  y comenzarlo en cero(0), y el caracter que indica el fin de la cadena, aparece bien al final, pero despues de llegar unas cuantas cadenas, me da el error de BUFFER IS EMPTY.

Notas: En el codigo que esta arriba no salio la imagen del #14, caracter indicador terminacion cadena.


Anexo imagen de lo que te digo sobre como se ven las cadenas.

http://img528.images.../7823/apro2.jpg

Imagen Enviada
  • 0

#14 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 01 julio 2009 - 09:41

Hola

Intenta con esto:



delphi
  1. var
  2.   Form1: TForm1;
  3.   CRTrig: Word;
  4.   Linea : String;
  5.  
  6. implementation
  7.  
  8. {$R *.dfm}
  9.  
  10. procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
  11. var
  12.   I : Word;
  13. begin
  14.   for I := 1 to Count do
  15.       linea := linea + ApdComPort1.GetChar; //Se leen los caracteres recibidos
  16. end;
  17.  
  18. procedure TForm1.ApdComPort1TriggerData(CP: TObject; TriggerHandle: Word);
  19. begin
  20.   if TriggerHandle = CRTrig then begin //cuando es fin de paquete se realizarán las operaciones
  21.     ListBox1.Items.Add(linea);
  22.     linea := '';
  23.   end;
  24. end;
  25.  
  26. procedure TForm1.FormShow(Sender: TObject);
  27. begin
  28.   CRTrig := ApdComPort1.AddDataTrigger(#20,FALSE);
  29.   //#14 es el caracter SO, te estas confundiendo con el valor hexadecimal,
  30.   //debes usar #20 que es el valor decimal de DC4
  31. end;
  32.  
  33. end.



Salud OS
  • 0

#15 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 01 julio 2009 - 09:50

Hola

Por otro lado si quieres eliminar ese caracter puedes hacer esto



delphi
  1. procedure TForm1.ApdComPort1TriggerData(CP: TObject; TriggerHandle: Word);
  2. begin
  3.   if TriggerHandle = CRTrig then begin //cuando es fin de paquete se realizarán las operaciones
  4.     Linea := StringReplace(Linea,#20,'',[rfReplaceAll]); //Se reemplaza el caracter #20 por un vacio
  5.     ListBox1.Items.Add(linea);
  6.     linea := '';
  7.   end;
  8. end;



Salud OS
  • 0

#16 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 01 julio 2009 - 09:54

Tienes razon, era #20.

para que es el false, en esta linea de codigo?

Porque a partir de la 2da cadena me llega el caracter #20 al principio de las cadenas?





[shadow=red,left] ***Cual es la diferencia entre usar Datapacket y no usarlo, cuales son los pro y los contra?***  [/shadow]

Gracias por tus respuestas.



  • 0

#17 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 01 julio 2009 - 10:05

Tienes razon, era #20.
para que es el false, en esta linea de codigo?

Porque a partir de la 2da cadena me llega el caracter #20 al principio de las cadenas?

Gracias por tus respuestas.


El false le indica a la funcion AddDataTrigger que lo que va a considerar debe coicidir exactamente.

En ciertos casos esto es fundamental para obtener una cadena por ejemplo si tu estas esperando UserID: le estas indicando que solo cuando llegue esa cadena realice la operación en el evento OnTriggerData.

Lo que imaginaba era que te está agregando el caracter #20 en la siguiente linea capturada, en un post anterior te puse algo para eliminar ese caracter.



delphi
  1. procedure TForm1.ApdComPort1TriggerData(CP: TObject; TriggerHandle: Word);
  2. begin
  3.   if TriggerHandle = CRTrig then begin //cuando es fin de paquete se realizarán las operaciones
  4.     Linea := StringReplace(Linea,#20,'',[rfReplaceAll]); //Se reemplaza el caracter #20 por un vacio
  5.     ListBox1.Items.Add(linea);
  6.     linea := '';
  7.   end;
  8. end;


Salud OS
  • 0

#18 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 01 julio 2009 - 10:21

Gracias Egostar

Me funciona Perfecto  si elimino el caracter como me indicaste.

Lo importante para mi no era si el caracter aparece o no, el problema era que no aparecia siempre, ya que solo lo hacia a partir de la 2da cadena. Por lo tanto para interpretar lo que llegaba iba a tener problemas, por lo menos con esa primera cadena.

Solo me falta saber si es mejor con datatrigger que con datapacket?

Gracias de nuevo por tomarte el tiempo para responderme

  • 0

#19 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 01 julio 2009 - 10:34

Gracias Egostar

Me funciona Perfecto  si elimino el caracter como me indicaste.

Lo importante para mi no era si el caracter aparece o no, el problema era que no aparecia siempre, ya que solo lo hacia a partir de la 2da cadena. Por lo tanto para interpretar lo que llegaba iba a tener problemas, por lo menos con esa primera cadena.

Solo me falta saber si es mejor con datatrigger que con datapacket?

Gracias de nuevo por tomarte el tiempo para responderme


Que bien, me voy a dormir a gusto :D :D :D

Referente a tu pregunta, yo creo que depende mucho de la aplicación que estes desarrollando, los datapacket te sirven mucho cuando las cadenas que quieres recibir son constantes, por ejemplo algo asi:

#2xxxxxxxxxxxxxxxxxxxxxx#3
#2xxxxxxxxxxxxxxxxxxxxxx#3
#2xxxxxxxxxxxxxxxxxxxxxx#3
#2xxxxxxxxxxxxxxxxxxxxxx#3

En este caso usar un ApdDataPacket te funciona de maravilla, no tienes que estar leyendo a traves de los eventos del ApdComPort.

Por otro lado usar los eventos del ApdComPort te evitan usar un componente mas con el ahorro en el tamaño de tu ejecutable y cuando quieres hacer algunas cosas mientras estas recibiendo caracteres, por ejemplo:

xxxxxx1xxxxxx#20
xxxxxx2xxxxxx#20
xxxxxx3xxxxxx#20

Tal vez deseas ejecutar algo en el momento que recibes el caracter 1, el 2 o el 3 cosa que con un datapacket solo podrias hacer al recibir la cadena completa.

Yo uso ambos y como te digo, dependiendo de lo que este leyendo y de lo que quieras hacer puedes usar cualquiera, quiero decir que ambos para mi son muy efectivos. :)

Salud OS
  • 0

#20 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 01 julio 2009 - 11:08

Gracias por tu respuesta y como me imagino leeras este mensaje cuando te levantes, espero hayas dormido bien.

Las cadenas que recibo no son constantes y si puedo hacer algo mientras voy recibiendo los caracteres de la cadena, esto podria servirme para algunas cosas. Con el datapacket  me ha funcionado bien. Lo que sucede es que si puedo hacer lo mismo con menos objetos, debe ser mejor. Siempre y cuando esto no haga mas lento el proceso, pero lo que he visto hasta ahora, lo hace igual.

Tu explicacion es muy clara y muy precisa.

Voy a seguir probando y gracias por todo



  • 0




IP.Board spam blocked by CleanTalk.