Главная страница
    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
Время: 2.038 c
6-1082526541
atruhin
2004-04-21 09:49
2004.06.13
Перехват на контроллере домена. События входа пользователя.


3-1085313764
SergP
2004-05-23 16:02
2004.06.13
Можно ли INSERT ом вставлять записи в 2 таблицы сразу?


14-1085611831
Мазут Береговой
2004-05-27 02:50
2004.06.13
Вот обидно. Всё придумывают в России, а известность получают


4-1084129701
Lui
2004-05-09 23:08
2004.06.13
Картинка из dll


1-1086094071
LittleGirly
2004-06-01 16:47
2004.06.13
Создание диаграммы в Excel-e





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский