Текущий архив: 2019.03.24;
Скачать: CL | DM;
Вниз
Отсутствует доступ к объектам формы из метода Найти похожие ветки
← →
Иван (2016-11-13 01:05) [0]Здравствуйте.
Имею форму. Соответственно в ней есть кнопка, таймер, прогресс бар.
Задача:
По нажатию кнопки запускается функция в которой имеется цикл. При каждом проходе цикла прогресс бар увеличивается на единицу. Не углубляясь в детали программы, не могли-бы вы сказать, почему отсутствует доступ к ProgressBar? Компилятор говорит, что ProgressBar1 не задекларирован. При этом я могу обратиться к нему из метода ButtonClick.procedure findCountOfFiles(startDirectory: string);
var
gotFile: TSearchRec;
begin
if (FindFirst(startDirectory + "*", faAnyFile, gotFile)) <> 0 then
begin
Form1.Close;
end;
Repeat
if ((gotFile.Attr and faDirectory) = faDirectory) and ((gotFile.Name = ".") or (gotFile.Name = "..")) then
begin
end
else if ((gotFile.Attr and faDirectory) = faDirectory) then
begin
findCountOfFiles(startDirectory + gotFile.Name + "\");
end
else
begin
inc(countOfFiles);
ProgressBar1.Position := ProgressBar1.Position + 1; //Доступ запрещён. Почему?
end;
Until (FindNext(gotFile)) <> 0;
FindClose(gotFile);
end;
← →
Германн © (2016-11-13 01:17) [1]
> procedure findCountOfFiles(startDirectory: string);
Это не метод формы, а регулярная процедура. Она ничего не знает и не может знать ни о каких-либо формах, ни об их (формах) свойствах.
← →
NoUser © (2016-11-13 02:09) [2]Удалено модератором
← →
Германн © (2016-11-13 02:13) [3]Удалено модератором
← →
stas © (2016-11-13 11:36) [4]
procedure TMyForm.findCountOfFiles(startDirectory: string);
← →
Rouse_ © (2016-11-13 11:38) [5]Если уж пишешь Form1.Close; из процедуры не относящейся к методам формы, то и к прогрессбару обращайся с указанием того, кому он принадлежит. Т.е.
Form1.ProgressBar1.Position := Form1.ProgressBar1.Position + 1;
← →
Германн © (2016-11-14 02:08) [6]
> Rouse_ © (13.11.16 11:38) [5]
>
> Если уж пишешь Form1.Close;
В регулярной процедуре, с какими бы целями она не была написана, в любом случае использование "дурных" глобальных переменных созданных шаблоном формы Дельфи есть дурной тон и место постоянных AV.
← →
Германн © (2016-11-14 02:23) [7]Удалено модератором
← →
KSergey © (2016-11-14 12:07) [8]А я уже знаю какой будет следующий вопрос.
← →
kilkennycat © (2016-11-14 13:42) [9]я тоже - почему не обновляется прогрессбар.
← →
Германн © (2016-11-15 01:35) [10]Удалено модератором
← →
Д7 (2016-11-17 12:55) [11]Отображение прогресса в данном случае бессмысленно, так как откуда вы возьмёте значение для ProgressBar1.Max?
Когда вы пишете в обработчике кнопок:ProgressBar1.Position := ...
На самом деле у вас вызывается вот такое:Self.ProgressBar1.Position := ...
А так как обработчик описан у класса TForm1, то Self указывает на окно в котором произошло событие, например на Form1 (если не создавали динамически и подобное).
Если по самой проблеме, правильнее будет... Ну вообще два варианта. И кстати чего это "find", либо "get", либо "set", либо "update".
Первый - передавать в параметрах объект вашей целевой формы и переменную принимающую количество файлов:procedure getCountOfFiles(const F: TForm1; var countOfFiles: integer; startDirectory: string);
var gotFile: TSearchRec;
begin
startDirectory:=IncludeTrailingBackslash(startDirectory);
if (FindFirst(startDirectory + "*", faAnyFile, gotFile)) <> 0 then
F.Close;
Repeat
if ((gotFile.Attr and faDirectory) = faDirectory) and ((gotFile.Name = ".") or (gotFile.Name = "..")) then
//
else
if ((gotFile.Attr and faDirectory) = faDirectory) then
getCountOfFiles(F, countOfFiles, IncludeTrailingBackslash(startDirectory + gotFile.Name))
else
begin
inc(countOfFiles);
F.ProgressBar1.Position := F.ProgressBar1.Position + 1;
end;
Until (FindNext(gotFile)) <> 0;
FindClose(gotFile);
end;
Второй (и более верный) - описать getCountOfFiles как метод класса, а не просто процедуру:type
TForm1 = class(TForm)
// ...
private
countOfFiles: integer;
procedure getCountOfFiles(startDirectory: string);
public
end;
// ...
procedure TForm1.getCountOfFiles(startDirectory: string);
var gotFile: TSearchRec;
begin
startDirectory:=IncludeTrailingBackslash(startDirectory);
if (FindFirst(startDirectory + "*", faAnyFile, gotFile)) <> 0 then
Form1.Close;
Repeat
if ((gotFile.Attr and faDirectory) = faDirectory) and ((gotFile.Name = ".") or (gotFile.Name = "..")) then
//
else
if ((gotFile.Attr and faDirectory) = faDirectory) then
getCountOfFiles(IncludeTrailingBackslash(startDirectory + gotFile.Name))
else
begin
inc(countOfFiles);
ProgressBar1.Position := ProgressBar1.Position + 1;
end;
Until (FindNext(gotFile)) <> 0;
FindClose(gotFile);
end;
Страницы: 1 вся ветка
Текущий архив: 2019.03.24;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.004 c