Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-05-2007
baby baby is offline
Miembro
 
Registrado: may 2007
Posts: 15
Poder: 0
baby Va por buen camino
pasar un puntero a una funcion

ola a todos los compañeros del foro
esty aprendiendo a programar en delphi y a verdad no se como se pasa un puntero a una funcion.
por otra parte si kiero asignar un puntero k apunta a un char al campo edit seria posible ¿?cual es el cambio que habra que hacer
saludos
gracias de antemano
Responder Con Cita
  #2  
Antiguo 20-05-2007
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
declaras un tipo puntero a registro (por ejemplo) así:

Código Delphi [-]
  TREc = record
    nombre : string;
  end;

  PRec = ^TRec;

tu función sería algo parecido a:
Código Delphi [-]
procedure pasarRecord(punt: PRec);
begin
  showMessage(punt^.nombre);
end;


y la llamas de la siguiente forma usando @:
Código Delphi [-]
var
  o : TRec;
begin
  o.nombre := 'hola';
  pasarRecord(@o);
end;
__________________
self.free;
Responder Con Cita
  #3  
Antiguo 21-05-2007
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 21
Mick Va por buen camino
Cita:
Empezado por baby
por otra parte si kiero asignar un puntero k apunta a un char al campo edit seria posible ¿?cual es el cambio que habra que hacer
saludos
gracias de antemano
No puedes pasar un puntero al string del edit porque el string es una propiedad e internamente podria ni existir el texto como tal (por ejemplo, ser calculado, o ser una funcion que devuelve ese string), lo que puedes es pasar el objeto edit directamente a la funcion, ya que las referencias a objetos en delphi son punteros "camuflados".

En la mayoria de los casos no necesitas trabajar con punteros, puedes usar referencias que viene a ser lo mismo pero sin necesidad de usar la sintaxis de los punteros por ejemplo:

Código:
procedure   prueba(var n:integer);
begin
  n:= 35;
end;
El uso de "var" en la definicion del parametro hace que se pase por referencia y al modificar "n" dentro de la funcion estamos modificando la variable original que se haya pasado como parametro.

En cuanto a punteros a strings, cadenas de caracteres, usando un typecast a PChar consigues un puntero al string (siempre que el string no sea una propiedad de un objeto).

Código:
var
 s:string;

  //  Ejemplo con punteros aunque seria preferible en lugar de usar un pchar usar una referencia, 
  //  de la siguiente forma: procedure rellena(var ptr:string, caracter:char) ;

  procedure rellena(ptr:PChar, caracter:char) ;
  begin
       while ptr^<>#0 do begin   
          ptr^:= caracter;
          Inc(ptr);
       end{while};
  end;

begin
    s:= 'Hola mundo';
    rellena( PChar(s)  , 'x' );
    ShowMessage(s);  // Mostrara xxxxxxxxxxx
end;


Aun asi hay que tener muucho cuidado con el uso de punteros a strings, ya que los strings pueden cambiar dinamicamente de lugar, ademas delphi para ahorrar memoria usa el metodo de copy on write, para las cadenas de caracteres, lo que hace muy peligroso su uso, por ejemplo:

Código:
var
  a,b:string;
  ptr:PChar;
begin
  a:= 'hola';

// Esto te daria un acces violation bestial no se puede modificar
// 'hola' porque esta guardada la zona de inicializacion  
// de constantes del programa y no es escribible

  ptr:= PChar(a);
  ptr^:= '*';    

// En cambio lo siguiente funciona perfectamente, al usar la sintaxis normal
// de delphi, el compilador se da cuenta de que queremos modificar
// el string, y antes de asignar el caracter hace una copia del string
// a una zona de memoria que si es escribible.

 a[1]:= '*';  

// Y una vez hecho lo anterior ya funciona la sintaxis de punteros
// porque el string ya esta en una zona de memoria escribible

  ptr:= PChar(a);
  ptr^:= '+';    

//  Pero cuidado con lo siguiente, atencion con la asignacion del puntero
// estaremos modificando LOS DOS STRINGS, tanto "a" como "b". Ya
// que al asignarlos apuntan a la misma zona de memoria y al usar
// punteros el compilador no se da cuenta de que debe hacer una copia
// de a, antes de modificarlo.

  b:= a;
  ptr:= PChar(a);
  ptr^:= 'X';

// En cambio lo siguiente funciona corrrectamente y la asignacion del puntero
// solo modifica la variable "a", esto es debido a que la linea
// a[1]:= 'q', ha obligado al compilador a realizar una copia del contenido
// de "a" para que se encuentre en distinta zona de mmmoria que "b" 
// y se pueda modificar sin afectar al valor de "b"

  b:= a;
  a[1]:= 'q';
  ptr:= PChar(a);
  ptr^:= 'X';

end;
Asi que es preferible en la mayoria de los casos usar referencias, y solo usar punteros cuando no haya mas remedio.


Saludos

Última edición por Mick fecha: 21-05-2007 a las 13:16:43.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
puntero *pantalla en c++ coletaun Varios 15 21-07-2006 14:46:04
puntero a imagen Abaddon Gráficos 9 16-06-2005 00:17:29
Funcion para pasar de minutos a horas Asshole Varios 1 13-06-2005 13:23:27
Enfocar un botón al pasar el puntero del ratón David OOP 7 16-03-2005 00:25:36
Pasar como parametro el where en una funcion cso2000 MS SQL Server 2 15-02-2005 02:49:47


La franja horaria es GMT +2. Ahora son las 05:55:56.


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
Copyright 1996-2007 Club Delphi