Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1135669029
DELORAC
2005-12-27 10:37
2006.02.26
Как получить из базы Oracle тексты создания таблиц?


4-1134166676
Volf_555
2005-12-10 01:17
2006.02.26
Ошибка при получинии первых восьми символов строки


1-1138114582
Квэнди
2006-01-24 17:56
2006.02.26
На какой форме произошло исключение


6-1132258866
serko
2005-11-17 23:21
2006.02.26
Доступ на папку только на чтение!


1-1138254587
СержК
2006-01-26 08:49
2006.02.26
Как ограничить по времени "замирание" программы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский