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

Вниз

EOutOfResources   Найти похожие ветки 

 
Piter ©   (2004-05-23 14:08) [0]

Ловлю баг в программе, возникает периодически :(
Но вот тут добился, что одна и таже последовательность действий приводит к ошибке.
Непосредственно ошибка возникает в такой функции:

var
 i:integer;
begin
 setlength(ArrForm, length(ArrForm)+1);
 i:=High(ArrForm);
 ArrForm[i]:=TMDIChild.Create(MainForm); // Ошибка


где

ArrForm: TArrayMDIChild;
TArrayMDIChild = array of TMDIChild ;


TMDIChild соответствено Child форма, MainForm - главная форма (приложение MDI).

Ошибку пишет такую:

EOutOfResources with message "Дочерние окна не могут иметь меню"

Никак не могу понять - что криминального в этих строчках. Если у кого есть какие предположения - высказывайтесь.
Абсолютно не понимаю почему EOutOfResource, формы всего две.

В VCL ошибка начинается в процедуре ReadIcon.

Icon := CreateIcon(HInstance, IconSize.X, IconSize.Y,
           XorInfo.bmPlanes, XorInfo.bmBitsPixel, AndMem, XorMem);
         if Icon = 0 then GDIError;


Вот Icon как раз 0, вызывается GDIError и выводится ошибка...

P.S. Не надо спрашивать зачем нужен ArrForm. Нужен и все.


 
Piter ©   (2004-05-23 21:19) [1]

Ну неужто никаких идей, скажите хоть что-нибудь


 
Polevi ©   (2004-05-23 21:27) [2]

FormStyle ?


 
Anatoly Podgoretsky ©   (2004-05-23 21:36) [3]

Трудно отвечать, поскольку спрашивать запрещаешь.


 
Piter ©   (2004-05-23 23:18) [4]

Polevi (23.05.04 21:27) [2]
FormStyle ?


А что с ним не так?
У MainForm он fsMDIForm, у TMDIChild он fsMDIChild

Anatoly Podgoretsky (23.05.04 21:36) [3]
Трудно отвечать, поскольку спрашивать запрещаешь


Вы про ArrForm? ну нужен он мне, какая разница зачем? Ведь можно же так сделать, ничего криминального нету? Массив форм, что такого...
Я не про эффективность программы, я про ошибку - почему она вылезает?
Тем более такая странная... не хватает ресурсов... а еще точнее CreateIcon приводит к ошибке. Что за нафиг?


 
Cobalt ©   (2004-05-24 01:41) [5]

И на каком количестве дочрних окон это происходит?
Или же ошибка происходит в создании, а не в массиве?
Что у тебя в OnCreate TMDIChild?
Попробуй создать тестовый примерчик работы с MDI - код тот же самый в том, что касается создания и удаления. Будут ошибки?


 
Piter ©   (2004-05-24 19:59) [6]

Cobalt (24.05.04 01:41) [5]
И на каком количестве дочрних окон это происходит?


на абсолютно разном. Когда как... не в том дело, видимо...

Cobalt (24.05.04 01:41) [5]
Или же ошибка происходит в создании, а не в массиве?


я указал на какой строчке происходит ошибка. Также я указал, где в недрах VCL происходит ошибка...

Cobalt (24.05.04 01:41) [5]
Что у тебя в OnCreate TMDIChild?


одна строчка:

procedure TMDIChild.FormCreate(Sender: TObject);
begin
 Sock:=nil;
end;


Где Sock: TMySock;
TMySock это класс для управления передачей информации по сети. В любом случае, он здесь не при чем.

Cobalt (24.05.04 01:41) [5]
Попробуй создать тестовый примерчик работы с MDI - код тот же самый в том, что касается создания и удаления. Будут ошибки?


конечно, нет! Тут то ошибка происходит черт знает по каким числам.

Я просто не знаю что думать. Может, проверить состояние каких-нибудь переменных или еще чего. Ведь ошибка возникает при вызове WinApi функции CreateIcon... что же делать...


 
Piter ©   (2004-05-24 22:05) [7]

Народ, помогайте! А то я удавлюсь...


 
Cobalt ©   (2004-05-24 23:17) [8]

Ну, что могу посоветовать - удаляй из проекта разные компоненты пока не избавишься от ошибки. А как найдёшь - с каким компонентом ошибка выскакивает - начинай отлаживать.
P.S. используешь где низкоуровневые(WinAPI) функции?
P.P.S. и не "помогайте", а  помогите.


 
Polevi ©   (2004-05-24 23:18) [9]

конструктор TMDIChild


 
Polevi ©   (2004-05-24 23:19) [10]

заодно проверь не перегружен ли CreateParams


 
Piter ©   (2004-05-24 23:52) [11]

Polevi (24.05.04 23:18) [9]
конструктор TMDIChild


чего? Я не понял. Обработчик OnCreate я привел...
А конструктор, естественно, от TCustomForm. Как у формы можно конструктор перекрыть...

Polevi (24.05.04 23:19) [10]
заодно проверь не перегружен ли CreateParams


я не перегружал... значит, не перегружен.

Cobalt (24.05.04 23:17) [8]
Ну, что могу посоветовать - удаляй из проекта разные компоненты пока не избавишься от ошибки


ты так шутишь? И что удалять? Может, без форм обойтись?

Cobalt (24.05.04 23:17) [8]
А как найдёшь - с каким компонентом ошибка выскакивает - начинай отлаживать.


я уже говорил, что ошибка возникает в вызове WinApi функции CreateIcon, она возвращает ноль, то есть неудачный вызов.

GetLastError дает "EOutOfResources with message "Дочерние окна не могут иметь меню"
Я согласен, что это у меня дочернее окно. Но про какое меню идет речь? Там у дочерних форм есть PopUp меню... даже два их... но почему она не может их иметь? Странности какие-то

P.S. Чувствую, в ФИДО мне нужно... или вот попробую задать вопрос на "Королевстве"...


 
nikkie ©   (2004-05-25 00:34) [12]

>Как у формы можно конструктор перекрыть...
элементарно. также как и у любого другого класса.

>ты так шутишь? И что удалять? Может, без форм обойтись?
никаких шуток. создай новое MDI-приложение, где написан тот код, который ты здесь привел. ошибки нет? значит ошибка вызвана не им, а чем-то другим в твоем проекте. бери проект с ошибкой и вычищай оттуда все подряд, пока не оставишь голые формы или пока ошибка не исчезнет. сделал минимальный проект - выложи для всеобщего доступа.


 
Piter ©   (2004-05-25 09:48) [13]

nikkie (25.05.04 00:34) [12]
элементарно. также как и у любого другого класса


да? Приведи пример :)

nikkie (25.05.04 00:34) [12]
создай новое MDI-приложение, где написан тот код, который ты здесь привел. ошибки нет? значит ошибка вызвана не им, а чем-то другим в твоем проекте


ты понимаешь, что ошибка возникает раз в сто обращений. МожетЮ даже реже. Активно работает с базой данных. Результаты работы выносит на форму...
Что вычищать? Что удалять? Удалив хоть немного, приложение станет неработоспособным... тестировать его будет невозможно... (как можно тестировать неработающее приложение?)
Не тупо же создавать и удалять эти формы?


 
DiamondShark ©   (2004-05-25 13:57) [14]


> тестировать его будет невозможно

Ещё невозможнее тестировать приложение с миллионом функций.
Если у тебя нет архива версий, то откатиться до последней стабильной конфигурации нельзя. Тебе предлагают единственный возможный выход -- исключать функциональность до получения стабильной программы. Пусть она будет состоять на 90% из пустышек и заглушек. Но ты хоть как-то очертишь круг возможных причин. Иначе можно до потери пульса медитировать над строчкой, где происходит исключение, и так и не добиться просветления. Пойми, что исключение -- это последнее следствие возможно очень большого количества причин.


 
Piter ©   (2004-05-25 18:15) [15]

DiamondShark (25.05.04 13:57) [14]
исключать функциональность до получения стабильной программы


а как ее тестировать?!?! Просто открывать окна? И ничего в них не отображать?


 
Cobalt ©   (2004-05-25 18:46) [16]

>  Просто открывать окна? И ничего в них не отображать?
Совершенно верно. Об этом и велась речь (заглушки).


 
Piter ©   (2004-05-25 20:16) [17]

Cobalt (25.05.04 18:46) [16]
>  Просто открывать окна? И ничего в них не отображать?
Совершенно верно. Об этом и велась речь (заглушки).


глупо. Посмотрите на код. Он же верный, элементарный. Ну поставлю я его в цикл? Сделает он 100 окон, поток закроет... и что?


 
nikkie ©   (2004-05-25 21:08) [18]

>Посмотрите на код. Он же верный, элементарный.
посмотрели. ошибок в нем нет. значит, ошибка где-то в другом месте. что дальше?


 
Piter ©   (2004-05-25 23:51) [19]

nikkie (25.05.04 21:08) [18]
посмотрели. ошибок в нем нет. значит, ошибка где-то в другом месте. что дальше?


