|
Вопрос # 1 448/ вопрос открыт / |
|
Здравствуйте, эксперты!
Повторенная мною программа 1) нормально работает, но после введения ее в состав другой программы выходит ошибка: [Error] Unit1.pas(393): Undeclared identifier: 'SelectDirectory' в фрагменте 2), выделенная строка. Прошу объяснить этот случай в частности и такое написание оператора if...then вообще. Делалось в Delphi 7 , WIN_XP. Заранее благодарен МАА. Мой адрес: vfndf@gala.net
Приложение: Переключить в обычный режим- 1)
-
-
- unit FindFile_;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls,
- FileCtrl;
-
- type
- TForm1 = class(TForm)
-
-
-
-
-
- Label1: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- Label4: TLabel;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.dfm}
-
- var
-
- cDir: string;
-
-
-
- procedure Find;
- var
-
- begin
-
- if cDir[length(cDir)] <> '' then cDir := cDir+'';
-
- if FindFirst(FileName, faAnyFile,SearchRec) = 0 then
- repeat
- if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
- begin
- Form1.Memo1.Lines.Add(cDir + SearchRec.Name);
- n := n + 1;
- end;
- until FindNext(SearchRec) <> 0;
-
-
-
-
-
-
-
-
-
- }
-
- if FindFirst('*', faAnyFile, SearchRec) = 0 then
- repeat
- if (SearchRec.Attr and faDirectory) = faDirectory then
-
-
- if SearchRec.Name[1] <> '.' then
- begin
- // Form1.Memo1.Lines.Add('>>>>'+SearchRec.Name);
-
-
-
- //Form1.Memo1.Lines.Add('<<<<'+SearchRec.Name);
- end;
- until FindNext(SearchRec) <> 0;
- end;
-
-
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- if not DirectoryExists(Edit2.Text) then
- begin
-
- Edit2.SetFocus;
- exit;
- end;
-
- Button1.Enabled := False;
- Label4.Caption := '';
- Label4.Repaint;
-
- Label4.Caption := '';
-
-
-
-
-
- if n = 0 then
-
-
- Button1.Enabled := True;
- end;
-
-
- function GetPath(mes: string):string;
- var
-
- pwRoot : PWideChar;
- Dir: string;
- begin
-
- GetMem(pwRoot, (Length(Root)+1) * 2);
- pwRoot := StringToWideChar(Root,pwRoot,MAX_PATH*2);
- if SelectDirectory(mes, pwRoot, Dir)
- then
-
- then GetPath := Dir+''
- else GetPath := Dir
- else
- GetPath := '';
- end;
-
-
- procedure TForm1.Button2Click(Sender: TObject);
- var
- Path: string;
- begin
-
- if Path <> ''
- then Edit2.Text := Path;
- end;
-
- end.
- 2)
- begin
- Root := ''; // êîðíåâîé
êàòàëîã -
ïàïêà
Ðàáî÷èé
ñòîë
- GetMem(pwRoot, (Length(Root)+1) * 2);
- pwRoot := StringToWideChar(Root,pwRoot,MAX_PATH*2);
- --------------------------------------------
- if SelectDirectory(mes,pwRoot,Dir)
- -------------------------------------------------
- then
- if Length(Dir) = 2
 |
Вопрос задал: MAA (статус: Посетитель)
Вопрос отправлен: 25 марта 2008, 18:07
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, MAA!
С многих причин функции погруппированы в юниты (библиотеки функций). Наверно вверху файла видели строку, которая начинается на uses - это они и перечисленны. SelectDirectory находиться в файле fileCtrl.pas, по этому нужно добавить в список uses FileCrtl. Хотя автор кода, с которого вы взяли код, мог написать свою функцию с таким же именем - тогда надо смотреть, кто "лишний" в списке uses.
вторая половина вопроса.
Вас смутила запись if SelectDirectory(mes,pwRoot,Dir)? и что тут дивного. Правда если запись вида if a=0 then тоже смущает, тогда это не ко мне.
Дело в том, что оператор if требует после себя не наличие операторов сравнение, а выражения логического типа (то есть, что возвращает True|False). А указаная функция как раз и есть типа boolean
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 25 марта 2008, 23:43
Оценка за ответ: 5
Комментарий к оценке: Благодарю, ответ полный. Засмущало меня отсутствие инфы по типу выражения SelectDirectory(mes,pwRoot,Dir), теперь понял где копать. Благодарю.
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|