Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

из dynamic Child зделать nill   Найти похожие ветки 

 
Dema-X ©   (2004-12-10 19:21) [0]

Есть массив Child типа  tform как сделать так чтобы при закрытии child:=nill а то
procedure TA.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
срабатывает но child не равен нил и генерит исключение при обращении к нему или как проверить что окно убито?


 
DiamondShark ©   (2004-12-10 19:54) [1]

procedure TA.FormClose(Sender: TObject; var Action: TCloseAction);
var
 I: integer;
begin
 Action := caFree;
 I := Low(Child);
 while (I <= High(Child)) and (Child[I] <> Sender) do Inc(I);
 if I <= High(Child) then Child[I] := nil;
end;


 
Alexander Panov ©   (2004-12-10 20:12) [2]

Пример класса, который может обнулить значение ссылки на создаваемый объект:

 TMyClass=class
 private
   FObjRef: PInteger;
   FValue: String;
 public
   constructor Create(ObjRef: Pointer; Value: String);
   destructor Destroy; override;
   class function CreateObj(ObjRef: Pointer; Value: String): TMyClass;
 end;


{ TMyClass }

constructor TMyClass.Create(ObjRef: Pointer;
 Value: String);
begin
 FValue := Value;
 FObjRef := ObjRef;
end;

class function TMyClass.CreateObj(ObjRef: Pointer;
 Value: String): TMyClass;
begin
 Result := TMyClass.Create(ObjRef,Value);
end;

destructor TMyClass.Destroy;
begin
 FObjRef^ := 0;
 inherited;
end;

Пример вызова:

var
 M: TMyClass;
begin
 M := TMyClass.CreateObj(@M,"adfsdf");
 M.Free;


 
Leonid Troyanovsky   (2004-12-10 20:18) [3]


> Есть массив Child типа  tform как сделать так чтобы при
> закрытии child:=nill а то
> procedure TA.FormClose(Sender: TObject; var Action: TCloseAction);
> begin
>  Action := caFree;
> срабатывает но child не равен нил и генерит исключение при
> обращении к нему или как проверить что окно убито?


Все формы есть в Screen.Forms.
Кроме того, у каждого компонента есть Notification.

--
С уважением, LVT.


 
Alexander Panov ©   (2004-12-10 20:21) [4]

Кстати, без функции class function CreateObj(ObjRef: Pointer; Value: String): TMyClass;
тоже можно обойтись...


 
Leonid Troyanovsky   (2004-12-10 20:32) [5]


> DiamondShark ©   (10.12.04 19:54) [1]
>  while (I <= High(Child)) and (Child[I] <> Sender) do Inc(I);


Точнее было б Self.

--
С уважением, LVT.


 
DiamondShark ©   (2004-12-10 20:36) [6]


> Leonid Troyanovsky   (10.12.04 20:32) [5]
> Точнее было б Self.



procedure TMainForm.OpenChild;
var
 ChildForm: TForm;
begin
 ChildForm := TChildForm.Create(Application);
 ChildForm.OnClose := ChildClose;
end;


Ты всё ещё уверен, что "точнее было б Self"?


 
Leonid Troyanovsky   (2004-12-10 20:42) [7]


> > Точнее было б Self.

>  ChildForm.OnClose := ChildClose;

> Ты всё ещё уверен, что "точнее было б Self"?


Уверен.
А что ты хотел сказать приведенным?

--
С уважением, LVT.


 
DiamondShark ©   (2004-12-10 20:46) [8]


> Leonid Troyanovsky   (10.12.04 20:42) [7]
> Уверен.

Аминь.


> А что ты хотел сказать приведенным?

Вы хотите об этом поговорить?


 
Leonid Troyanovsky   (2004-12-10 20:55) [9]


> Leonid Troyanovsky   (10.12.04 20:42) [7]
> >  ChildForm.OnClose := ChildClose;


А.. Только это тоже фигня.
Если уж все делать из главной формы, то и переопределяй DoClose.

И, вообще не понятна нужда в каком-то массиве Child :)

--
С уважением, LVT.


 
Leonid Troyanovsky   (2004-12-10 20:59) [10]


> DiamondShark ©   (10.12.04 20:46) [8]
> > А что ты хотел сказать приведенным?
> Вы хотите об этом поговорить?


По-взрослому? :)
Валяй(те).

--
С уважением, LVT.


 
DiamondShark ©   (2004-12-10 21:12) [11]


> Leonid Troyanovsky   (10.12.04 20:59) [10]

Так ведь просто всё.

Обработчик события может какому угодно объекту принадлежать.
Например, в моём примере -- это метод главной формы.
Так что Self тут вовсе даже не "точнее".


 
Dema-X ©   (2004-12-11 06:56) [12]

Ладно хоре спорить мужики,спасибо

> DiamondShark
твой код работает как нужно хотя я не вьехал в его сиысл :(


 
DiamondShark ©   (2004-12-11 09:15) [13]


> твой код работает как нужно хотя я не вьехал в его сиысл
> :(

А во что там въезжать? В цикл и условный оператор?
Цикл -- поиск в массиве.
Условный оператор -- проверка успешности поиска.
Функции Low и High -- встроенные функции паскаля, возвращают минимальное и максимальное значение индекса массива.


 
Leonid Troyanovsky ©   (2004-12-11 12:13) [14]


> Dema-X ©   (11.12.04 06:56) [12]
> Ладно хоре спорить мужики,спасибо


Ну, а ты так и не сказал, зачем тебе массив.
Чем MDIChildren не устраивает?
Во всяком случае, обнулять ничего не надо.

--
С уважением, LVT.



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

Текущий архив: 2004.12.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.029 c
6-1097594243
PiOnEr
2004-10-12 19:17
2004.12.26
Mozilla &amp; Delphi


9-1093801048
Sewix
2004-08-29 21:37
2004.12.26
Вывод текста в OpenGL


1-1102910118
Керик
2004-12-13 06:55
2004.12.26
Работа с папками


1-1102695692
Dema-X
2004-12-10 19:21
2004.12.26
из dynamic Child зделать nill


9-1093136923
Xerx
2004-08-22 05:08
2004.12.26
Аналог Blitz3D