Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.074 c
4-1083936626
shell_rom
2004-05-07 17:30
2004.06.13
Apollo


1-1085991974
Ertong
2004-05-31 12:26
2004.06.13
Popup in Popup


9-1076777727
Anton
2004-02-14 19:55
2004.06.13
Как загрузить рисунки как элементы массива?


1-1085569361
SashaLebed
2004-05-26 15:02
2004.06.13
Как встроить график (Chart) в отчёт?


1-1086161509
Anton
2004-06-02 11:31
2004.06.13
Изменение размеров компонентов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский