Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Punteros a Procesos (procedures) (https://www.clubdelphi.com/foros/showthread.php?t=75186)

gersojn 03-08-2011 19:25:27

Punteros a Procesos (procedures)
 
Hola, les comentos que tengo el siguiente problema:

Estoy haciendo una aplicacion, donde tengo varios procesos, con la siguiente estructura:

Código Delphi [-]
procedure proceso1();
begin
end;

procedure proceso2();
begin
end;
 .........
procedure x();
begin
end;

y necesito saber la direccion en memoria de algun proceso en particular, se que se hace por punteros, pero soy nuevo en delphi y aun no he trabajado con ellos.

De momento tengo el siguiente codigo para hacer pruebas.

Código Delphi [-]
procedure proceso1();
begin

end;

procedure memoria();
var
puntero: procedure();
begin
puntero:=proceso1;
end;

Entonces, no se si sea correcto la anterior expresion, no me generar ningun tipo de error, entonces las preguntas son:

Estoy capturando la direccion en memoria del proceso1?
si es asi como imprimo la direccion, en un tlabel o un ShowMessage?

De antemano muchas, gracias.

escafandra 03-08-2011 20:44:00

Código Delphi [-]
type
   TProc1 = procedure;

procedure PP;
begin
  Beep;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Proc: TProc1;
begin
  // Asigno el puntero de un procedimiento
  Proc:= @PP;
  // Con ese puntero puede ejecutar el procedimiento
  Proc;
  // Y muestro su dirección en hexadecimal
  ShowMessage(IntToHex(Integer(@PP), 8));
end;


Saludos

ecfisa 03-08-2011 20:44:36

Cita:

Estoy capturando la direccion en memoria del proceso1?
si es asi como imprimo la direccion, en un tlabel o un ShowMessage?
Hola gersojn.

En la asignación: puntero:=proceso1; estas capturando la dirección del procedimiento proceso1, en la variable puntero .

Un ejemplo para mostrar la dirección:
Código Delphi [-]
type
  TProcedurePtr = procedure;

procedure proceso1;
begin
//...
end;

procedure proceso2;
begin
//...
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  p1,p2: TProcedurePtr;
begin
  p1:= @proceso1;
  p2:= @proceso2;
  ShowMessage(Format('%p %p',[@p1, @p2]));
  // O en decimal
  ShowMessage(Format('%d %d',[ULong(@p1),ULong(@p2)]));
end;

Saludos.

Casi al mismo tiempo :)

escafandra 03-08-2011 20:52:31

Cita:

Empezado por ecfisa (Mensaje 408384)
Casi al mismo tiempo :)

Sip, es que cuando las cosas son de una manera sólo pueden ser de esa manera :p.

PD ¿Me pareció leer... Casi lo mismo y casi al mismo tiempo?

Saludos.

gersojn 03-08-2011 21:15:56

gracias por la respuesta
 
Gracias por la respuesta, lo imprimi con un:
ShowMessage(Format('%p',[@puntero]));

Gracias por responder.

ecfisa 03-08-2011 21:27:08

Cita:

Empezado por escafandra (Mensaje 408385)
PD ¿Me pareció leer... Casi lo mismo y casi al mismo tiempo?

Leiste bién ;), pero como usaste una función diferente para mostrarlo (y por lo tanto otra alternativa) me pareció adecuado corregirlo para que quede destacado.

Un saludo.:)


La franja horaria es GMT +2. Ahora son las 04:51:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi