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

Вниз

Ошибка EResNotFound   Найти похожие ветки 

 
Lapor   (2004-02-07 15:51) [0]

Вот код:

TMyForm = class(TForm);
...
var MyForm: TMyForm;
...
MyForm:=TMyForm.Create(nil);


При исполнении вылетает EResNotFound, типа ресурс TMyForm не найден... хотя в тоже время код

var Form1: TForm;
...
Form1:=TForm.Create(nil);


пройдет на ура...

Это все блин конструктор TCustomForm виноват - непонятно что ему надо:
if not InitInheritedComponent(Self, TForm) then
raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);


 
Никто   (2004-02-07 16:03) [1]

TMyForm = class(TCustomForm);


 
Lapor   (2004-02-07 16:37) [2]

А почему ошибка вылезает? Что такого в TForm?


 
Lapor   (2004-02-08 20:11) [3]

?


 
Lapor   (2004-02-11 00:42) [4]

Неужели никто не знает?


 
Юрий Зотов   (2004-02-11 07:35) [5]

> Lapor (07.02.04 15:51)

> Это все блин конструктор TCustomForm виноват

Виноват действительно конструктор формы, только не тот, о котором Вы пишете. Не нужно менять имя класса формы вручную - для этого в Инспекторе Объектов есть свойство Name и если пользоваться им, то среда сама все разрулит как надо (в том числе, переименует и класс, и ресурс формы). И еще - хотя вряд ли, но на всякий случай проверьте, не удалена ли директива $R после слова implementation.


 
Piter   (2004-02-12 17:46) [6]

Никто не знает??!!

Почему нельзя наследовать от TForm?


 
Юрий Зотов   (2004-02-12 17:57) [7]

> Piter © (12.02.04 17:46) [6]

> Почему нельзя наследовать от TForm?

Кто сказал, что нельзя? Создайте новый проект и посмотрите, от чего унаследован TForm1. И ведь работает... если не мешать.


 
Lapor   (2004-02-12 18:02) [8]

>Юрий Зотов © (11.02.04 07:35) [5]

Не нужно менять имя класса формы вручную

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

К тому же интересно - почему выдается ошибка?


 
Palladin   (2004-02-12 18:09) [9]

Ошибка выдается потому что она произошла.


> хм, а если я хочу добавить какое-нибудь поле?

А для этого разве нужно менять имя класса формы в ручную?


> А может я метод какой хочу перекрыть формы?

А для этого разве нужно менять имя класса формы в ручную?


 
Amoeba   (2004-02-12 18:12) [10]

Так создавай и перекрывай в том, что тебе уже сгенерировало Delphi. И еще раз перечитай
> Юрий Зотов © (11.02.04 07:35) [5]


 
Lapor   (2004-02-13 02:04) [11]

> А может я метод какой хочу перекрыть формы?

А для этого разве нужно менять имя класса формы в ручную?


А что, нет? Вы знаете другие способы перекрытия методов? Расскажите пожалуйста. Я знаю только один, например:

TMyForm = class(TForm);
constructor Create;
...

constructor TMyForm.Create
inherited Create
...


 
Defunct   (2004-02-13 02:17) [12]

Хм..
нет надобности кипятиться.
Просто надо выбрать в меню "создать" не форму, не приложение, а компонент.
Сделать наследника от TForm и зарегистрировать его в среде (меню Сomponent -> Add component).

Lapor (13.02.04 02:04) [11]
TMyForm = class(TForm);
constructor Create;
...

constructor TMyForm.Create
inherited Create


Да и тут немного некорректно, если уж перекрывать, то так:
TMyForm = class(TForm)
constructor Create(AOwner:TComponent);
..

Constructor TMyForm.Create;
Begin
inherited;
...

И ошибки больше не будет, а новый компонент можно будет визуально настраивать в среде.


 
Defunct   (2004-02-13 02:18) [13]

constructor Create(AOwner:TComponent); Override;


 
Юрий Зотов   (2004-02-13 15:33) [14]

> Defunct (13.02.04 02:17) [12]

> Просто надо выбрать в меню "создать" не форму, не приложение,
> а компонент.
> Сделать наследника от TForm и зарегистрировать его в среде
> (меню Сomponent -> Add component).
...
> И ошибки больше не будет, а новый компонент можно будет
> визуально настраивать в среде.


Скажите, а Вы сами пробовали свой совет?


 
Юрий Зотов   (2004-02-13 15:35) [15]

> Lapor (13.02.04 02:04) [11]

А при чем же тут РУЧНОЕ изменение имени класса формы?


 
olookin   (2004-02-13 15:42) [16]

TMyForm = class(TForm) ;
...

Вот это как понимать? Не надо ли писать так?
TMyForm = class(TForm)
...
end;


 
Palladin   (2004-02-13 15:51) [17]


> Lapor (13.02.04 02:04) [11]

я вот тоже вчера писал писал всю ручку исписал, а потом сохранил на дискете... да и ежики обрадовались...


 
Defunct   (2004-02-13 17:26) [18]

> Юрий Зотов © (13.02.04 15:33) [14]
> Скажите, а Вы сами пробовали свой совет?

Попробовал, да согласен, что такой подход "немножко" неудобен при добавлении компонентов на форму, но вполне работоспособен.

Каков вопрос:
> Lapor (07.02.04 15:51)
> Это все блин конструктор TCustomForm виноват - непонятно что ему надо:

