Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

помогите разобраться с указателями


Страницы:   1 2

u4enik ©   (2012-01-18 14:05:00) 

Хочу сделать в программе сохранение настроек.
есть поле edit1: TEdit и переменная valEdit1: String;

при открытии нужно занести значение переменной в поле редактирования, при закрытии наоборот.
для универсальности пишу одну процедуру.

pString = ^String;
...

procedure SetGetStringParam(editValue, val: pString; optSave: Boolean);
begin
 if optSave then begin
    val:= editvalue;
 end else begin
    editvalue:= val;
 end;
end;

...

вызываю:

SetGetStringParam(pointer(edit1.text), pointer(valEdit1), optSave)

получается ерунда.
наверное тут val:= editvalue; я присваиваю указатель.. а как сделать присваивание строки? пробывал варианты val^:= editvalue^; то же не то..
запутался с ^, @, pointer, addr
не могли бы подтолкнуть чуток?


RWolf   (2012-01-18 15:58:00) [1]


> если удаляю строку s[2] := 'b'; получаю access! бред какой-то...

так и должно быть. s лежит в read-only странице памяти, пока её не начали менять, тогда компилятор сделает её копию. Eсли строку править через указатель, компилятор не сможет отследить момент правки строки, и получаем AV по записи в read-only страницу.


RWolf   (2012-01-18 15:58:00) [2]


> если удаляю строку s[2] := 'b'; получаю access! бред какой-то...

так и должно быть. s лежит в read-only странице памяти, пока её не начали менять, тогда компилятор сделает её копию. Eсли строку править через указатель, компилятор не сможет отследить момент правки строки, и получаем AV по записи в read-only страницу.


u4enik   (2012-01-18 15:39:00) [3]

наверное pointer это указатель на указатель..
вероятно нужно p:= addr(s); или @s;


u4enik   (2012-01-18 15:26:00) [4]

RWolf ©, property Text..
вон оно что.. точно. это же не тупо указатель на строку..

всё-таки имея
s : String;
p: pString;

p:= pointer(s);

как теперь присвоить значение s через указатель p ?


Сергей М.   (2012-01-18 15:26:00) [5]


> u4enik   (18.01.12 15:21) [23]
>
> у разных компонентов названия полей разные


Вряд ли различных вариантов так уж много..
Как правило, св-во обзывается либо Text либо Caption ..
Прочие "нестандартные" случаи наверняка можно по пальцам перечесть, главное чтобы все эти св-ва были опубликованными или инф-ция о них  так или иначе фигурировала в RTTI.


u4enik   (2012-01-18 15:21:00) [6]

Сергей М. ©, у разных компонентов названия полей разные.. да и разобраться всё таки хочется с этими строками..

RWolf ©, вы правы.. но почему:

procedure X1;
var
 s :String;
 p :PString;
begin
 s := 'abcd';
 s[2] := 'b';
 p  := PString(s);
 p^ := String('X');
 ShowMessage(s);
end;

что то работает, но если удаляю строку s[2] := 'b'; получаю access! бред какой-то...


RWolf   (2012-01-18 15:20:00) [7]


> получаю в обоих случаях acces. не могу понять почему.

потому, что пытаетесь перехитрить компилятор приведениями к PChar.


RWolf   (2012-01-18 15:15:00) [8]


> u4enik   (18.01.12 15:12) [17]
> RWolf ©, edit.text: TCaption который описан в vcl.controls.
> TCaption

ну а как описан-то? правильно, property Text и т.д.


RWolf   (2012-01-18 15:14:00) [9]

p  := PChar(s);
этот код обращается с ANSI-строкой, как с указателем на Unicode-строку, что неверно.


Сергей М.   (2012-01-18 15:14:00) [10]


> u4enik   (18.01.12 15:10) [16]


Ну так и передавай TargetControl: TComponent !


Ega23   (2012-01-18 15:14:00) [11]


> насколько я понимаю
> var
> s: String
>
> выделился просто пустой указатель в никуда.


Не правильно понимаешь.


u4enik   (2012-01-18 15:12:00) [12]

RWolf ©, edit.text: TCaption который описан в vcl.controls.TCaption
delphiXE2


u4enik   (2012-01-18 15:10:00) [13]

Сергей М., у меня не только edit'ы, но и другие компоненты, у которых хотел бы хранить и восстанавливать текстовые поля


RWolf   (2012-01-18 15:09:00) [14]

в дельфи необходимость в указателях или PChar возникает довольно редко и в специфических случаях (вызов библиотек на других языках, WinAPI и т.п.).
в вашем случае их применение не даст ничего, кроме усложнения кода.


> поле текста едита - vcl.controls.Tcaption

TEdit.Caption — это вообще не поле, это свойство, указатель от него взять нельзя.


u4enik   (2012-01-18 15:09:00) [15]

слова какие-то незнакомые ))
насколько я понимаю
var
s: String

выделился просто пустой указатель в никуда.

после

s:= '12345'; выделется память и указатель указывает на эту память.
при s:= '1234567890' память наверное старая освобождается и выделяется новая.

так вот как сказать насчет присвоения строке имея её указатель,  что бы корректировалсь память?
может немножко не так выражаюсь но думаю понимаете.


Сергей М.   (2012-01-18 15:06:00) [16]


> что бы значение присвоилось edit1.text


Так и передавай параметром edit1 безо всяких var !


Ega23   (2012-01-18 15:03:00) [17]


>  так мне то и нужен первый вариант


Убей в себе перфекциониста.


u4enik   (2012-01-18 15:00:00) [18]

Сергей М. ©, так мне то и нужен первый вариант, что бы значение присвоилось edit1.text а не локальной строковой переменной.

интересный ещё момент. нашел в инете код:

выведя строку 'Xabcd' :

procedure X1;
var
 s :AnsiString;
 p :PChar;
begin
 s := 'abcd';
 s[2] := 'b';
 p  := PChar(s);
 p^ := 'X';
 ShowMessage(s);
end;

при s: AnsiString у меня выводит 'X' что и понятно по идее а не 'Xabcd' как пишут.
если меняю на s: String то выводит 'Xbcd' а если убираю строку:   s[2] := 'b';
то получаю в обоих случаях acces. не могу понять почему.
DelphiXE2


Сергей М.   (2012-01-18 14:42:00) [19]


> иначе непонятно куда присвоение будет


Не выдумывай, все предельно понятно будет.

При vareditValue: Stringзначение valбудет присвоено строковой переменной, адрес которой передан в процедуру.

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


u4enik   (2012-01-18 14:40:00) [20]

попробывал так:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 s: ^String;
 s1, s2: String;
begin

 s1:= '12345';
 s:= pointer(s2);
 s^:= s1;  //   ==> acces
 ShowMessage(s2);

end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо