Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 592
от 14.09.2006, 19:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 378, Экспертов: 63
В номере:Вопросов: 2, Ответов: 3


Вопрос № 54783: Здравствуйте, уважаемые эксперты. Подкиньте, пожалуйста, порчку не липовых ссылок на файл DShow.pas (DirectShow). Заранее благодарен. /Iorpyc....
Вопрос № 54837: Здравствуйте уважаемые эксперты!!! Создаю динамически (в runtime) компоненты TEdit методом Create. Практически сразу же освобождаю память методом Free. Необходимо далее использовать имя созданного компонента повторно, например, Edit1, но для этог...

Вопрос № 54.783
Здравствуйте, уважаемые эксперты. Подкиньте, пожалуйста, порчку не липовых ссылок на файл DShow.pas (DirectShow). Заранее благодарен.
/Iorpyc.
Отправлен: 08.09.2006, 21:48
Вопрос задал: /Iorpy$ (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Савенко Вадим Иванович
Здравствуйте, /Iorpy$!
Посмотрите здесь:

http://www.clootie.ru/news_2003_H2.html

Ответ отправил: Савенко Вадим Иванович (статус: 10-ый класс)
Ответ отправлен: 09.09.2006, 13:11
Оценка за ответ: 5


Вопрос № 54.837
Здравствуйте уважаемые эксперты!!!
Создаю динамически (в runtime) компоненты TEdit методом Create. Практически сразу же освобождаю память методом Free. Необходимо далее использовать имя созданного компонента повторно, например, Edit1, но для этого, как я понял, необходимо уничтожить ранее созданный с именем Edit1 компонент. Пытаюсь сделать это методом Destroy (сам не в курсе как он работает, просто знаю как он переводится), но программа или операционная система выдает ошибку: Project хххх.exe raised exception class EAccessViolation with message \'Access violation at address 00000000. Read of address 00000000\'. Process stopped. Use Step or Run to continue. Вопрос: как уничтожить (или сделать что-то другое?!) созданный методом Create компонент со всеми его характеристиками, в том числе и именем, чтобы впоследствии использовать его имя для нового компонента, так же создаваемого в runtime? Спасибо.
P.S. Извините, что не силен в терминологии Delphi.
Отправлен: 09.09.2006, 18:10
Вопрос задал: Piit (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Piit!
Насколько я помню, деструктор Destroy вообще обычно напрямую в коде никогда не вызывется. Но это еще ничего - я его вызывал и ничего ужасного не происходило. Но вообще-то, по сути Free и Destroy - практически одно и то же. А после освобождения памяти указатель часто обнуляется. Вот вы его обнулили методом Edit1.Free, а потом пытаетесь вызвать деструктор для объекта, указатель на который равен нулю. Вот и Read of address 00000000.
Короче, используйте Destroy или, даже лучше, FreeAndNil (см. приложение)
А освобождение памяти - это и есть уничтожение компонента. После того, как обнулили указатель, все, забудьте - нет больше такой переменной. Пока заново не присвоите.

Приложение:

---------
Не узнаешь - не попробуешь.

Ответ отправил: Сухомлин Кирилл Владимирович (статус: Студент)
Ответ отправлен: 09.09.2006, 20:21
Оценка за ответ: 5

Отвечает: Zлоумышленник
Здравствуйте, Piit!
{...необходимо уничтожить ранее созданный с именем Edit1 компонент...} Необходимо освободить выделенные в конструкторе ресурсы, лучше всего методом free, который в отличие от destroy проверяет наличие или отсутствие собственно выделенных ресурсов.
--------------------------------------
Вот пример использования одной переменной 11 раз:
procedure TForm1.Button1Click(Sender: TObject);
var
Edit1: TEdit;{вы это назвали имя, в эту переменную запишется указатель на адрес в памяти, куда будет помещён созданный объект}
i: Integer;
begin
for i := 0 to 10 do
begin
Edit1 := TEdit.Create(self);//Создаём
try
Edit1.Parent := Self;//Родитель - форма
Edit1.Text := IntToStr(i);//Пишем значение i
Application.ProcessMessages;//Даём Винде обработать обновление Edit'а
Sleep(1000);//Пауза в секунду дабы успеть рассмтреть хоть что-то :)
finally
Edit1.Free;//Собственно освобождение Эдита
end;
end;
end;
------------------------------------------
Можно вообще не использовать "имя":
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 10 do
begin
with TEdit.Create(self) do
begin
try
Parent := Self;//Родитель - форма
Text := IntToStr(i);//Пишем значение i
Application.ProcessMessages;//Даём Винде обработать обновление Edit'а
Sleep(1000);//Пауза в секунду дабы успеть рассмтреть хоть что-то :)
finally
Free;//Собственно освобождение ресурсов
end;
end;
end;
end;
------------------------
Желаю вам успеха!
Ответ отправил: Zлоумышленник (статус: 10-ый класс)
Ответ отправлен: 09.09.2006, 21:16
Оценка за ответ: 5


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.36 от 06.09.2006
Яндекс Rambler's Top100

В избранное