![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
помогите разобраться с указателями
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;