Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопросы от "Чайника"
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - FAQ
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. Иначе говоря, как можно сделать так, чтобы из главной формы стали доступны к исполнению процедуры, написанные в другом модуле?
Yason
Если мне не изменяет склероз, uses можно писать как до implementation, так и после. Вы явно оба писали до, таким образом и получается circular reference. Если в listing.pas uses main написать после implementation -- всё должно быть ок.
etc
Цитата(dieAlive @ 28:05:2008 - 21:37) *
Написал в этом модуле процедуру, которая взаимодействует с компонентами из главной формы и для этого в файле этого модуля в разделе uses я написал ссылку на модуль главной формы (у меня это Main.pas, вот я и написал в uses просто слово Main).
Покажите как они взаимодействуют.
Цитата(dieAlive @ 28:05:2008 - 21:37) *
P.S. Иначе говоря, как можно сделать так, чтобы из главной формы стали доступны к исполнению процедуры, написанные в другом модуле?
Очень просто, ненадо юзать глобальные переменные.
dieAlive
Цитата(etc @ 29:05:2008, 08:14 ) *
Покажите как они взаимодействуют.
Очень просто, ненадо юзать глобальные переменные.

main.pas
Код
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
Код
unit Listing;

interface

uses SysUtils;

implementation

uses Main;

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

end.


Выдает ошибку [DCC Error] main.pas(42): E2003 Undeclared identifier: 'CreateListing'
etc
Цитата(dieAlive @ 29:05:2008 - 08:25) *
... Какой-то код...
тут неправильно.

Да и ваще, зачем вам дополнительный модуль? "скрипач не нужен" (с)
dieAlive
Цитата(etc @ 29:05:2008, 08:40 ) *
тут неправильно.

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

Какая там может быть ошибка ??? - это просто процедура, которая работает с главной формой.
Дополнительный модуль мне нужен для того, чтобы в будущем в моем коде не было неразберихи, т.к. этого самого этого кода я предполагаю написать много и поэтому хочу раскинуть все свои процедуры и функции "по темам", т.е. в одном модуле будут содержаться процедуры для работы с файловой системой, в другом - для работы с графикой и т.д. и т.п.
etc
Цитата(dieAlive @ 29:05:2008 - 08:45) *
Там в принципе не может быть что-то неправильно
Это вам кажется, и кажется потому как не хотите думать, даже над подсказками. sad.gif


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

Цитата(dieAlive @ 29:05:2008 - 08:45) *
Какая там может быть ошибка ??? - это просто процедура, которая работает с главной формой.
А про это я уже вам указал в своем первом сообщении.
zubr
Код
unit Listing;

interface

uses SysUtils;

procedure CreateListing(Path: string);

implementation

uses Main;

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

end.
etc
zubr В топку код. Не учите плохому, топом же на работе напишет вот так и все - премии не видать как своих ушей. smile.gif
dieAlive
спасибо, zubr.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2008 IPS, Inc.