Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.05.20;
Скачать: CL | DM;

Вниз

помогите разобраться с указателями   Найти похожие ветки 

 
u4enik   (2012-01-18 14:05) [0]

Хочу сделать в программе сохранение настроек.
есть поле 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
не могли бы подтолкнуть чуток?


 
Ega23 ©   (2012-01-18 14:09) [1]

TForm1 = class (TForm)
 Edit1: TEdit;
private
 function GetStrParam: string;
 procedure SetStrParam(Value: string);
public
 property StrParam: string read GetStrParam write SetStrParam;
end;

function TForm1.GetStrParam: string;
begin
 Result := Edit1.Text;
end;

procedure TForm1.SetStrParam(Value: string);
begin
 Edit1.Text := Value;
end;


 
Сергей М. ©   (2012-01-18 14:09) [2]

И накой тут указатели ?
Прямое присвоение между переменной и св-вом Edit.Text чем не угодило ? Типы-то совпадают ..


 
u4enik   (2012-01-18 14:11) [3]

спасибо Ega23 ©!   грамотно делать я понимаю примерно как ))
у меня просто этих edit"ов многова-то.. хотелось бы свой вариант да и чисто понять очень хочется а то плаваю с этими указателями


 
Ega23 ©   (2012-01-18 14:12) [4]


>  хотелось бы свой вариант


Я вообще не понял, что за "свой вариант" и для чего там нужны указатели.


 
u4enik   (2012-01-18 14:26) [5]

Сергей М. ©, я наверное не понимаю, но если передавать строки:
procedure SetGetStringParam(editValue, val: String; optSave: Boolean);

то нужно передавать через var их,
SetGetStringParam(var: editValue, val: String; optSave: Boolean);
иначе непонятно куда присвоение будет..
а поле edit1.text через var не передать.. поэтому решил передавать указатели на строки и уже как-то присваивать строки по этим указателям.


 
Ega23 ©   (2012-01-18 14:27) [6]


> а поле edit1.text через var не передать..


Передавай TEdit, делов-то.


 
u4enik   (2012-01-18 14:32) [7]

у меня не только edit"ы, хотелось бы универсальность сохранение параметров различных текстовых полей разных компонентов.


 
u4enik   (2012-01-18 14:36) [8]

поле текста едита - vcl.controls.Tcaption
TCaption = type string;
я запутался с ^, @, pointer, addr
если у меня есть адрес строки, как присвоить строку по этому адресу?


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

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

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

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

end;


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


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


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

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

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


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

Сергей М. ©, так мне то и нужен первый вариант, что бы значение присвоилось 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


 
Ega23 ©   (2012-01-18 15:03) [12]


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


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


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


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


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


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

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

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

после

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

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


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

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


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

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


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

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


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

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


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


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


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


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


> u4enik   (18.01.12 15:10) [16]


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


 
RWolf ©   (2012-01-18 15:14) [20]

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


 
RWolf ©   (2012-01-18 15:15) [21]


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

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


 
RWolf ©   (2012-01-18 15:20) [22]


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

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


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

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

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! бред какой-то...


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


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


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


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

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

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

p:= pointer(s);

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


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

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


 
RWolf ©   (2012-01-18 15:58) [27]


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

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


 
RWolf ©   (2012-01-18 15:58) [28]


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

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



Страницы: 1 вся ветка

Текущий архив: 2012.05.20;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.01 c
2-1326739475
Anthony
2012-01-16 22:44
2012.05.20
Коррекция ширины колонки в TStringGrid - не работает...


15-1326382496
brother
2012-01-12 19:34
2012.05.20
Хочу не понятного?


15-1326499809
KilkennyCat
2012-01-14 04:10
2012.05.20
новый вид памяти


4-1256905967
webpauk
2009-10-30 15:32
2012.05.20
Извлечение объекта из lnk-файла


2-1326953184
OW
2012-01-19 10:06
2012.05.20
Из потока надо передать строку в VCL сообщением