Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> E2076 This form of method call only allowed for cl 
:(
    Опции темы
harakiri
Дата 19.9.2011, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 17.1.2011

Репутация: нет
Всего: нет



Доброго всем времени. Прошу Вашей помощи в сложившейся ситуации и прошу сильно не критиковать, я только разбираюсь с классами. Есть класс в в отдельном Unit-е:

Код

TMDIForm = class(TForm)
     private
        MDIToolBarPopupMenu: TAdvPopupMenu;
        MDIPanel:TAdvDockPanel;
        MDIBar:TAdvToolBar;
        MDIBut:TAdvToolBarButton;
        //procedure MDIToolBarButtonClick(Sender: TObject);
 
     public
        MDIButtonCaption: String;
        constructor Create(AOwner: TComponent); override;
        procedure CreateMDIForm(InstanceClass: TComponentClass; var Reference);
        //destructor Destroy; override;
     end;


описание метода:

     
Код

procedure TMDIForm.CreateMDIForm(InstanceClass: TComponentClass; var Reference);
     begin
       Application.CreateForm(InstanceClass, Reference);
     end;


В главной форме вызываю:

Код

TMDIForm.CreateMDIForm(TSprPost,SprPost);


на что выдает ошибку 

[DCC Error] Main.pas(141): E2076 This form of method call only allowed for class methods

Подскажите пожалуйста, что я делаю неправильно.
PM MAIL   Вверх
kami
Дата 19.9.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Код

TMDIForm = class(TForm)
...
class procedure CreateMDIForm(...)
...
, о чем прозрачно намекнул компилятор smile

Это сообщение отредактировал(а) kami - 19.9.2011, 12:52
PM MAIL WWW   Вверх
harakiri
Дата 19.9.2011, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 17.1.2011

Репутация: нет
Всего: нет



kami, спасибо огромное. Я был бы очень признателен если бы Вы подробнее рассказали, зачем это нужно. Просто я изучаю классы на примере готового проекта, и там такого нет.
PM MAIL   Вверх
Keeper89
Дата 19.9.2011, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



harakiri, если метод классовый - объявлен как:
Код

class procedure CreateMDIForm(...)

то он вызывается через тип объекта:
Код

TMDIForm.CreateMDIForm(TSprPost,SprPost);

Если же метод обычный, то
Код

procedure CreateMDIForm(...)

и вызываем:
Код

var
  MyMDIForm: TMDIForm;
...
  MyMDIForm := TMDIForm.Create(...);
  MyMDIForm.CreateMDIForm(TSprPost,SprPost);

Определись, что тебе нужно и приведи в соответствие сигнатуру и вызов.

Это сообщение отредактировал(а) Keeper89 - 19.9.2011, 20:39


--------------------
PM MAIL WWW   Вверх
northener
Дата 20.9.2011, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(harakiri @  19.9.2011,  20:16 Найти цитируемый пост)
Я был бы очень признателен если бы Вы подробнее рассказали, зачем это нужно.


Для этого нужен учебник. 
Keeper89 замучается объяснять на форуме. smile

Лучше бы вы объяснили что вам нужно? Что вы хотели сделать, но у вас не получилось.

Это сообщение отредактировал(а) northener - 20.9.2011, 00:29


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
harakiri
Дата 20.9.2011, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 17.1.2011

Репутация: нет
Всего: нет



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

type
     MDIForm = class(TForm)
     private
        MDIButtonsCount:Integer;
      MDIToolBarPopupMenu: TAdvPopupMenu;
        MDIPanel:TAdvDockPanel;
    MDIBar:TAdvToolBar;
    MDIBut:TAdvToolBarButton;
        procedure MDIToolBarButtonClick(Sender: TObject);

     public
      MDIButtonCaption: String;
      constructor Create(AOwner: TComponent); override;
        procedure CreateMDIForm(InstanceClass: TComponentClass; var Reference);
        destructor Destroy; override;
     end;

 Далее мне нужно создать панель на главной форме. Это я реализую в методе OnCreate:
Код

         MDIPanel := TAdvDockPanel.Create(Self);
         MDIPanel.Parent := MainForm;
         MDIPanel.Align := daBottom;
         MDIPanel.LockHeight := False;
         MDIPanel.UseRunTimeHeight := True;
                MDIPanel.Visible := true;

                MDIBar := TAdvToolBar.Create(Self);
                MDIBar.Name := 'MDIBar';
                MDIBar.Parent := MDIPanel;
                MDIBar.FullSize := True;
                MDIBar.Locked := True;
                MDIBar.AutoSize := True;
                MDIBar.Visible := true;

                MDIToolBarPopupMenu := TAdvPopupMenu.Create(Self);
                MDIPanel.PopupMenu := MDIToolBarPopupMenu;

А вот потом нужно для каждого вновь создаваемого Child окна, создавать кнопку на этой панели. На кнопку создания окна:
Код

procedure TMainForm.FileNew1Execute(Sender: TObject);
   var
            MDIF:MDIForm;
begin
MDIF.CreateMDIForm(TSprPost, SprPost);
end;

Собственно сама процедура
Код

     procedure MDIForm.CreateMDIForm(InstanceClass: TComponentClass; var Reference);
     begin
       Application.CreateForm(InstanceClass, Reference);
       MDIBut := TAdvToolBarButton.Create(Self);
       MDIBut.Parent := MDIPanel;
       MDIBut.Caption := 'asd';
       MDIBut.ShowCaption := True;
     end;

На строке 
Код
MDIBut.Parent := MDIPanel;
выдает ошибку http://s2.ipicture.ru/Gallery/Viewfull/5946168.html
PM MAIL   Вверх
de_Nis
Дата 20.9.2011, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старательный
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 19.10.2006
Где: Молдова

Репутация: нет
Всего: 6



Цитата(northener @  19.9.2011,  23:20 Найти цитируемый пост)
Для этого нужен учебник. 

А какой есть хороший учебник по Дельфи, в котором толково объяснялась бы работа с классами в частности и ООП в целом? Я таких не встречал, за исключением разве что 150 страниц в 
Иванова Объектно-ориентированное программирование.
--------------------
Несчастлив не тот, у кого ничего нет, а тот, кто ничего не хочет…
PM   Вверх
harakiri
Дата 21.9.2011, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 17.1.2011

Репутация: нет
Всего: нет



Если я вставляю этот код в конструктор:
Код

     var
       MDIBut:TAdvToolBarButton;
     begin
       MDIBut := TAdvToolBarButton.Create(Self);
       MDIBut.Caption := 'asd';
       MDIBut.ShowCaption := True;
       MDIBut.Parent := MDIBar;
, то все работает прекрасно. А если пытаюсь вынести в отдельный метод, то на строке 
Код

       MDIBut.Parent := MDIBar;

, выскакивает VA. Что я делаю неправильно? В конструкторе
Код

     constructor MDIForm.Create(AOwner: TComponent);
     var
      Item : TMenuItem;     MDIBut:TAdvToolBarButton;
     begin
        inherited CreateNew(AOwner);
        begin
         MDIPanel := TAdvDockPanel.Create(Self);
         MDIPanel.Parent := MainForm;
         MDIPanel.Align := daBottom;
         MDIPanel.LockHeight := False;
         MDIPanel.UseRunTimeHeight := True;
                MDIPanel.Visible := true;

                MDIBar := TAdvToolBar.Create(Self);
                MDIBar.Name := 'MDIBarr';
                MDIBar.Parent := MDIPanel;
                MDIBar.FullSize := True;
                MDIBar.Locked := True;
                MDIBar.AutoSize := True;
                MDIBar.Visible := true;
                MDIToolBarPopupMenu := TAdvPopupMenu.Create(Self);
                MDIPanel.PopupMenu := MDIToolBarPopupMenu;
        end;
     end;


Это сообщение отредактировал(а) harakiri - 21.9.2011, 21:02
PM MAIL   Вверх
northener
Дата 22.9.2011, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(de_Nis @  20.9.2011,  09:02 Найти цитируемый пост)
А какой есть хороший учебник по Дельфи,

Увы, таких нет!


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.