Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
15-1477663334
aka
2016-10-28 17:02
2019.03.24
Цена программы


15-1477863002
Юрий
2016-10-31 00:30
2019.03.24
С днем рождения ! 31 октября 2016 понедельник


2-1478988344
Иван
2016-11-13 01:05
2019.03.24
Отсутствует доступ к объектам формы из метода


2-1479269822
dyudyuka
2016-11-16 07:17
2019.03.24
Прошу помощи с решением задачи по запросу


15-1477656123
iop
2016-10-28 15:02
2019.03.24
твердотельное реле