Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.13;
Скачать: CL | DM;

Вниз

Присвоение значения по ссылке   Найти похожие ветки 

 
IgorR   (2004-06-01 14:51) [0]

Есть function (P: Pointer) в которой передается ссылка на параметр типа string.
У объекта есть параметр TEXT: sыекштп.
Необходимо присвоить параметру по ссылке P значение TEXT.
Перепробовал кучу вариантов - ничего не получилось.
Может есть ктонить знающий как с этими ... ссылками разобраться.


 
Sandman25 ©   (2004-06-01 14:54) [1]

procedure TForm1.FormCreate(Sender: TObject);
var
 P: pointer;
 s: string;
begin
 p := @s;
 PString(P)^ := "12";
 showmessage(s);
end;


 
Sandman25 ©   (2004-06-01 14:55) [2]

Но вообще то удобнее работать с
function myfunc(var s: string);


 
panov ©   (2004-06-01 15:04) [3]

1. Под строку, которую необходимо заполнить, должно быть выделено достаточное количество памяти, например, в вызывающей программе:

SetLength(MyStr,500);

В вызываемой процедуре:

procedure MyFunc(pStr: PChar);
var
 s: String;
begin
 s :="Строка для проверки"+#0;
 Move(s[1],pStr,Length(s));
end;

Обращение:

var
 src: String;
 p: PChar;
begin
 SetLength(Src,500);
 p := @src[1];
 MyFunc(p);
 src := p;
 ShowMessage(src);


 
panov ©   (2004-06-01 15:04) [4]

Move(s[1],pStr^,Length(s));


 
IgorR   (2004-06-01 15:11) [5]

Спасибо, вроде работает.
Через var параметр передать не получится.
Слишком разные объекты в этом учавствуют.
Я использую
Control.Perform(SWB_DOC_GETVALUE, Int64(@Result), 0);
А в принимающей стороне
procedure TMyEdit.SWMInitGetValue(var Message: TMessage);
begin
 if Trim(Text) <> "" then begin
   PString(Pointer(Message.WParam))^ := Self.Text;
   Message.Result := 1;
 end;
end;
Спасибо


 
Тимохов ©   (2004-06-01 15:17) [6]

на фига вы пишете int64?


 
WebErr ©   (2004-06-01 15:23) [7]


> на фига вы пишете int64?

У него 64bit процессор? ^^


 
IgorR   (2004-06-01 15:26) [8]

Привычка.
Можно конечно и LongInt, только суть проблемы не в этом.
Здесь было высказано, что под строку необходимо выделить достаточное количество памяти.
Но дело в том, что перед вызовом

Perform(_GETVALUE, Integer(@Result), 0);

Я не знаю какой длянны будет присваеваемое знчение.


 
Тимохов ©   (2004-06-01 15:33) [9]


> IgorR   (01.06.04 15:26) [8]

в вашем случае выделять не надо.
выделать нужно когда делаешь через move (как в примере panov)
ваш варинат не работает?
в чем это выражается?


 
IgorR   (2004-06-01 15:39) [10]

Когда я пробовал через MOVE, тогда у меня ничего не получалось
Сейчас с подачи "Sandman25" я использую
  PString(Pointer(Message.WParam))^ := Self.Text;
и все замечательно работает.
Если подводных камней в этом коде нет. то на этом и остановимся.
Спасибо.


 
Тимохов ©   (2004-06-01 15:44) [11]


> IgorR   (01.06.04 15:39) [10]

подводность камней зависит от того, как описана result, примененная в коде Control.Perform(SWB_DOC_GETVALUE, Int64(@Result), 0);
если не как string, то будет утечка памяти (если вы, конечно, сами не позботитесь об освобождении памяти). если как string, то утечки не будет.


 
Тимохов ©   (2004-06-01 15:45) [12]


> Тимохов ©   (01.06.04 15:44) [11]

в дополнение:
еще важно как вы с этим result потом работаете, что вы с ним делаете.


 
WebErr ©   (2004-06-01 15:47) [13]


> Если подводных камней в этом коде нет. то на этом и остановимся.

Подводных камней нет.
Эта низкоуровневая фишка, перекинутая в Delphi, весьма логична.
Мало того, можно творить чудеса с типами в таком маниакально типизированном языке, как Паскаль.

var
P: Type1;
Q: Type2;
type
PType1 = ^Type1;
PType2 = ^Type2;
...
P := PType1(Pointer(@Q))^;


 
IgorR   (2004-06-01 15:48) [14]

Дальше я его загоняю в StringList
и формирую массив значений для сохранения/отображения/пердачи/печати документа.
Но это уже совсем другая история.


 
Тимохов ©   (2004-06-01 15:49) [15]


> IgorR   (01.06.04 15:48) [14]

какая разница куда вы его загоняете
какого типа result?


 
IgorR   (2004-06-01 15:51) [16]

Result типа string.


 
Тимохов ©   (2004-06-01 15:53) [17]


> IgorR   (01.06.04 15:51) [16]
> Result типа string.

Тогда все ок.



Страницы: 1 вся ветка

Текущий архив: 2004.06.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
3-1085468017
Соловьев
2004-05-25 10:53
2004.06.13
Тормозит АДО


4-1084271384
x3{neon}
2004-05-11 14:29
2004.06.13
Получение .exe файла по дескриптору окна.


1-1085635870
marcel
2004-05-27 09:31
2004.06.13
Пропало меню Delphi


3-1084954154
AlexSerp
2004-05-19 12:09
2004.06.13
Весь в непонятках. Хранимая процедура(+)


14-1085657216
Mad Dancer
2004-05-27 15:26
2004.06.13
Читы для DX Ball 1