Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.05.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.004 c
15-1326217120
Jimmy
2012-01-10 21:38
2012.05.20
Глубина и разряд в шахматах


1-1291970624
mnj
2010-12-10 11:43
2012.05.20
Выбор точек, веток и и х движение в TChart


15-1326400202
Юрий
2012-01-13 00:30
2012.05.20
С днем рождения ! 13 января 2012 пятница


15-1326421412
Андрей_1
2012-01-13 06:23
2012.05.20
Delphi 6 и Windows 7


2-1326697088
Nikitos
2012-01-16 10:58
2012.05.20
Перевод чисел из арабских в почтовый индекс





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