Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   puntero (https://www.clubdelphi.com/foros/showthread.php?t=52782)

gaston260 30-01-2008 22:22:43

puntero
 
buenas tardes !

Mi pregunte es la siguiente ¿ como puedo camviar un valor de un puntero a entero ? , mi codigo es el siguiente

Código Delphi [-]
 
procedure TfrmMain.BufferFinished(var Msg: TMessage);
var
hdr: PWaveHdr;
P: PByte;
begin
hdr:= PWaveHdr(Msg.LParam);
with hdr^ do
begin
P:= PByte(lpData);
gauge1.Progress :=(integer (p^));
Out32(StrToInt(txtpuertobucle.text), i)
end;
end.

espero que me aya explicado correctamente

gaston260 30-01-2008 22:42:56

ok ! si alguien quiere responder mi pregunta o mandar algun comentario mi mail es ¡no pedir información por correo!, ya se que (integer (p^)) esta mal escrito , gracias de antemano a todos !!

jachguate 30-01-2008 23:07:32

Hola.

En primer lugar, bienvenid@ al clubdelphi. Te recomiendo leer la guia de estilo. Verás que pedir respuestas por correo electrónico no está permitido en estos foros.

Sobre tu pregunta, te recuerdo que un byte es un entero.

Hasta luego.

;)

gaston260 31-01-2008 21:52:58

perdon por no leer la guia de estilo , prometo leerla en breve y espero que me puedan ayudar , a esta la veo fea jaja ya que estoy estudiando este lenguaje y cuando estavamos a punto de entrar en punteros paramos por las vacaciones y por el estres del trabajo mas que todo , les comento que mi proyecto tiene como fin reproducir el sonido mediante un gauge a modo de vu-metro y que el codigo lo consegui en este muy buen foro y se llama onda.zip , en este momento no me acuerdo quien lo dejo avilitado para la descarga , este codigo (onda.zip) muestra la onda que arroja un sonido 'x' mediante canvas , el codigo modificado con gauge deveria poder mostrar la señal sonora y de hecho lo hace , pero sin sonido alguno me indica que tengo el 41% de sonido 1ª
error , el 2ª es que en la salida del puerto paralelo los led's que tengo conectados a una plaqueta a modo de tester me indican que no tengo un valor entero de 1 a 255 y creo que tengo que convertir el valor del puntero , alguien tiene idea de como convertir el puntero a otros valores ??

gracias a todos !!

gaston260 31-01-2008 22:01:17

bien mi pregunta es como convertir el valor de un puntero a otros valores
o donde puedo obtener esa informacion y perdon de nuevo si cometi algun error en mi comentario anterior

seoane 31-01-2008 22:14:35

Vamos por partes, lo valores de los que hablas van del 0 al 255, pero para obtener el valor "real" hay que restarle 128. Por este motivo, para un valor de 0 en la entrada, es decir sin sonido, el valor que obtienes es de 128.

Por otro lado, en el programa que mencionas puedes ver que para obtener el byte al que apunta el puntero solo hay que poner a continuación el símbolo ^. Como ya te dijo jachguate el tipo byte es un entero, no hace falta conversión, algo como esto es completamente valido:
Código Delphi [-]
var
  i: Integer;
begin
  

  i:= b^;
end;
La razón por la que se muestra mal en la placa que tienes conectada en el puerto paralelo ya depende de como funcione la placa y los parámetros que espera recibir. De todas formas, si quieres hacer un vumeter deberías de tomar el valor máximo de cada buffer y ser ese el que se muestra, de lo contrario los valores cambiaran tan rápidamente que apenas apreciaras nadas, solo luces parpadeando.

gaston260 31-01-2008 22:31:47

gracias por responder !!

tenes ! yo hice una prueva no hace mucho y el 41% corresponde a 128 , perfecto lo que no entiendo es como tomar el valor máximo de cada buffer , me podrias encaminar porfavor ??

seoane 31-01-2008 22:49:41

Vamos a ver, tu tienes este procedure:
Código Delphi [-]
procedure TfrmMain.BufferFinished(var Msg: TMessage);
var
  hdr: PWaveHdr;
  i: integer;
  P: PByte;
begin
  hdr:= PWaveHdr(Msg.LParam);
  with hdr^ do
    begin
      P:= PByte(lpData);
      Canvas.FillRect(Canvas.ClipRect);
      Canvas.MoveTo(width,128);
      Canvas.LineTo(0,128);
      for i:= 1 to dwBytesRecorded  do
        begin
          Canvas.LineTo(i,P^);
          inc(P);
        end;
    end;

  if waveInPrepareHeader(Device,hdr,sizeof(TWAVEHDR))<>MMSYSERR_NOERROR then
     begin
       CloseWaveDevice;
       exit;
     end;
  if waveInAddBuffer(Device,hdr,sizeof(TWAVEHDR))<>MMSYSERR_NOERROR then
    begin
      CloseWaveDevice;
      exit;
    end;
end;

Pues deberías hacer algo como esto:
Código Delphi [-]
procedure TfrmMain.BufferFinished(var Msg: TMessage);
var
  hdr: PWaveHdr;
  i: integer;
  P: PByte;
  B: Byte;
begin
  hdr:= PWaveHdr(Msg.LParam);
  with hdr^ do
    begin
      P:= PByte(lpData);
      B:= 0;
      for i:= 1 to dwBytesRecorded  do
        begin
          if P^ > B then
            B:= P^;
          inc(P);
        end;
      // Aqui haz lo que quieras con B, por ejemplo
      ProgressBar1.Position:= B; 
      // O incluso esto otro
      dec(B,128);
      ProgressBar1.Position:= B; 
    end;

  if waveInPrepareHeader(Device,hdr,sizeof(TWAVEHDR))<>MMSYSERR_NOERROR then
     begin
       CloseWaveDevice;
       exit;
     end;
  if waveInAddBuffer(Device,hdr,sizeof(TWAVEHDR))<>MMSYSERR_NOERROR then
    begin
      CloseWaveDevice;
      exit;
    end;
end;

gaston260 31-01-2008 22:56:17

gracias por darme ese dato , tal ves no pueda contestar por el momento pero mañana volvere !!

gracias al club y a todos , en especial a seoane y a jachguate !!

gaston260 01-02-2008 21:47:16

maestro funciono perfecto permitame una modificacion en la linea (dec(B,128); por dec(B,124);) ya que sin sonido alguno el progress marcaba 100% , con esta modificacion anda perfecto

¿ es posible tener varios progress y a cada uno dividirlo para que responda a una frecuencia determinada tal cual como en el winamp o el reproductor de windows ?

gaston260 01-02-2008 22:35:51

voy a explicar mejor mi pregunta ¿ es posible tener varios progress y a cada uno asignarle una frecuencia distinta tal cual como en el winamp o el reproductor de ?

muchas gracias por dedicar su tiempo en leer mi pregunta !

gaston260 01-02-2008 22:39:20

espero que este salga mejor jaja ¿ es posible tener varios progress y a cada uno asignarle una rango de frecuencia distinta ?

gracias por dedicar su tiempo en leer mi pregunta !!


La franja horaria es GMT +2. Ahora son las 17:41:35.

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