Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];
ВнизПрисвоение значения по ссылке Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c