таков ответ


 
Lapor   (2004-02-14 18:41) [19]

Юрий, у меня такое ощущение, что мы говорим на разных языках. Неужели я так неясно излагаю свои мысли?

Давайте так - вы можете привести код, который создает экземпляр формы (наследованной от TForm), в которой перекрыт ее метод какой-нибудь?

> Lapor (13.02.04 02:04) [11]
А при чем же тут РУЧНОЕ изменение имени класса формы?


Я уж даже не знаю... давайте сразу определимся, под именем класса формы вы подразумеваете TForm и TMyForm, верно?

Ну я же не могу написать:

TForm = class (TForm)

Мне нужно создать свой класс формы, наследованный от TForm, разве нет? Как же еще в ООП делается перекрытие методов и тому подобное? Наследованием же! А тут это не проходит


 
olookin   (2004-02-14 19:08) [20]

Похоже что для каждой формы (заданной как type и т.д.) должен существовать файл dfm. Отсюда решение - вместо Create делаем CreateNew. У меня в этом случае все работает.


 
Defunct   (2004-02-14 19:13) [21]

Визуально создаем форму. А потом подменяем любой из ее методов.
Например, создали визуально форму Form1, в PAS файле будет следующее:

TForm1 = class(TForm)
..
..
End;

Нужно подменить конструктор или добавить вообще новый конструктор - подменяем/добавляем:
TForm1 = class(TForm)
..
..
Public
Constructor Create(AOwner:TComponent);Override; Constructor CreateXXX(AOwner:TComponent;Background:TBitmap);Virtual;
End;

Constructor TForm1.Create(AOwner:TComponent);
Begin
Inherited;
...
...
End;

Constructor TForm1.CreateXXX(AOwner:TComponent;Background:TBitmap);
Begin
Inherited Create(AOwner);
...
...
End;

и т.д.
Важно только не изменять имя класса вручную.


 
Lapor   (2004-02-14 21:17) [22]

А все таки повторю вопрос - ПОЧЕМУ нельзя прямо создавать наследника формы?


 
Petr V. Abramov   (2004-02-14 22:06) [23]

> Lapor (14.02.04 21:17) [22]
> А все таки повторю вопрос - ПОЧЕМУ нельзя прямо создавать наследника формы?

Ответ: ну почему нельзя, можно, но это криво :) Морально приготовьтесь к тому, что она всегда будет пустой. Создавать ее надо будет конструктором CreateNew, а не Create.

Если очень хочется или просто нужно чтоб она и загружалась непустая, и что-нибудь перекрыть, делается это так:

1. В главном меню Delphi выбрать пункт File -> New -> Form, нажать левый бутон мыши, увидеть новую пустую форму.
2. Нажать F12
3. Увидеть следующее:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

end.

4. В секциях public и private написать имена и параметры методов, которые Вы хотите перекрыть, не забыть добавить override.
5. При необходимости добавить секцию protected, поступить аналогично п.4
6. Написать реализацию перекрываемых методов.
7. Нажать F12, потом F11, увидеть Object Inspector, в нем поменять св-во Name на необходимое без "T" в начале, нажать Enter.
8. Enjoy :)


 
Lapor   (2004-02-14 23:42) [24]

А все таки повторю вопрос - ПОЧЕМУ нельзя прямо создавать наследника формы? :)

Что за EResNotFound? Что за ограничение? Мне просто любопытно... Сам что-то в VCL разобраться не могу...


 
Юрий Зотов   (2004-02-15 01:35) [25]

> Lapor (14.02.04 23:42) [24]

Свойства формы и лежащих на ней компонентов сохраняются в файле DFM. При компиляции программы этот DFM превращается в ресурс формы с именем класса этой формы и в таком виде входит в Exe. Когда в run-time форма создается конструктором Create, то в Exe разыскивается ее ресурс (по имени класса формы), подгружается - и форма получается полностью настроенной.

Когда в design-time мы переименовываем форму через Object Inspector, то Delphi об этом узнает, переименовывает класс формы и, соответственно, ее ресурс. Если же класс формы изменить вручную, то Delphi об этом не узнает и ресурс останется со старым именем. А при запуске он будет искаться уже по новому имени и, конечно, не будет найден. Это и есть EResNotFound.

Если Вы делаете форму, которая всегда будет пустой, то удалите из ее модуля строку {$R *.DFM}. Это отключит компиляцию ресурсов, форма не будет их иметь вовсе и тогда можете переименовывать ее класс как угодно. Но создавать такую форму надо через CreateNew, а не Create - иначе вылетит все та же ошибка.

См. в исходниках VCL:
TCustomForm.Create
TCustomForm.CreateNew
InitInheritedComponent



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

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

Наверх





Память: 0.51 MB
Время: 0.01 c
1-93842
Вован_
2004-02-16 15:41
2004.02.29
Проблема WaitForSingleObject в отдельном потоке


7-94200
saNat
2003-11-29 00:26
2004.02.29
Изменение приоритета процесса


1-94002
ANS
2004-02-16 21:50
2004.02.29
Обработка тестовых файлов в UTF-8


1-93996
stud
2004-02-16 14:31
2004.02.29
справка на русском


3-93808
Andrew Frol
2004-02-03 13:58
2004.02.29
QuickReport и итоги по странице??!!!!





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