эх, это ты меня спрашиваешь что дальше? Послушай, Николай, ты раздражен моим ответом?
Я ведь не знаю в чем причина, в чем ошибка. Я описал ошибку, я выложил что раскопал, ну что я еще могу сделать?

Ошибка пренеприятнейшая, выскакивает очень периодически. Помнишь, ты сам говорил, что у тебя иногда в программе выскакивает AV (в DMClient"е, по-моему). Вот это по типу такой ошибки, только возникает почаще,  я так понимаю.
Ну что можно сказать? Знал бы в чем дело - ликвидировал.
Вы предлагаете убрать некие составляющие. Но это нереально. Вы видели код создания MDI окна? Он простейший, естественно, я и не думал, что причина в нем.
Значит, ошибка в другом месте кода, а кода много. Все не выложишь.
И почему я задал вопрос - для меня остается непонятным что за ошибка.

EOutOfResources with message "Дочерние окна не могут иметь меню"

даже тип ошибки EOutOfResources никак не клеится с расшифровкой "Дочерние окна не могут иметь меню".
Если не могут - так это не то, чтобы не хватает ресурсов, это должен быть другой тип ошибки.
И сама фраза "Дочерние окна не могут иметь меню" - ну ведь нету там никаких меню...

Я первый раз сталкиваюсь, чтобы CreateIcon возвращала ноль. Потому и спрашиваю, ведь кто-то может наблюдал это, может у него есть хоть какие-то зарисовки на тему почему так получается.
Может, нужно проверить какие-то параметры, передаваемые в какую-нибудь функцию, я же не знаю. Я не в состоянии трассировать каждую выполняемую строчку в дебаггере.

И тут еще одна неприятность произошла. Я нашел последовательность действий, которая всегда приводила к ошибке, слава богу хоть что-то постоянное. Но вот с недавних пор это уже не приводит к ошибкe. После перезагрузки что ли изменилось? Мистика, в общем...

Мне пока в голову пришло только одно, коли уж ошибка редко вылезает, то тупо эмулировать действие пользователя. Цикл что ли какой хитроумный написать, ну типа пользователь жмет на кнопку - выполняется процедура. А мне из цикла самому эти процедуры вызывать, как будто пользователь работает. И все это поставить работать непрерывно, должна же ошибка вылезать...
В общем, писать под программу комплекс тестирования. Но хлопотное это дело, если у кого есть какие соображения - я бы лучше их выслушал...


 
Piter ©   (2004-05-26 18:52) [20]

Никто ничего не скажет?


 
nikkie ©   (2004-05-26 20:01) [21]

>Ошибка пренеприятнейшая, выскакивает очень периодически. Помнишь...
понимаю это прекрасно. ошибки такие ловить тяжело. и простого пути тут нет. а ты ставишь вопросы так, как будто хочешь, чтобы твою проблему кто-то другой решил. отсюда и раздражение, которое ты заметил в моем посте. извини, постараюсь такого не допускать. но и тебе бы хорошо на разумные советы не отвечать "глупо. Посмотрите на код."

медитация на приведенным кодом ничего не даст. наверное, надо верить Дельфи - проблема действительно в нехватке ресурсов. Особенно, если после разового возникновения этой ошибки, она возникает постоянно до перезапуска программы, скажем.

честно говоря, не знаю тула, которым можно было бы отследить используемые ресурсы. когда-то под 98-ми пользовался программкой Resource Meter - если программа небрежно обращалась с ресурсами, то это было заметно. если проблема с ресурсами и ты можешь запустить программу под 9x - ошибка станет очевиднее.

заметь, что ты даже не описал, с чем именно работает твоя программа. по оброненным тобой фразам понятно, что там есть работа с базой и сокетами. могу предположить, что в ней есть также WebBrowser. если с ним ты обращаешься где-то неаккуратно, то вполне возможна утечка из-за него.


 
Cobalt ©   (2004-05-26 20:14) [22]

Пропробуй использовать MemProof - может у тебя где утечка
Используешь где низкоуровневые(WinAPI) функции?
Может, хуки есть какие (например, от сторонних программ)?


 
Piter ©   (2004-05-26 22:51) [23]

nikkie (26.05.04 20:01) [21]
Особенно, если после разового возникновения этой ошибки, она возникает постоянно до перезапуска программы


да, так и есть,но думаю из-за того, что программа просто стала неправильно работать. При попытке продолжить работу она зависает, выкидывает AV и т.д.

nikkie (26.05.04 20:01) [21]
наверное, надо верить Дельфи - проблема действительно в нехватке ресурсов


ну Дельфи тут вообще не при чем. Я уже говорил несколько раз, что ошибка начинается с CreateIcon, она возвращает ноль. И после нее GetLastError возвращает такую строчку с ошибкой... так что можно доверять Windows, а я ей не доверяю :)
Насчет нехватки ресурсов - да не может быть, ошибка может проявиться в первую минуту работы. Один раз кликнуть по теме, откроется ВТОРОЕ окно и ошибка будет. А может долго работать с закрытием/открытием множества окон и без всяких ошибок...

