Форум: "Начинающим";
Текущий архив: 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