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

  • Автор темы dieAlive
  • Дата начала
D

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. Иначе говоря, как можно сделать так, чтобы из главной формы стали доступны к исполнению процедуры, написанные в другом модуле?
 
Y

Yason

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

etc

Написал в этом модуле процедуру, которая взаимодействует с компонентами из главной формы и для этого в файле этого модуля в разделе uses я написал ссылку на модуль главной формы (у меня это Main.pas, вот я и написал в uses просто слово Main).
Покажите как они взаимодействуют.
P.S. Иначе говоря, как можно сделать так, чтобы из главной формы стали доступны к исполнению процедуры, написанные в другом модуле?
Очень просто, ненадо юзать глобальные переменные.
 
D

dieAlive

Покажите как они взаимодействуют.
Очень просто, ненадо юзать глобальные переменные.
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'
 
D

dieAlive

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

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

etc

Там в принципе не может быть что-то неправильно
Это вам кажется, и кажется потому как не хотите думать, даже над подсказками. :)


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

Какая там может быть ошибка ??? - это просто процедура, которая работает с главной формой.
А про это я уже вам указал в своем первом сообщении.
 
Z

zubr

Код:
unit Listing;

interface

uses SysUtils;

procedure CreateListing(Path: string);

implementation

uses Main;

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

end.
 
E

etc

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!