nikkie (26.05.04 20:01) [21]
заметь, что ты даже не описал, с чем именно работает твоя программа


да собственно говоря это Magic Forum :)
Зря я, наверное, сказал, ибо теперь ты не будешь помогать :( получается, своими руками конкурентов плодишь...

nikkie (26.05.04 20:01) [21]
могу предположить, что в ней есть также WebBrowser. если с ним ты обращаешься где-то неаккуратно, то вполне возможна утечка из-за него


опять же, почему проявляется то в начале программы, то может долго работать без всяких утечек?

Cobalt (26.05.04 20:14) [22]
Используешь где низкоуровневые(WinAPI) функции?


сосбтвенноручно не использую.

Cobalt (26.05.04 20:14) [22]
Может, хуки есть какие (например, от сторонних программ)?


нету

Я вот чего совсем не понимаю, почему CreateIcon возвращает ноль? Ну вот уперлось мне это... думаю, если понять почему - дальше можно строить умозаключения.
Может кто привести пример, чтобы CreateIcon возвращала ноль? Это сколько же программа должна сожрать памяти, чтобы не удалось выполнить CreateIcon? Аналогичная ситуация с CreateWindow - не могу представить сколько надо создать окон, чтобы она вернула ноль. Даже в Win95 можно создать более 16000 окон... думаю, иконок можно создать не меньше...
все мне было бы понятно, если бы не "нехватка ресурсов". Ну черт побери - когда не хватает ресурсов, машина хоть бы тормозить стала что ли... ничего подобного...

Я вот блин не догадался проверить какие параметры передаются в функцию CreateIcon, может они неправильные, функция возвращает ноль, а GetLastError просто возвращает некорректную ошибку, просто глюк windows? Бывает же такое

P.S. Кстати, Nikkie, ты не правил EmbeddedNS в последнее время? А то может ты исправил глюк там какой...


 
Piter ©   (2004-05-26 22:52) [24]

Вот, кстати, ответ на королевстве:

setlength(ArrForm, length(ArrForm)+1);
i:=High(ArrForm);
ArrForm[i]:=TMDIChild.Create(MainForm); // Ошибка

подобным образом создавал массив объектов,
глючило, пока не сделал в другом порядке

TempObject:=TObject.Create;
setlength(ObjectsArray,length(ObjectsArray)+1);
ObjectsArray[length(ObjectsArray)-1]:=TempObject;


По-моему, это уже шаманство какое-то, но я к нему готов...


 
Игорь Шевченко ©   (2004-05-26 23:08) [25]


> Может кто привести пример, чтобы CreateIcon возвращала ноль?
>


SysErrorMessage(GetLastError) в студию.


 
nikkie ©   (2004-05-26 23:24) [26]

>Piter
на все твои вопросы "почему" я ответить не могу. и не хочется гадательством заниматься. одна попытка - если не получиться угадать в чем твоя проблема, то тебе один путь - см. [14] DiamondShark

и вот попытка: у тебя в коде есть код типа WebBrowser.Document?

>да собственно говоря это Magic Forum :)
да я, собственно, догадываюсь. про WebBrowser я не просто так сказал. ты просто учитывай, что не все как я знают, какого рода программу ты пишешь и на какой операционной системе тестируешь. так что когда задаешь вопрос, то не лишним будет описать программу и ОС.

>ты не правил EmbeddedNS в последнее время?
первое и последнее (пока) изменение
(*  v1.01  03/04/2004 NA                                                      *)
(*        A problem with thread creation is fixed.                            *)
(*        The problem sometimes resulted in AV.                               *)


>Вот, кстати, ответ на королевстве:
и после этого говорят, что на королевстве уровень отвечающих выше :))
ну попробуй пошаманить, вдруг получится.


 
Piter ©   (2004-05-30 18:12) [27]

up


 
RealRascal ©   (2004-05-30 22:16) [28]


> Cobalt (24.05.04 23:17) [8]
> Ну, что могу посоветовать - удаляй из проекта разные компоненты
> пока не избавишься от ошибки
>
> ты так шутишь? И что удалять? Может, без форм обойтись?

