Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2009, 01:51   #1
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
Стрелка Ругается в модуле! Как быть?

Есть основная программа, в ней накопилось много процедур, решил вынести в дополнительный модуль(Unit2).. Но при компиляции ругается.
Смысл ошибки понятен, но не могу решить её! Кто занет помогите!!

Код:
unit Unit2;

 interface
 uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtDlgs, FileCtrl, DB, ADODB, DBCtrls, Grids, DBGrids,
  ExtCtrls, jpeg, Menus, ComCtrls, XPMan;

  procedure ScanDir(StartDir: string; Mask: string; List: TStrings);
  procedure Scanfoldes(F:TForm1);   - ругается тут (Undeclared identifier: 'TForm1')

  implementation

  procedure ScanDir(StartDir: string; Mask: string; List: TStrings);
  var
    SearchRec: TSearchRec;
................................... ..............
................................... ...............

и так далее

Последний раз редактировалось Stilet; 14.07.2009 в 08:00.
Golovastik вне форума Ответить с цитированием
Старый 14.07.2009, 02:01   #2
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Ну в общем-то логично. В uses что-то я не вижу модуля в котором описан класс TForm1. Пропиши там Unit1 (если этот модуль у тебя так называется).
Баламут вне форума Ответить с цитированием
Старый 14.07.2009, 03:09   #3
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,453
По умолчанию

Нужно написать просто TForm и на экспорте и на самой процедуре!!! ведь вы же только экспортируйте процедуру!
uberchel вне форума Ответить с цитированием
Старый 14.07.2009, 08:01   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
решил вынести в дополнительный модуль(Unit2)
Процедуры и функции, непосредственно работающие с неким обьектом (классом) лучше всего оформлять как методы этого класса.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2009, 08:10   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) я полностью согласен с мнением Stilet'а!

2) мне вот интересно, что же там такого в процедуре Scanfoldes, что туда надо передавать ссылку на Форму1...
Интересно было бы взглянуть на код внутри...

3) uberchel, сперва мне показалось, что Ваше предложение абсолютно верное, но, немножко подраскинув мыслишками, я подумал, что возможно F:TForm ничего не даст. Ведь очень вероятно, что на форме лежат какие-то контролы, которые заполняются этой процедурой (т.е. внутри неё, например, такой код
f.Memo1.Lines.Add(....) тогда компилятор будет ругаться на Memo1...)


Короче, резюмируя,надо:

либо добавить юнит с описанием формы1 (скорее всего у автора это Unit1) в uses, как это предложил Баламут,

либо (если не откажетесь от своей идеи вынести методы в отдельный unit), изменить функцию Scanfoldes, указав в заголовке конкретно те контролы, которые нужны внутри процедуры. Например, если внутри используется Memo1 с TForm1 написать так:
Код:
procedure Scanfoldes(pMemo1:TMemo); 
...
pMemo1.Lines.Add(...)
либо сделать так, как предложил Stilet.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.07.2009, 10:47   #6
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
По умолчанию

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

Код:
procedure Scanfoldes(F:TForm1);
  var
    jpg : TJpegImage;
    i, start : integer;
    st : string;
  begin
  if chosenDirectory = '' then
  begin
    MessageBox(Application.Handle,'Please select catalog','Error', MB_OK);
    exit;
  end;
    start := 1;
    path := chosenDirectory + '\';
    ScanDir(path, '', F.ListBox1.Items);
  for i := 0 to F.Listbox1.Items.Count - 1 do
  begin
    st := F.listbox1.Items[i];
  if ((st[length(st)] = 'g') or (st[length(st)] = 'G')) then
  begin
    F.Grid.Cells[0,start] := inttostr(start);
    F.Grid.Cells[1,start] := st;
    start := start + 1;
    F.Grid.RowCount := start;
  end;
  end;
  end;

Последний раз редактировалось Stilet; 14.07.2009 в 10:55.
Golovastik вне форума Ответить с цитированием
Старый 14.07.2009, 10:56   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ну вот процедура сама
Прям таки напрашивается стать методом формы
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2009, 11:31   #8
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
По умолчанию

даёте небольшой обучающий пример?
Golovastik вне форума Ответить с цитированием
Старый 14.07.2009, 11:43   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
даёте небольшой обучающий пример?
Запросто:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Grid: TStringGrid;
  private
    { Private declarations }
  public          chosenDirectory,path :string;
  procedure Scanfoldes;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Scanfoldes;
var
    jpg : TJpegImage;
    i, start : integer;
    st : string;
  begin
  if chosenDirectory = '' then
  begin
    MessageBox(Application.Handle,'Please select catalog','Error', MB_OK);
    exit;
  end;
    start := 1;
    path := chosenDirectory + '\';
//    ScanDir(path, '', ListBox1.Items);
  for i := 0 to Listbox1.Items.Count - 1 do
  begin
    st := listbox1.Items[i];
  if ((st[length(st)] = 'g') or (st[length(st)] = 'G')) then
  begin
    Grid.Cells[0,start] := inttostr(start);
    Grid.Cells[1,start] := st;
    start := start + 1;
    Grid.RowCount := start;
  end;
  end;
  end;

end.
Смысл в том что становясь методом твоя процедура может обойтись без параметра, при этом все компоненты с которыми она будет работать имеются ввиду те которые пренадлежат форме.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2009, 11:58   #10
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

ТС ведь сказал:
Цитата:
Есть основная программа, в ней накопилось много процедур, решил вынести в дополнительный модуль
Мне кажется, так и было раньше (методом формы), когда имелось много процедур.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как быть? Voltazzar Свободное общение 12 06.07.2009 16:21
Как обратиться к переменой в другом модуле. nusik Общие вопросы C/C++ 5 02.07.2009 14:56
Упал телефон в сельский туалет. Как быть, как мыть? Лукманов Александр Свободное общение 28 30.04.2009 10:42
Ругается компилятор JSM Общие вопросы Delphi 2 17.06.2007 23:04