Странность с SetLength
|
|
lideratua | Дата: Среда, 12.12.2012, 00:19 | Сообщение # 1 |
Был не раз
Зарегистрирован: 12.12.2012
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Всем привет!
На форме есть Button и Edit, в процедуре Button следующий код: Code Var s:string; begin s:=''; SetLength(s,12); edt1.Text:=s; end; Как же так выходит, что при клике на Button, в edt1.Text выводится 'comctl32.dll'? oO
Сообщение отредактировал lideratua - Среда, 12.12.2012, 00:23 |
|
| |
dolphin | Дата: Среда, 12.12.2012, 00:29 | Сообщение # 2 |
Администратор
Сообщений: 906
Статус: Offline
| lideratua, память под строку выделяется, но не очищается, поэтому в ней может быть всякого рода бинарный мусор. для очистки используй процедуру fillchar.
|
|
| |
lideratua | Дата: Среда, 12.12.2012, 00:43 | Сообщение # 3 |
Был не раз
Зарегистрирован: 12.12.2012
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Code Var s:string; begin s:=''; SetLength(s,12); FillChar(PChar(s)^, Length(s), #0); //вот так вот edt1.Text:=s; end;
dolphin, преогромное тебе спасибо! Тему можно закрывать.
Сообщение отредактировал lideratua - Среда, 12.12.2012, 00:43 |
|
| |
lideratua | Дата: Среда, 12.12.2012, 00:53 | Сообщение # 4 |
Был не раз
Зарегистрирован: 12.12.2012
Группа: Пользователи
Сообщений: 5
Статус: Offline
| если применить FillChar(PChar(s)^, Length(s), #0); в конце, то при одном клике выдает comctl32.dll, при повторных кликах - все ок. Как бы изначально сделать?
|
|
| |
dolphin | Дата: Среда, 12.12.2012, 01:07 | Сообщение # 5 |
Администратор
Сообщений: 906
Статус: Offline
| Доступно только для пользователей кстати PChar и Length уж точно не "одного поля ягоды"
Сообщение отредактировал dolphin - Среда, 12.12.2012, 01:10 |
|
| |
lideratua | Дата: Среда, 12.12.2012, 01:11 | Сообщение # 6 |
Был не раз
Зарегистрирован: 12.12.2012
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Quote (dolphin) var s : string; begin SetLength(s,12); FillChar(s,SizeOf(s),#0); Edit1.Text:= s; end;
Не работает + если в переменной 's' будет хранится строка, то все-равно мусор добавляется.
Code Var s:string; begin s:='test'; SetLength(s,12); edt1.Text:=s; end; = testtl32.dll
Code Var s:string; begin s:='test'; SetLength(s,12); FillChar(s,SizeOf(s),#0); edt1.Text:=s; end; А с этим вариантом, переменная постоянно в нуле)
Сообщение отредактировал lideratua - Среда, 12.12.2012, 01:13 |
|
| |
dolphin | Дата: Среда, 12.12.2012, 01:22 | Сообщение # 7 |
Администратор
Сообщений: 906
Статус: Offline
| Ну так бы сразу, я просто не понял что данные уже инициализированы в переменной, скорее всего когда вызывается SetLength то адрес переменной в памяти теряется и данные приходится инициализировать заново, так как переменная стала доступна по новому адресу в памяти.
FillChar(s,SizeOf(s),#0); - очищает всю строку от начала до конца. Code var s : string; i : integer; begin s:= 'test'; SetLength(s,12); for i:= 5 to length(s) do s[i]:=#0; Edit1.Text:= s; end; Думаю это то что хотите получить? Но код очень сомнительный.
Сообщение отредактировал dolphin - Среда, 12.12.2012, 01:24 |
|
| |
lideratua | Дата: Среда, 12.12.2012, 01:27 | Сообщение # 8 |
Был не раз
Зарегистрирован: 12.12.2012
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Ладно, закрывайте тему окончательно, просто было интересно, что за шлак появляется при работе) Спасибо вам за уделенное время!))
|
|
| |