А это действительно может быть дельной мыслью. У меня как-то было такое - написал основной код, начал занимаца приукрашательством, удобства всякие навешивать, батончики, мемошки...
И вот тут фигня какая-то (мистическая прямо таки:)) стала происходить:
Кладешь на форму чекбокс, компилишь, запускаешь на вычисления - AV.
Убираешь чекбокс, копмилишь, запускаешь на вычисления - все ок.
Никаких изменений в коде, событий на чекбокс никаких, просто - AV и все тут! Хоть ты тресни! Так я до истины не докопался, времени небыло, надо было курсач расчитывать, плюнул я на это и без чекбокса этого обошелся. А народ в этом форуме мне говорил, что это из-за использования указателей (или что-то там вроде этого). Еще говорили про Range Checking, но мне это не помогло...


 
kombat ©   (2004-05-31 01:21) [29]

2 RealRascal ©
Это да, иногда такие непонятки возникают. Кинул на форму JvPopupMenu, никакого кода на нем нет. И при закрытии приложения с незакрытой формой с JvPopupMenu вылазит AV. Заменил на обычный PopupMenu - все пришло в норму.
Это конечно не мистика, все как-то объясняется, но ...


 
Piter ©   (2004-05-31 18:30) [30]

nikkie (25.05.04 00:34) [12]
>Как у формы можно конструктор перекрыть...
элементарно. также как и у любого другого класса


Nikkie, ты так и не привел примера!


 
kombat ©   (2004-05-31 18:35) [31]

constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; AParent: TWinControl);      reintroduce; overload;

===================================================

constructor TfrmBIT_BaseForm.Create(AOwner: TComponent);
begin
 FAsChild := False; { форма не внедренная, базовый конструктор }
 inherited Create(AOwner);
end; { end of Create }
//************************************************

constructor TfrmBIT_BaseForm.Create(AOwner: TComponent; AParent: TWinControl);
begin
 FAsChild := True; { форма внедренная, переопределенный конструктор }
 FTempParent := AParent;
 inherited Create(AOwner);
end; { end of Create }


 
Piter ©   (2004-05-31 18:48) [32]

А TfrmBIT_BaseForm = class(TForm) ?


 
kombat ©   (2004-05-31 18:53) [33]

TfrmBIT_BaseForm = class(TForm)
и такое есть, но чуть выше в файле )))
или под перекрытием конструктора что-то другое имелось ввиду?


 
Piter ©   (2004-05-31 18:59) [34]

kombat (31.05.04 18:53) [33]

и чего, пример работает?


 
kombat ©   (2004-05-31 19:05) [35]

конечно, эта идея взята из С.Тейксейра, К.Пачеко - Delphi 5 Руководство разработчика 1. Если вызываем переопределенный конструктор в передаем ему AParent = TPanel, то созданная форма становится внедренной в этот TPanel. Естестенно для этого нужно описать еще пару процедурок типа CreateParams, но основная идея с конструктором.
Это кстати кусок из работающего проекта.


 
Piter ©   (2004-05-31 19:10) [36]

kombat (31.05.04 19:05) [35]
Если вызываем переопределенный конструктор в передаем ему AParent = TPanel, то созданная форма становится внедренной в этот TPanel. Естестенно для этого нужно описать еще пару процедурок типа CreateParams, но основная идея с конструктором


Просто Nikkie говорил, что:

>элементарно. также как и у любого другого класса

вот мне кажется, что не так, как у любого класса...


 
kombat ©   (2004-05-31 19:17) [37]

может и не так как у любого класса, но переопределяется ))
Из-за отсутствия у меня теоретического образования как программиста, более точно сказать не могу ((


 
nikkie ©   (2004-05-31 22:32) [38]

детский сад, блин...

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
 TForm1 = class(TForm)
 private
   { Private declarations }
 public
   { Public declarations }
   constructor Create(AOwner: TComponent); override;
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

constructor TForm1.Create(AOwner: TComponent);
begin
 ShowMessage("aaa");
 inherited;
end;

end.


 
Gero ©   (2004-05-31 22:43) [39]


> [38] nikkie ©   (31.05.04 22:32)
> детский сад, блин...

Точно.


 
kombat ©   (2004-05-31 23:14) [40]

а в чем детский сад?


 
Piter ©   (2004-05-31 23:19) [41]

Детский сад говорите...

Gero & Nikkie, а что, есть надежда, что приведенный Nikkie пример рабочий? :)))


 
Piter ©   (2004-05-31 23:20) [42]

Давайте продолжим... покажите мне код создания формы класса TForm1


 
nikkie ©   (2004-05-31 23:22) [43]

>а в чем детский сад?
вот в этом:

Piter ©   (24.05.04 23:52)
А конструктор, естественно, от TCustomForm. Как у формы можно конструктор перекрыть...

nikkie ©   (25.05.04 00:34)
>Как у формы можно конструктор перекрыть...
элементарно. также как и у любого другого класса.

Piter ©   (31.05.04 18:30)
nikkie (25.05.04 00:34) [12]
>Как у формы можно конструктор перекрыть...
элементарно. также как и у любого другого класса
Nikkie, ты так и не привел примера!


за неделю можно было и попробовать самому...


 
Gero ©   (2004-05-31 23:22) [44]


> Piter ©   (31.05.04 23:19)

А есть какие-то подозрения в его работоспособности?


 
Gero ©   (2004-05-31 23:23) [45]


> Давайте продолжим... покажите мне код создания формы класса
> TForm1

Вот он:

> constructor TForm1.Create(AOwner: TComponent);
> begin
>  ShowMessage("aaa");
>  inherited;
> end;


 
Piter ©   (2004-05-31 23:25) [46]

да нет, тут некоторая непонятка получилась.

Вы добавляете методы к уже созданной форме, а я говорю про динамическое созданием формы


 
Gero ©   (2004-05-31 23:26) [47]


> Piter ©   (31.05.04 23:25)

Что значит <к уже созданной форме/i>?
По-моему, книжки тебе надо почитать...


 
nikkie ©   (2004-05-31 23:26) [48]

>покажите мне код создания формы класса TForm1
program Project1;

uses
 Forms,
 Unit1 in "Unit1.pas" {Form1};

{$R *.RES}

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.


или тебе сюда еще Forms.pas запостить?

ЗЫ я так чувствую мы еще постов 30 эту животрепещущую тему мурыжить будем :(


 
Piter ©   (2004-05-31 23:50) [49]

Gero (31.05.04 23:26) [47]
Что значит <к уже созданной форме/i>?


То и значит. Что форму не ты, а дельфи создает... Как правильно заметил Nikkie вызовом Application.CreateForm(TForm1, Form1);

nikkie (31.05.04 23:26) [48]
я так чувствую мы еще постов 30 эту животрепещущую тему мурыжить будем


ладно, не будем. Просто я не совсем согласен, что перекрывать метод формы можно также, как у других компонент.
Другие компоненты можно создать так сказать с нуля, а методы формы можно перекрывать только у создаваемой Дельфи с помощью CreateForm, потому как форма сохраняется в виде ресурса и при создании этот ресурс требуется.
Например, такой код не прокатит:

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils, Forms, classes;

type
 TMyForm = class(TForm)
   constructor Create(AOwner: TComponent); override;
 end;

var
 MyForm: TMyForm;

{ MyForm }

constructor TMyForm.Create(AOwner: TComponent);
begin
 inherited;

end;

begin
 MyForm:= TMyForm.Create(nil);
 try
   MyForm.ShowModal ;
 finally
   MyForm.Free;
 end;
end.


Хотя с обычными компонентами все бы прошло нормально...

Ладно, вы меня теперь, наверное, за дебила будете держать, просто в последнее время я туго формулирую свои мысли :)


 
Gero ©   (2004-05-31 23:52) [50]


> Что форму не ты, а дельфи создает

А все формы Delphi создает.
Прораммист лишь дает команды для этого.


 
Piter ©   (2004-05-31 23:57) [51]

Gero (31.05.04 23:52) [50]
А все формы Delphi создает


Ну вот и я про это.
А компоненты можно самому создать.
Это я хотел сказать про:

>Как у формы можно конструктор перекрыть...
элементарно. также как и у любого другого класса


Не так же. От практически любого другого класса ты можешь сделать наследника и там перекрыть любой метод. А с формами ни фига. Только если перекрывать метод уже объявленной Дельфей формы


 
Gero ©   (2004-06-01 00:01) [52]


> От практически любого другого класса ты можешь сделать наследника
> и там перекрыть любой метод. А с формами ни фига.


unit MyCoolForm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TMyCoolForm = class(TForm)
private
  { Private declarations }
public
  { Public declarations }
  constructor Create(AOwner: TComponent); override;
end;

implementation

constructor TMyCoolForm.Create(AOwner: TComponent);
begin
ShowMessage("aaa");
inherited;
end;

end.


 
Piter ©   (2004-06-01 00:10) [53]

Gero (01.06.04 00:01) [52]

