|
|
|
Переопределение свойств объекта
|
|||
|---|---|---|---|
|
#18+
Добрый день. Столкнулся с непонятной проблемой, возможно чего-то не понимаю, прошу прощения за банальный вопрос, тема такая есть у меня в программе combobox, в него из базы данных записываю определенную структуру (с этим вроде проблем нет) и вот в определенном месте я при выборе элемента combobox'a эту структуру "считываю" Info := TInfoObj(cbTypeDevice.Items.Objects[cbTypeDevice.ItemIndex]); и затем меняю некоторые значения Info Info.sStr.PC20 := RoundTo(Info.sStr.PC20, 1); Info.sStr.PC60 := RoundTo(Info.sStr.PC60, 1); Info.sStr.PC100 := RoundTo(Info.sStr.PC100, 1); Потом в другом месте программы мне снова нужно считать данные из combo? ну я естественно повторяю Info := TInfoObj(cbTypeDevice.Items.Objects[cbTypeDevice.ItemIndex]); и тут я замечаю, что у меня значения Info уже обновленные, а не первоначальные!!! Как такое может быть? Переменная Info у меня локальная для процедур ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2020, 15:16 |
|
||
|
Переопределение свойств объекта
|
|||
|---|---|---|---|
|
#18+
patrick1968Как такое может быть? Переменная Info у меня локальная для процедур Локальный указатель на глобальный экземпляр структуры. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2020, 15:21 |
|
||
|
Переопределение свойств объекта
|
|||
|---|---|---|---|
|
#18+
Я может непонятно объяснил cbTypeDevice.Items.Objects[cbTypeDevice.ItemIndex] - это комбо и он глобальный - значение его неизменно, в одной процедуре я считываю объект в локальную переменную Info для процедуры №1, затем в этой же процедуре я изменяю эту переменную Info. Потом в другой процедуре №2 я снова считываю из того же комбо в локальную для процедуры №2 переменную Info и там вижу значения не исходные из комбо, а те которые были изменены в процедуре №1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2020, 15:38 |
|
||
|
Переопределение свойств объекта
|
|||
|---|---|---|---|
|
#18+
patrick1968 в одной процедуре я считываю объект в локальную переменную Info для процедуры №1, затем в этой же процедуре я изменяю эту переменную Info. Ваш комбик хранит список указателей. В одной процедуре вы считываете объект (указатель), и изменяете его. Это не КОПИЯ объекта, а САМ объект. Непонятно, зачем МЕНЯТЬ переменную Info ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2020, 15:47 |
|
||
|
Переопределение свойств объекта
|
|||
|---|---|---|---|
|
#18+
patrick1968cbTypeDevice.Items.Objects[cbTypeDevice.ItemIndex] - это комбо и он глобальный - значение его неизменно Да. И это значение - указатель. Ты, когда код копипастишь, попытайся хотя бы разобраться что он делает. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2020, 15:50 |
|
||
|
Переопределение свойств объекта
|
|||
|---|---|---|---|
|
#18+
спасибо за разъяснение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2020, 15:52 |
|
||
|
Переопределение свойств объекта
|
|||
|---|---|---|---|
|
#18+
Добрый день. В продолжении темы хотел уточнить одну деталь Оператор Info := TInfoObj(cbTypeDevice.Items.Objects[cbTypeDevice.ItemIndex]); создает объект Info типа TInfoObj и все поля и методы берутся с выбранного текущего элемента комбобокса. Я правильно понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2020, 11:20 |
|
||
|
Переопределение свойств объекта
|
|||
|---|---|---|---|
|
#18+
patrick1968 Добрый день. В продолжении темы хотел уточнить одну деталь Оператор Info := TInfoObj(cbTypeDevice.Items.Objects[cbTypeDevice.ItemIndex]); создает объект Info типа TInfoObj и все поля и методы берутся с выбранного текущего элемента комбобокса. Я правильно понимаю? Нет. Объекты создает конструктор (чаще всего, Create). Все объекты (экземпляры классов) являются ссылками - т.е. просто указателем на память (адресом). Например: Info := TInfoObj(cbTypeDevice.Items.Objects[cbTypeDevice.ItemIndex]); Info1 := TInfoObj(cbTypeDevice.Items.Objects[cbTypeDevice.ItemIndex]); Info2 := TInfoObj(cbTypeDevice.Items.Objects[cbTypeDevice.ItemIndex]); Info - просто число, адрес в памяти. В данном примере Info,Info1 и Info2 получает одно значение, можно убедиться: WriteLn(format('Info=%p Info1=%p Info2=%p',[Info,Info1,Info2])); поэтому, если сделать Info.SomeProperty:=1111, то Info1.SomeProperty, Info2.SomeProperty будут иметь значение 1111 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2020, 11:40 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40023887&tid=2037812]: |
0ms |
get settings: |
5ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 354ms |

| 0 / 0 |
