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
|