Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.05.12;
Скачать: [xml.tar.bz2];

Вниз

Почему такое странное поведение/ D7   Найти похожие ветки 

 
O'ShinW ©   (2013-01-11 09:39) [0]

Захотелось сделать ошибку.
Пишу:

procedure TForm1.Button1Click(Sender: TObject);
var
 F: TForm;
begin
 F.Visible := false; // Жду AV, но исчезает форма TForm1
end;

аналогично, если
 F.Hide;// Жду AV, но исчезает форма TForm1

более интересно, если написать
 F.Visible := false;
 F.Hide;
тогда пропадает кнопка Button1


 
O'ShinW ©   (2013-01-11 09:48) [1]

AV таки получил, когда написал
 F := TForm.Create(nil);
 if F.Owner.ClassName = "" then ;

но это уже не важно, интереснее уже другое :)
ладно, что
>> исчезает форма TForm1
возможно что-то не проинициализировалось где-то
но как могло что
>> пропадает кнопка Button1


 
И. Павел ©   (2013-01-11 09:49) [2]

> [0] O"ShinW ©   (11.01.13 09:39)

Просто попадаете на случайный адрес, вот и все.
Кстати, подобная штука уже как-то тут разбиралась.


 
brother ©   (2013-01-11 09:56) [3]

> на случайный адрес

скорее всего на последний созданный данного типа...


 
O'ShinW ©   (2013-01-11 10:00) [4]


> Кстати, подобная штука уже как-то тут разбиралась.

помню.. Не помню, чем закончилось.


> скорее всего на последний созданный данного типа

не, почему же тогда то на форму, то на кнопку


> на случайный адрес

Наверное.
Но истинно случайных чисел (адресов) не бывает :)


 
Игорь Шевченко ©   (2013-01-11 10:16) [5]


> Почему такое странное поведение/ D7


Прокладку надо поменять


 
И. Павел ©   (2013-01-11 10:22) [6]

А вот такой код уже приводит к AV, хотя строчка «Caption := ...» не должна менять адрес F.

procedure TForm1.Button1Click(Sender: TObject);
var F: TForm;
begin
 Caption := IntToStr(Integer(F));
 F.Visible := false;
end;


 
брат Птибурдукова   (2013-01-11 10:28) [7]

1. Ставим в настройках проекта балку use debug dcus
2. Билдим проект
3. Ставим бряку на интересующей строке
4. Жмём Ф9
5. Жмём батон1
6. Жмём Ф7
7. ???
8. Рассказываем на форуме, что выяснили
9. PROFIT!


 
DevilDevil ©   (2013-01-11 11:31) [8]

> O"ShinW ©   (11.01.13 09:39)

я не могу понять, что тебя удивляет
стек - рабочая память, в нём лежит какой-то мусор
на определённый момент времени в стеке, где должна храниться переменная F - лежит указатель на Form1 в случае
F.Visible := false; // F.Hide;

а в более сложных конструкциях, используются дополнительные ячейки стека
и в таком случае F попадает на область памяти, в которую раньше была записана Button1
F.Visible := false;
F.Hide;


AV получаешь потому, что Owner явно указываешь nil:
F := TForm.Create(nil);
if F.Owner.ClassName = "" then ;


т.е. фактически твой AV код выглядит так:
if TObject(nil).ClassName = "" then ;


 
DevilDevil ©   (2013-01-11 11:38) [9]

> И. Павел ©   (11.01.13 10:22) [6]
>
> А вот такой код уже приводит к AV, хотя строчка «Caption := ...» не должна менять адрес F.


а ты посмотри в дебаге чему равен адрес переменной @F в разных случаях и удивись


 
Anatoly Podgoretsky ©   (2013-01-11 14:56) [10]

В приведеном коде TForm1 отсутствует, вообще нет


 
O'ShinW ©   (2013-01-11 14:58) [11]


> брат Птибурдукова   (11.01.13 10:28) [7]
8. Рассказываем на форуме, что выяснили

попали в
procedure TCustomForm.SetVisible(Value: Boolean);
begin
 if fsCreating in FFormState then


> DevilDevil ©   (11.01.13 11:31) [8]

я понимаю почему получаю AV
непонятно, почему не получаю.

т.е., получается, новая переменная не обнуляется

ShowMessageFmt(" %d %d",[Integer(Button1), Integer(F)]); //один и тот же адрес.

хотя, по-логике должна бы = nil. разве нет?


 
брат Птибурдукова   (2013-01-11 15:07) [12]


> попали в
То есть шаг 7 пропущен...


 
DevilDevil ©   (2013-01-11 15:07) [13]

> т.е., получается, новая переменная не обнуляется

обнуляются (и финализируются) только сложные типы
строки, интерфейсы, динамические массивы, варианты, структуры/статические массивы содержащие сложные типы

обычные (простые) переменные изначально не инициализируются
ни в Delphi, ни в С++
должен выдаваться ворнинг

глобальные переменные обнуляются



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2013.05.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.002 c
2-1351048982
ani
2012-10-24 07:23
2013.05.12
Передача значения из DLL в программу


4-1264859186
tippa
2010-01-30 16:46
2013.05.12
нажать кнопку в окне класса ToolbarWindow32


15-1357724900
O'ShinW
2013-01-09 13:48
2013.05.12
Подскажите по Oracle, когда такие имена даются


15-1357798190
БарЛог
2013-01-10 10:09
2013.05.12
настройка php.ini


15-1357882764
O'ShinW
2013-01-11 09:39
2013.05.12
Почему такое странное поведение/ D7





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский