Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выйти из процедуры 
:(
    Опции темы
Пикачу
Дата 7.6.2007, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 18.7.2006
Где: Московская област ь.

Репутация: нет
Всего: нет



Господа подскажите как выйти правильно из процедуры.
Программа рассортировывает файлы по папкам с датами. Дату берет из самого файла.
Все работает.  Иногда,  необходимо прервать обработку.

При нажатии на кнопку программа сперва выходит из процедуры , а потом возвращается в середину процедуры и файлы продолжают обрабатыватся дальше.
Я указал восклицательными знаками с какого места продолжается работа. Подскажите пожалуйста что  не так? Заранее спасибо.

Код

procedure TfrmMain.btnRunClick(Sender: TObject);
var   {Объявим переменные}
  StLine,FileLoad,DocData,DirOut: string;
  dD,mM,yY:string;
  f:TextFile;
  y,m:integer;

begin

 Application.ProcessMessages; {Не забираем всё процессорное время}
if stopRun=True then  {Переменная остановки выключена?}
      begin      {Прерываем сортировку}
         if MessageBox(frmMain.Handle, 'Прервать сортировку?',
        'Вопрос', MB_YESNO+MB_ICONQUESTION+MB_DEFBUTTON1+MB_APPLMODAL) = IDYES then
          begin
           stopRun:=False;   {Переключили переменную останова}
           Exit;             {Вышли из процедуры}
          end; 
    end
 else
   begin     {Сортируем файлы}
    If Length(OutDir)=0 then btnDirOut.Click; {Если забыли выбрать конечную папку, запросим её}
    if sort=True then  {Папку выбрали сортируем.Иначе вернемся на начало.}
      begin
           begin    {}
             stopRun:=True;  {Включим переменную остановки}
             PBar.Step:=1;
             Pbar.Max:=i;     {Присваеваем прогрессбару максимум}
             btnRun.ImageIndex:=4;   {Меняем данные на кнопке}
             btnRun.Hint:='Остановить сортировку';
             {Выключили кнопки}
             chBox.Enabled:=False;
             btnDirIn.Enabled:=False;
             btnDirOut.Enabled:=False;
             btnAbout.Enabled:=False;
             btnExit.Enabled:=False;
            end;
      for m := 0 to i - 1 do    {Считываем файлы из выбранной папок}
        begin
          ListBox.Selected[m]:=True;
           if Listbox.Selected[m]then
             begin
              NameFile:=Listbox.Items.Strings[m]; {Взяли из списка имя файла}
              FileLoad:=NameDir +'\'+ NameFile;   {И присвоили ему путь}
             end;

              begin  {Начинаем читать файлы по очереди}
               y:=0;  {Счетчик строк}
                 try
                   AssignFile(f,FileLoad ); {Читаем выбранный файл}
                   Reset(f);
                      while not Eof(f) do
                        begin
                         ReadLn(f,StLine);
                         StLine:=StringReplace(StLine,';',#13#10,[rfReplaceAll]);
                         SG.Rows[y].SetText(pchar(StLine));
                         inc(y);
                        end;
                    CloseFile(f); {Закроем файл, так как будем удалять}
                    frmMain.SG.RowCount:=y; {Заполняем таблицу}
                 except
              end;
            end;
!!!!!!!! 
              try
                 Application.ProcessMessages;
                 DocData:= frmMain.SG.Cells[1,6];  {Вытащим из файла дату}
                 dD:=copy(DocData,1,2);
                 mM:=copy(DocData,4,2);
                 yY:=copy(DocData,7,2);
                 DocData:='20'+yY+mM+dD;           {Преобразуем дату в имя папки}
                 DirOut := OutDir+'\'+ DocData;    {Создадим папки}
                 ForceDirectories(DirOut);
                 WindowsCopyFile(NameDir+'\'+ NameFile, DirOut);  {Раскидываем файла по папкам}
                 NameFile:=copy(nameFile,1,(Length(NameFile)-4)); {Пишем в окно, что происходит}
                 lblName.Caption:='Сортируется '+ IntToStr(m) + ' из ' + IntToStr(i)+', файл:"' + NameFile+'"';
                 PBar.Position:=m;  {Передвигаем прогрессбар}
               except
              end;
           end;
              try
               begin
                 {Вывели новую надпись}
                 lblName.Caption:='Отсортировано файлов: '+ IntToStr(i) + ' шт.';
                 {Включили таймер}
                 timer.Enabled:=True;
                 {Вернули назад кнопку сортировки}
                 btnRun.Enabled:=False;
                 btnRun.ImageIndex:=3;
                 btnRun.Hint:='Выполнить сортировку';
                 btnRun.ShowHint:=False;
                 {Включили кнопки}
                 chBox.Enabled:=True;
                 btnDirIn.Enabled:=True;
                 btnDirOut.Enabled:=True;
                 btnAbout.Enabled:=True;
                 btnExit.Enabled:=True;
                 btnDirIn.Hint:='Выбор исходной папки с файлами.';
                 {Переключили переменную останова}
                 stopRun:=False;
               end;
           except
         end;
       end;
    end;
end;


PM MAIL   Вверх
Coder
Дата 8.6.2007, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 5
Всего: 11



По идее, пока ВСЯ процедура не выполниться нажатие кнопки второй раз бесполезно и Application.ProcessMessages; тебе не помогут.
Я такую же проблему решал через потоки. Открываю поток и им читаю файлы. В потоке перед каждым чтением файла стоит проверка (как  у тебя if stopRun=True then ), вот если флаг остановки установлен, то тогда прерываем чтение и закрываем поток.
Если не через поток, то тоже самое сделать через таймер.
PM MAIL   Вверх
sw04
Дата 8.6.2007, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 372
Регистрация: 22.1.2007
Где: Ufa

Репутация: нет
Всего: 18



Пикачу, работа с потомками приведена в соседнм разделе (Win Api). 
Надо завести поток, и запускать (resume) или останавливать (suspend), при нажатии на button.


--------------------
<удалено администрацией>
PM   Вверх
Sunvas
Дата 8.6.2007, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



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


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Пикачу
Дата 8.6.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 18.7.2006
Где: Московская област ь.

Репутация: нет
Всего: нет



Господа, спасибо за направления движения.

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

Поэтому если не трудно, можно небольшой кусочек примера кода или где почитать что такое потоки и как это реализовывается.
Спасибо.

Это сообщение отредактировал(а) Пикачу - 8.6.2007, 10:53
PM MAIL   Вверх
Sunvas
Дата 8.6.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Поиск по слову Thread по форуму поможет. +DRKB... Что еще сказать?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Mephisto
Дата 8.6.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 1
Всего: 34



PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.