Вопросы от "Чайника"

Тема в разделе "Delphi - FAQ", создана пользователем dieAlive, 28 май 2008.

  1. dieAlive

    dieAlive Гость

    Создаю тему, чтобы вы, уважаемые пользователи, помогли мне в не легком деле - освоении Delphi.
    Вопрос №1.
    Я сделал следующие действия:
    1. Создал новый проект (File -> New -> VCL Forms Application - Delphi for Win32).
    2. Создал новый модуль listing.pas (File -> New -> Unit - Delphi for Win32) и сохранил его. Этот модуль не ассоциируется ни с какой другой формой моего приложения - это просто файл pas.
    3. Написал в этом модуле процедуру, которая взаимодействует с компонентами из главной формы и для этого в файле этого модуля в разделе uses я написал ссылку на модуль главной формы (у меня это Main.pas, вот я и написал в uses просто слово Main).
    4. Теперь уже в модуле главной формы (main.pas) я захотел вызвать написанную процедуру из моего модуля listing.pas, но мне выдало ошибку [DCC Error] main.pas(40): E2003 Undeclared identifier: 'CreateListing', где CreateListing - это название той самой процедуры.
    5. Я попробовал в разделе uses модуля главной формы написать ссылку на модуль listing.pas, но была выдана другая ошибка - [DCC Error] main.pas(8): F2047 Circular unit reference to 'main'.

    P.S. Иначе говоря, как можно сделать так, чтобы из главной формы стали доступны к исполнению процедуры, написанные в другом модуле?
     
  2. Yason

    Yason Гость

    Если мне не изменяет склероз, uses можно писать как до implementation, так и после. Вы явно оба писали до, таким образом и получается circular reference. Если в listing.pas uses main написать после implementation -- всё должно быть ок.
     
  3. etc

    etc Гость

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

    dieAlive Гость

    main.pas
    Код (Text):
    unit main;

    interface

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

    type
    TMainForm = class(TForm)
    ListBox1: TsListBox;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    procedure FormCreate(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    MainForm: TMainForm;

    implementation

    uses listing;

    {$R *.dfm}

    procedure TMainForm.FormCreate(Sender: TObject);
    begin
    MainForm.Position := poDesktopCenter;
    MainForm.Caption := 'music monster';
    MainForm.BorderStyle := bsSingle;
    CreateListing('D:\mp3\Nightwish\mp3s\live\2005 - End of an Era\');
    end;

    end.
    listing.pas
    Код (Text):
    unit Listing;

    interface

    uses SysUtils;

    implementation

    uses Main;

    procedure CreateListing(Path: string);
    begin
    ... Какой-то код...
    end;

    end.
    Выдает ошибку [DCC Error] main.pas(42): E2003 Undeclared identifier: 'CreateListing'
     
  5. etc

    etc Гость

    тут неправильно.

    Да и ваще, зачем вам дополнительный модуль? "скрипач не нужен" (с)
     
  6. dieAlive

    dieAlive Гость

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

    etc Гость

    Это вам кажется, и кажется потому как не хотите думать, даже над подсказками. :)


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

    А про это я уже вам указал в своем первом сообщении.
     
  8. zubr

    zubr Гость

    Код (Text):
    unit Listing;

    interface

    uses SysUtils;

    procedure CreateListing(Path: string);

    implementation

    uses Main;

    procedure CreateListing(Path: string);
    begin
    ... Какой-то код...
    end;

    end.
     
  9. etc

    etc Гость

    zubr В топку код. Не учите плохому, топом же на работе напишет вот так и все - премии не видать как своих ушей. :)
     
  10. dieAlive

    dieAlive Гость

    спасибо, zubr.
     
Загрузка...

Поделиться этой страницей