Вверх ↑
Ответов: 4630
Рейтинг: 749
#1: 2015-03-30 11:47:24 ЛС | профиль | цитата
nesco писал(а):
как это отобразится на исходной строке?
Так я тебе предложил удостовериться, что никак.

Add(Button,10504036,217,203)
{
Left=150
Top=120
link(onClick,11970995:doWork,[])
}
Add(InlineCode,11970995,301,203)
{
WorkPoints=#6:doWork|
EventPoints=#8:onResult|
VarPoints=#4:Var1|4:Var2|
DataPoints=#5:Data1|5:Data2|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|28: Data1, Data2:THI_Event;|27: onResult:THI_Event; |51: procedure doWork(var _Data:TData; index:word);|49: procedure Var1(var _Data:TData; index:word);|49: procedure Var2(var _Data:TData; index:word);|5: end;|0:|14:implementation|0:|0:|0:|58:procedure THiAsmClass.doWork(var _Data:TData; index:word);|3:var|18: s1, s2: string; |5:begin|37: s1 := ReadString(_Data, Data1, '');|11: s2 := s1;|19: SetLength(s2, 0);|13: _debug(s1);|2: |33: // ReadInteger(_Data, Data2, 0)|42: // _hi_CreateEvent(_Data, @onResult, 0);|33: //_hi_OnEvent(onResult, 'abc');|4:end;|0:|0:|57:procedure THiAsmClass.Var1(var _Data:TData; index:word); |5:begin|22: dtInteger(_Data, 0);|4:end;|0:|57:procedure THiAsmClass.Var2(var _Data:TData; index:word); |5:begin|22: dtString(_Data, '');|4:end;|0:|4:end.|
link(Data1,12710020:Text,[])
}
Add(Edit,12710020,301,147)
{
Left=75
Top=50
Width=80
}
В s1 - исходная строка, которая не должна измениться.
Присваиваем её переменной s2. По твоей логике эти две переменные ссылаются на одну и ту же строку. Вроде это так и есть.
И по этой же логике изменение размера s2 (или любого символа в s2) должно вызвать те же изменения в s1. Но не вызывает по описанной выше причине: перед внесением любых изменений в s2, исходная строка копируется и s2 уже указывает на другую строку, чем s1.

Со StrCase не проверял, но там произойдет то же самое.
ПРОВЕРИЛ:

Add(Button,1278441,196,462)
{
Left=75
Top=140
link(onClick,13115854:doEvent1,[])
}
Add(Memory,7470773,245,343)
{
Default=String(abcdef)
}
Add(Hub,13115854,252,462)
{
OutCount=3
link(onEvent1,1958132:doMessage,[])
link(onEvent2,13269969:doModify,[(308,475)(308,552)])
link(onEvent3,300142:doMessage,[(287,482)(287,643)])
}
Add(LineBreakEx,2624889,350,427)
{
Caption="str"
Type=2
}
Add(LineBreakEx,6354434,245,385)
{
Caption="str"
Type=3
link(_Data,7470773:Value,[])
}
Add(Message,1958132,350,462)
{
Caption="Before"
link(Message,2624889:getVar,[])
}
Add(StrCase,13269969,350,546)
{
Type=1
link(onModify,7657121:doText,[])
link(Str,5777113:getVar,[])
}
Add(LineBreakEx,5777113,350,518)
{
Caption="str"
Type=2
}
Add(LineBreakEx,9602436,350,602)
{
Caption="str"
Type=2
}
Add(Message,300142,350,637)
{
Caption="Before"
link(Message,9602436:getVar,[])
}
Add(Label,7657121,413,546)
{
Left=140
Top=145
}
В коде убрал ту порнографию с копированием, разницы не заметил.

Разница будет, когда одна и та же переменная используется в разных местах. Например, у нас упомянутая тобой TData между компонентами передается как var параметр. То-есть, разные компоненты получают именно одну и ту же переменную. Тогда если изменить поле TData.sdata, это изменение увидят все компоненты. Например, в хабе как раз происходит принудительное копирование TData, так как в одном событии какой нибудь компонент может изменить её содержимое (_hi_CreateEvent), тогда остальные события выдадут уже измененное значение.
карма: 26

0