ну я не знаю весь твой код, не понять. Давай так - попробуй сделать наследника от TMyCoolForm :)


 
Gero ©   (2004-06-01 00:11) [54]


> Piter ©   (01.06.04 00:10)

Хватит прикалываться.


 
Piter ©   (2004-06-01 00:12) [55]

Gero (01.06.04 00:11) [54]

а я не прикалываюсь - если сделаешь, с меня пиво


 
kombat ©   (2004-06-01 00:14) [56]

ну перекрыть конечно можно, даже без переопределения конструктора
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 ShowMessage("bbb");
 inherited;
 ShowMessage("ccc");
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 ShowMessage("bbb");
 inherited;
 ShowMessage("ccc");
end;

end.
==============
но форма создается через File/New
правда я видел методы для загрузки ресурса формы из файла или поля БД, но все равно это ресурс должен быть предваритеьно создан.


 
Piter ©   (2004-06-01 00:15) [57]

kombat (01.06.04 00:14) [56]
но форма создается через File/New


эге... это противоречит постановке задачи :)


 
Piter ©   (2004-06-01 00:16) [58]

Это опять же будет форма, созданная Дельфи...


 
kombat ©   (2004-06-01 00:20) [59]

я и не спорю что это форма создання делфи. Динамически, в коде, можна создать новый экземпляр формы заданного класа.


 
nikkie ©   (2004-06-01 00:25) [60]

То и значит. Что форму не ты, а дельфи создает... Как правильно заметил Nikkie вызовом Application.CreateForm(TForm1, Form1);
хочешь ли ты сказать, что эту форму нельзя создать TForm1.Create?


 
Gero ©   (2004-06-01 00:30) [61]


> а я не прикалываюсь - если сделаешь, с меня пиво

Пиво мне бандеролью высылать будешь? ;)

unit CoolForms;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type

TMyCoolForm = class(TForm)
private
 { Private declarations }
public
 { Public declarations }
 constructor Create(AOwner: TComponent); override;
end;

TMyCoolForm2 = class(TMyCoolForm)
private
 { Private declarations }
public
 { Public declarations }
 constructor Create(AOwner: TComponent); override;
end;

implementation

constructor TMyCoolForm.Create(AOwner: TComponent);
begin
 GlobalNameSpace.BeginWrite;
 try
   CreateNew(AOwner);
   if (ClassType <> TForm) and not (csDesigning in ComponentState) then
   begin
     if OldCreateOrder then DoCreate;
   end;
 finally
   GlobalNameSpace.EndWrite;
 end;
end;

constructor TMyCoolForm2.Create(AOwner: TComponent);
begin
 inherited;
 ShowMessage("Пиво - это good! ;)");
end;

end.


 
Piter ©   (2004-06-01 00:47) [62]

Gero (01.06.04 00:30) [61]
TMyCoolForm


интересную ты форму создал... положи на TMyCoolForm какой-нибудь Button и запусти... нету батона... куда пропал? :)


 
sniknik ©   (2004-06-01 01:05) [63]

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

первое действие - создаеш форму. (ну в курсе, ткнуть мышой в "new form")
второе действие (да кстати не забудь первую обозвать MyCoolForm) лезеш в file-> new -> other -> project1(или как оно у тебя там будет) выбираеш MyCoolForm (то что она inherited уже будет стоять).
все, создано.
теперь еще раз подумай, куда высылать пиво, и высылай по справедливости, в неограниченных количествах.

p.s. а славно вы здесь развлекаетесь, мне понравилось.
p.p.s. Piter либо всех разводит либо ему нельзя ничего обьяснить в принципе, неужели еще неясно?


 
имя   (2004-06-01 08:39) [64]

Удалено модератором


 
Gero ©   (2004-06-01 08:39) [65]


> Piter ©   (01.06.04 00:47)

"Ну вы блин даете"(c)

> От практически любого другого класса ты можешь сделать наследника
> и там перекрыть любой метод. А с формами ни фига.


> Давай так - попробуй сделать наследника от TMyCoolForm :)

[61]
Метод перекрыл? Перекрыл. Причем, как ты и хотел, конструктор.
Наследника от TMyCoolForm создал? Создал. Причем так, как ты и хотел, не через NewForm, а создающийся в RT.
Блин, так ТЫ ТЕПЕРЬ ЕЩЕ И КОМПОНЕНТЫ ХОЧЕШЬ НА НЕЕ В DESIGN TIME КИДАТЬ???

Либо ты надо мной издеваешься(и не только надо мной), либо тебе пора отдохнуть от компа недельку-другую. Чем больше, тем лучше.


 
имя   (2004-06-01 08:40) [66]

