Среда, 20.09.2017, 03:11 Приветствую вас Гость | Группа "Гости" 


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: xXxSh@dowxXx, Anton93, Волк-1024 
delfcode » Delphi » Вопросы по Delphi » Странность с SetLength
Странность с 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
Прикрепления: Project1.exe(366Kb)


Сообщение отредактировал lideratua - Среда, 12.12.2012, 00:23
 
dolphinДата: Среда, 12.12.2012, 00:29 | Сообщение # 2
Администратор
Сообщений: 902
Статус: 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
Администратор
Сообщений: 902
Статус: Offline
Доступно только для пользователей
кстати PChar и Length уж точно не "одного поля ягоды" umnik


Сообщение отредактировал 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
Администратор
Сообщений: 902
Статус: 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
Ладно, закрывайте тему окончательно, просто было интересно, что за шлак появляется при работе) Спасибо вам за уделенное время!))
 
delfcode » Delphi » Вопросы по Delphi » Странность с SetLength
Страница 1 из 11
Поиск:

delfcode.ru © 2008 - 2017 Хостинг от uCoz