Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.02.2016, 01:11
Graf16 Graf16 вне форума
Прохожий
 
Регистрация: 17.01.2016
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
Восклицание Графы. Визуализация поиска в глубину

Может быть кто-нибудь подскажет,как можно реализовать такую программу,а то с визуализацией вообще идей 0. Про компоненты сейчас читаю,но времени у меня очень мало

И вообще,можно ли сделать так,чтобы при нажатии на одну и ту же клавишу программа выполнялась поэтапно(не трассировка, а кнопка на форме),т.е. показывала добавление вершины в стек и к какой вершине мы идем, потом нажималась кнопка и показывалось далее??

Последний раз редактировалось Graf16, 18.02.2016 в 01:16.
Ответить с цитированием
  #2  
Старый 18.02.2016, 06:14
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Все можно, только надо подробнее знать задачу.
Самый простой вариант:
1 Реализуешь алгоритм поиска
2. Внутри поиска после выполнения одного шага (итерации цикла, рекурсивного вызова) делаешь проверку "глобального" флага. Т.е. пока флаг не выставлен, програ ждет.
3. После прохождения проверки сбрасываешь флаг
4. На кнопку вешаешь поднятие флага.
5. профит.

например:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
type
  TForm1=class(TForm)
  ...
  private
    CanContinue : Boolean;
  end;
 
...
 
procedure TForm.FormCreate(Sender : TObject);
begin
  Flag := False;
end;
 
// собственно алгоритм
// пусть просто выводит цифры в мемо от 1 до 10
procedure TForm1.DoMain;
var
  I : Integer;
begin
  For I := 1 To 10 Do
    Begin
      Memo1.Lines.Add(IntToStr(I));
 
      // теперь ждем нажатия кнопки
      While Not CanContinue Do
        Begin
          Application.ProcessMessages;
          Sleep(250); // ждем 1/4 сек
        End;
      CanContinue := False; // сбросили флаг
    End;
end;
 
// кнопка выполнения сл. шага
procedure TForm1.Button1Click(Sender : TObject);
begin
  CanContinue := True;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Graf16 (19.02.2016)
  #3  
Старый 19.02.2016, 02:04
Graf16 Graf16 вне форума
Прохожий
 
Регистрация: 17.01.2016
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Процедура TForm.FormCreate вызывается двойным щелчком по форме.
подскажите, что за процедура TForm1.DoMain ?
Ответить с цитированием
  #4  
Старый 19.02.2016, 06:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Просто метод, в котором реализован твой алгоритм.
Вместо DoMain можешь просто бросить еще одну кнопку и весь код перенести в ее обработчик.
Ответить с цитированием
  #5  
Старый 19.02.2016, 13:32
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

А я вот противник Application.ProcessMessages и Sleep. Можно обойтись и стандартным подходом. Автор сам указал правильное слово "поэтапно". Есть такой метод (в программируемых контроллерах) реализации метода конечных автоматов. Надо завести глобальный счётчик состояний. А в событии кнопки OnClick вызывать обработчик, в котором case выберет нужный фрагмент (и присвоит новый номер состояния).
Ответить с цитированием
  #6  
Старый 19.02.2016, 19:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от AlexSku
А я вот противник Application.ProcessMessages и Sleep. Можно обойтись и стандартным подходом. Автор сам указал правильное слово "поэтапно". Есть такой метод (в программируемых контроллерах) реализации метода конечных автоматов. Надо завести глобальный счётчик состояний. А в событии кнопки OnClick вызывать обработчик, в котором case выберет нужный фрагмент (и присвоит новый номер состояния).

В принципе, ты прав. Но когда код уже есть и просто надо приделать вот такое извращение, то предложенный мной путь гораздо проще. Особенно для какой-нить лабы...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:16.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025