Форум: "Основная";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
ВнизКак определить, что объект уже не жив... Найти похожие ветки
← →
aleshap (2006-01-16 10:45) [0]Добрый день!
Думаю, что вопрос простой... только не могу найти на него ответ...
Ситуация такова
var F:TForm
begin
F:=myForm;
...
при некоторый условиях происходит myForm.Free
...
Как определить, что F - это уже несуществующий объект?
end;
Заранее Спасибо!!!
← →
Fay © (2006-01-16 10:47) [1]Никак
← →
aleshap (2006-01-16 10:49) [2]такого не может быть!!!
← →
Fay © (2006-01-16 10:50) [3]2 aleshap (16.01.06 10:49) [2]
Спорим на пузырь?
← →
begin...end © (2006-01-16 10:52) [4]> aleshap (16.01.06 10:45)
Screen.Forms перебирать.
← →
aleshap (2006-01-16 10:55) [5]Если посмотреть в корень вопроса...
1. Очистили объект
2. Должна же быть функция проверки, является ли данная область актуальной?
← →
КиТаЯц © (2006-01-16 10:56) [6]ЗдОрово! Прям лирика какая-то... "объект уже не жив"..., а необорот наверное будет "объект еще не мертв"...
← →
Плохиш © (2006-01-16 10:56) [7]
> 2. Должна же быть функция проверки, является ли данная область
> актуальной?
Зачем, это лежит на совести программиста.
← →
evvcom © (2006-01-16 10:56) [8]
> Screen.Forms перебирать.
Конечно можно, но все-таки существует вероятность (маленькая правда очень), что этот адрес будет занимать, например, уже MyForm2. :)
Так что скорее все же Fay прав.
> Fay © (16.01.06 10:50) [3]
Я тебя поддержал! Пузырем поделишься? :-)
← →
Fay © (2006-01-16 10:57) [9]2 begin...end © (16.01.06 10:52) [4]
Всё равно без гарантии, что по этому адресу именно то, что нужно.
← →
Fay © (2006-01-16 10:58) [10]2 evvcom © (16.01.06 10:56) [8]
Без проблем! 8)
← →
aleshap (2006-01-16 11:01) [11]Ну так что скажите господа?
← →
Плохиш © (2006-01-16 11:01) [12]
> aleshap (16.01.06 11:01) [11]
> Ну так что скажите господа?
Пузырь давай.
← →
umbra © (2006-01-16 11:02) [13]2 aleshap (16.01.06 10:45)
для уверенности надо вести свой собственный список форм и регулярно его обновлять
← →
evvcom © (2006-01-16 11:04) [14]О! На пузырь нас уже трое.
> Ну так что скажите господа?
Мы уже всё сказали. Ждем пузырь теперь.
← →
Fay © (2006-01-16 11:05) [15]2 Плохиш © (16.01.06 10:56) [7]
Только что смотрел - ничего там не лежит! 8)
← →
aleshap (2006-01-16 11:06) [16]Понятно... спасибо за участие...
можете вопрос переводить в разжел "потрепаться"
← →
aleshap (2006-01-16 11:07) [17]извините отпечатка: раздел
← →
sniknik © (2006-01-16 11:07) [18]для формы можно просто на событие onDestroy написать f:= nil; и проверять на него.
← →
begin...end © (2006-01-16 11:07) [19]> evvcom © (16.01.06 10:56) [8]
> Конечно можно, но все-таки существует вероятность (маленькая
> правда очень), что этот адрес будет занимать, например,
> уже MyForm2.
И что? Если так случится, то F (см. вопрос) -- это существующая форма, пусть и другая.
← →
aleshap (2006-01-16 11:10) [20]Вопрос не сводиться строго к объектам типа TForm.
← →
evvcom © (2006-01-16 11:12) [21]
> И что? Если так случится, то F (см. вопрос) -- это существующая
> форма, пусть и другая.
Да, тоже согласен. Автор этого не сказал, но скорее всего он ожидает в этом F все же тот первоначальный myForm, ведь ничего другого он туда не клал!
← →
Fay © (2006-01-16 11:14) [22]2 begin...end © (16.01.06 11:07) [19]
> И что?
Представьте, что Вы приходите домой, а Ваша жена с каким-то мужиком. Он - не Вы, но существующий. Аргументы вида "И что?" примите?
← →
Fay © (2006-01-16 11:15) [23]2 aleshap (16.01.06 11:10) [21]
См. [1]
← →
aleshap (2006-01-16 11:16) [24]Да но... по визуальной внешности я отлично пойму, что он это не я...
← →
Плохиш © (2006-01-16 11:18) [25]
> Fay © (16.01.06 11:05) [15]
> 2 Плохиш © (16.01.06 10:56) [7]
> Только что смотрел - ничего там не лежит!
А где ты у программиста совесть нашёл? ;-)
> Fay © (16.01.06 11:15) [23]
> 2 aleshap (16.01.06 11:10) [21]
> См. [1]
Stack overflow
← →
aleshap (2006-01-16 11:19) [26]в конце концов по имени....паспорту...
вы Fay при сылке на [1] видимо фантазируете
← →
Fay © (2006-01-16 11:19) [27]2 aleshap (16.01.06 11:16) [24]
Я не говорил, что "какой-то" мужик - это Вы.
LOL
← →
evvcom © (2006-01-16 11:20) [28]
> Вопрос не сводиться строго к объектам типа TForm.
Конечно, можно попробовать обернуть в try попытку доступа к "объекту" типа такого:try
if F is TMyForm then
TMyForm(F)...
except
ShowMessage("Пошел на фиг, меня уже нет!");
end;
← →
aleshap (2006-01-16 11:21) [29]по крайней мере во время нашей беседы на нашел уже один выход их сложившейся ситуации... просто не хочется к нему прибегать... хочеться проще и красивее
← →
begin...end © (2006-01-16 11:22) [30]> Fay © (16.01.06 11:14) [22]
Я считаю, что ответ [19] на первоначальный вопрос правилен. Аргументов в пользу обратного я не услышал. Ваши фантазии относительно моей жены (которой у меня нет, и, скорее всего, не будет) меня не интересуют.
← →
evvcom © (2006-01-16 11:22) [31]
> evvcom © (16.01.06 11:20) [28]
Забыл дописать "но лучше так все равно не делать", увлекся.
← →
Fay © (2006-01-16 11:27) [32]2 begin...end © (16.01.06 11:22) [30]
Я понял, это был ответ на вопрос "Как определить, что F - это уже несуществующий объект?".
Всё-таки сложно иногда без (не)определённых артиклей.
← →
aleshap (2006-01-16 11:31) [33]Fay © (16.01.06 11:27) [32] да вы правы
← →
evvcom © (2006-01-16 11:40) [34]
> Я считаю, что ответ [19] на первоначальный вопрос правилен.
> Аргументов в пользу обратного я не услышал.
Пожалуйста, аргумент. В частном случае это сойдет, а в общем нет. Этот способ не является универсальным гарантированным способом. Например, я такой извращенец оверрайдил CreateNew и извратился и сделал так, что Screen.AddForm(Self); не отработала. Ну захотелось мне, чтобы моя форма вдруг стала не видимой для тех, кто их ищет через Screen.
Так что я настаиваю на пузыре!
← →
Ega23 © (2006-01-16 11:45) [35]Везде после TCustomForm.Free ставить TCustomForm:=nil.
Ну и потом проверять, типа if Assigned(F) then ...
← →
Fay © (2006-01-16 11:46) [36]2 evvcom © (16.01.06 11:40) [34]
Не парьтесь! Из вопроса и из [20] не следует, что объект - наследник TForm.
Скажу больше, это просто указатель куда-то, поэтому говорить о Screen.Forms не имеет смысла.
← →
evvcom © (2006-01-16 11:49) [37]
> Из вопроса и из [20] не следует, что объект - наследник
> TForm
Да я это давно понял, но даже если и следовало бы, то аргумент в [34]. Т.е. в общем случае даже для TForm [1].
← →
TUser © (2006-01-16 11:59) [38]Используй FreeAndNil
← →
begin...end © (2006-01-16 12:05) [39]> evvcom © (16.01.06 11:40) [34]
Странно, что Вы не предположили, что объект Screen уничтожен, или что TForm -- это вовсе не класс формы, а какой-то другой класс с таким именем.
← →
Плохиш © (2006-01-16 12:07) [40]
> TUser © (16.01.06 11:59) [38]
> Используй FreeAndNil
И чем он в этом случае поможет? ;-)
> var F:TForm
>
> begin
> F:=myForm;
> ...
> при некоторый условиях происходит myForm.Free
← →
Fay © (2006-01-16 12:11) [41]2 begin...end © (16.01.06 12:05) [39]
Это уже лишнее.
← →
evvcom © (2006-01-16 12:20) [42]
> Странно, что Вы не предположили, что объект Screen уничтожен
Ну я все же не садист! Вдруг он кому-то все же нужен.
> или что TForm -- это вовсе не класс формы, а какой-то другой
> класс с таким именем.
А это уже крутой мазохизм.
P.S. Ко мне можно на ты.
← →
tesseract © (2006-01-16 17:17) [43]А почему просто не попробовать Assigned?
Даже если указатель на объект освобождён, то он может указывать на мусор области памяти, что выявит Assigned.
Или при освобождении объекта использовать FreeAndNil или
Object.free;
Object:=nil;
тогда достаточно проверить объект на nil.
← →
Fay © (2006-01-16 17:20) [44]2 tesseract © (16.01.06 17:17) [43]
> А почему просто не попробовать Assigned?procedure TForm1.Button1Click(Sender: TObject);
const
a : array[Boolean] of String = ("No", "Yes");
var
sl : TStringList;
begin
sl := TStringList.Create;
sl.Free;
ShowMessage(a[Assigned(sl)])
end;
← →
Плохиш © (2006-01-16 17:24) [45]
> tesseract © (16.01.06 17:17) [43]
> то он может указывать на мусор области памяти, что выявит Assigned.
А заглянуть в реализацию Assigned, слабо?
> тогда достаточно проверить объект на nil.
Читать [40] до полного прояснения ;-)
← →
Zeqfreed © (2006-01-16 17:53) [46]Assigned равнозначно сравнению с nil. А что касается, собственно сабжа — ответ в [18] считаю вполне удовлетворительным.
← →
Leonid Troyanovsky © (2006-01-16 18:13) [47]
> Zeqfreed © (16.01.06 17:53) [46]
> Assigned равнозначно сравнению с nil. А что касается, собственно
> сабжа — ответ в [18] считаю вполне удовлетворительным.
Удовлетворительным для ссылок на компонент следует признать
использование механизма Notification, т.е. обнуление при opRemove.
А использование глобальных переменных, вообще, MD.
--
Regards, LVT.
← →
evvcom © (2006-01-17 09:07) [48]
> А что касается, собственно сабжа — ответ в [18] считаю вполне
> удовлетворительным.
Ты бы хоть всю ветку сначала почитал для таких заявлений.
← →
Zeqfreed © (2006-01-17 10:31) [49]evvcom © (17.01.06 9:07) [48]
Перед тем как я отправил свой пост [46] я прочитал всю ветку, даже посты про чьих-то мужей, которые фактически существуют, но не настоящие. Если у Вас есть какое-то мнение относительно моего поста, то выскажете его, пожалуйста, не выдвигая мне каких бы то ни было голословных обвинений. На текущий момент я не вижу причин, почему решение высказанное в [18] нельзя считать удовлетворительным. Разве что механизм уведомлений, предложенный в [47] является более элегантным решением.
← →
eugie (2006-01-25 06:33) [50]Способ 1: объявлять переменную типа SomeVariable:T[SomeObject] с областью видимости, которая обеспечивала бы обращение к ней из необходимых модулей. Перед созданием и после уничтожения объекта SomeVariable присваивать nil и проверять на это значение.
Способ 2: вести глобальный список объектов, например TStringList, в который добавлять objects - указатели на определенные объекты.
← →
PVOzerski © (2006-01-25 11:26) [51]Что значит "при некоторых условиях"? Если эти "некоторые условия" находятся в рамках тобой же написанного кода, почему нельзя заменить все "критические" Free на FreeAndNil. Если же нет, вставь, например, в обработчики событий OnCreate и OnDestroy "регистрацию" и "разрегистрацию" объекта. В более универсальном случае, не только для форм, можно переопределить конструктор и деструктор. Естественно, конструктор и деструктор базового объекта должны быть виртуальными или динамическими. Формы этому требованию удовлетворяют тоже.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
Form1Lives: boolean = false;
constructor TForm1.Create(AOwner: TComponent);
begin
Form1Lives := true;
inherited;
end;
destructor TForm1.Destroy;
begin
inherited;
Form1Lives := false;
end;
end.
← →
Leonid Troyanovsky © (2006-01-25 12:18) [52]
> PVOzerski © (25.01.06 11:26) [51]
> var
> Form1Lives: boolean = false;
>
> constructor TForm1.Create(AOwner: TComponent);
> begin
> Form1Lives := true;
> inherited;
> end;
Млин, ну сколько про это говорено.
Ну, не положено ООПрограммистам плодить глобальные переменные.
Особенно в таких случаях, когда объектов может быть более одного.
--
Regards, LVT.
← →
PVOzerski © (2006-01-25 13:38) [53]2Leonid Troyanovsky © (25.01.06 12:18) [52]
Дык это же простенький пример :) Естественно, для N объектов это будет список из N флажков. Чем тут плох глобальный динамический массив или список? В конце концов, OOP - не религия. А список можно и инкапсулированный использовать - хоть наследника TList.
← →
Рустем © (2006-01-25 13:50) [54]
> aleshap
См. [18]!
← →
Fay © (2006-01-25 14:15) [55]2 Рустем © (25.01.06 13:50) [54]
Вам очевидно, что класс форма знает про некую конкретную f?
← →
Leonid Troyanovsky © (2006-01-25 14:32) [56]
> PVOzerski © (25.01.06 13:38) [53]
> массив или список? В конце концов, OOP - не религия. А список
> можно и инкапсулированный использовать - хоть наследника TList.
Такой список уже есть - Screen.Forms, содержит только живые формы.
Т.е., ничего и отслеживать не надо.
Хотя, я почему-то думал что данная дискуссия в "Начинающих", а так бы,
конечно, промолчал, бо в оной ветке уже все разжевано и пошло по кругу.
--
Regards, LVT.
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.037 c