Удалено модератором


 
Piter ©   (2004-06-01 18:42) [67]

sniknik (01.06.04 01:05) [63]
первое действие - создаеш форму. (ну в курсе, ткнуть мышой в "new form")


а ты бы почитал сначала, что я пишу, прежде чем тут шутить шутки несмешные. Кажется четко было сказано, что форма должна создаваться ручками, а не с помощью Delphi IDE

sniknik (01.06.04 01:05) [63]
теперь еще раз подумай, куда высылать пиво


угу. Уже высылаю. Еще только расскажи что-нибудь...

Gero (01.06.04 08:39) [65]
Блин, так ТЫ ТЕПЕРЬ ЕЩЕ И КОМПОНЕНТЫ ХОЧЕШЬ НА НЕЕ В DESIGN TIME КИДАТЬ???


Хочу! Только я хочу кидать компоненты не на наследованную форму, а на сам экземпляр TCoolForm! Я же вижу форму CoolForm в Дельфи? Почему я не имею право туда кинуть компонент? Потому что от этой формы будет наследоваться другая форма и она уже теперь не пригодна для редактирования в Design Time?

Ты действительно сделал так, что от TCoolForm можно делать наследников! Но при этом функциональность самой TCoolForm потеряна. Разве это дело?

Представь себе, что ты для того, чтобы можно было сделать наследника от TWinControl переписал его! И теперь TWinControl не имеет Handle!
Ну и нафиг он кому будет такой нужен?


 
nikkie ©   (2004-06-01 19:02) [68]

>Piter
если тебе несколько человек говорят, что ты тупишь, наверное это повод задуматься?

в [38] приведен пример формы в которой
1. перекрыт конструктор
2. ее можно создавать с помощью TForm1.Create
3. на нее можно кидать компоненты и в ран-тайме эти компоненты будут присутствовать.

в [49] ты пишешь похожий класс TMyForm, но выкидываешь ссылку на dfm-файл. после этого жалуешься, что TMyForm.Create не работает.

в [61] Gero приводит тебе пример формы без dfm-файла. но тебя это не устраивает - ты хочешь теперь кидать компоненты на форму! какая форма, если ты сам ссылку {$R *.DFM} удалил и привел пример программы из одного dpr-файла?


 
Piter ©   (2004-06-01 19:29) [69]

nikkie (01.06.04 19:02) [68]

а-а-а, теперь понятно. Тогда прошу прощения. Я был просто свято уверен, что TMyCoolForm это форма из DFM, думал просто, что Gero не полностью модуль процитировал. Тогда да, все верно. Примем [61] за пример правильного перекрытия конструктора формы. Но это никак не сочетается с:

элементарно. также как и у любого другого класса

не также. Вот. :)

Хотя даже я устал...  в общем, ладно, замяли эту тему, я не ожидал, что все выльется в такое...


 
Piter ©   (2004-06-01 20:04) [70]

Gero (01.06.04 08:39) [65]
тебе пора отдохнуть от компа недельку-другую. Чем больше, тем лучше


вот тут я с тобой абсолютно согласен... и не столько от компа, сколько от этого форума... потому что на компьютере я практически сейчас ничего больше и не занимаюсь :)


 
Gero ©   (2004-06-01 21:47) [71]


> Piter ©   (01.06.04 20:04)

Природа, шашлык, девочки... :)

P.S. А пиво все же мне торчишь ;)


 
Piter ©   (2004-06-15 00:51) [72]

Вот что в ФИДО советуют:

1 )В конструктор формы должен быть передан *ВЛАДЕЛЕЦ* формы. Т.е.
Application а не MainForm


этого я не понимаю... ну да, должен быть передан владелец, а почему MainForm не может быть владельцем?

2) И вообще привыкни создавать формы через
Application.CreateForm(...)


Что скажете? Может помочь?


 
Agent13 ©   (2004-06-15 01:08) [73]


> Что скажете? Может помочь?

Попробуй. Чё гадать-то теперь?



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

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

Наверх




Память: 0.69 MB
Время: 0.033 c
4-1085650758
Aleksandr.
2004-05-27 13:39
2004.07.04
Не могу нормально изменить размеры окна


4-1085147479
DoG
2004-05-21 17:51
2004.07.04
ReadFile !


10-1016002202
comwad
2002-03-13 09:05
2004.07.04
Corba.


3-1086434077
DereK)
2004-06-05 15:14
2004.07.04
Отчет по одной записи


9-1080063315
MIV
2004-03-23 20:35
2004.07.04
при столкновении двух обьектов уничтожается третий





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