Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
botsik
262 / 262 / 140
Регистрация: 05.06.2016
Сообщений: 1,247
Записей в блоге: 1
1

Процедуру в очередь

01.05.2017, 10:32. Показов 460. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
имею процедуру отображения и скрытия компонента с разными параметрами:
Anim(show);
Anim(hide);
нужно вызывать их по очереди:
Delphi
1
2
3
4
begin
Anim(show); 
Anim(hide);
end;
в процедуре включается таймер, где элементарно:
Delphi
1
2
3
4
5
6
7
8
9
10
if show then
begin
width:=width+step;
if width=max then timer.Enabled:=false; 
end else
if hide then
begin
width:=width-step; 
if width=0 then timer.Enabled:=false;
end;
Проблема в том, что мне нужно подождать пока таймер выключиться, и только потом запустить процедуру Anim(hide);
Запускать Anim(hide); сразу после timer.Enabled:=false; - не вариант, да и цикл repeat как-то не красиво выглядит здесь.

Добавлено через 21 час 58 минут
актуально
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.05.2017, 10:32
Ответы с готовыми решениями:

Дана очередь символов. Написать рекурсивную процедуру проверки, образуют ли символы очереди палиндром
Дана очередь символов. Написать рекурсивную процедуру проверки, образуют ли символы очереди...

Используя очередь, написать процедуру или функцию,которая меняет местами максимальный и минимальный элементы
Помогите пожалуйста, нужно "Використовуючи чергу,написати процедуру або функцію,яка міняє місцями...

Как используя очередь, написать процедуру или функцию, которая заменяет все отрицательные элементы файла на их абсолютные значения?
Как используя очередь, написать процедуру или функцию, которая заменяет все отрицательные элементы...

Используя очередь или стек описать процедуру или функцию обработки узлов дерева.
Используя очередь или стек (считать уже описанными их типы и операции над ними) описать процедуру...

19
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
01.05.2017, 10:37 2
вызывается функция "показать", в которой запускается таймер и отображается все, что необходимо, в обработчике таймера
Цитата Сообщение от cfbogd Посмотреть сообщение
Delphi
1
2
width:=width-step; 
if width=0 then timer.Enabled:=false;
0
botsik
262 / 262 / 140
Регистрация: 05.06.2016
Сообщений: 1,247
Записей в блоге: 1
01.05.2017, 11:26  [ТС] 3
cotseec, понимаете, сначала будет вызываться первая процедура, потом мгновенно вторая, первая не успеет "сделать свое дело", повторяю, нужно выполнить первую процедуру, дождаться пока выключиться таймер, и только тогда вызвать вторую процедуру.
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
01.05.2017, 11:34 4
Можно запихнуть все в отдельный поток и между вызовами процедур впихнуть такую конструкцию
Delphi
1
2
while not flag do caption:= 'wait';
  Caption:='go';
Соответственно по окончании работы первой процедуры поднимать флаг.
1
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
01.05.2017, 11:37 5
ну так засунь эти две процедуры в таймер и будет тебе счастие, то что ты там таймер включаешь ив ыключаешь при условии, это пофиг тем 2 процедурам, они стоят "друг после друга" и выполняются одна за другой с той частотой, сколько проц выдал проге на это занятие
0
botsik
262 / 262 / 140
Регистрация: 05.06.2016
Сообщений: 1,247
Записей в блоге: 1
01.05.2017, 12:22  [ТС] 6
пока я додумался только до процедуры, которая будет между процедурами:
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.wait;
begin
  while Timer1.ENABLED do // жду пока таймер выключиться
  begin
    sleep(1);
    Application.ProcessMessages;
  end;
end;
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
01.05.2017, 12:44 7
да сразу sleep запихал бы, чтож уж там

Кликните здесь для просмотра всего текста
Delphi
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;
 
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 
var
  Form1: TForm1;
  k: Integer;
implementation
 
{$R *.dfm}
 
procedure A;
begin
  Form1.Caption := 'aaaaaaaaaaaaaaa'
end;
 
procedure B;
begin
  Form1.Caption := 'bbbbbbbbbbbbbbb'
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  // start timer
  Timer1.Enabled := True;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // wait 3 sec
  if k = 3 then
    A
  // wait 6 sec
  else if k = 6 then
    begin
      B;
      Timer1.Enabled := False;
      k := 0;
    end;
 
  k := k + 1;
end;
 
end.
1
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
01.05.2017, 13:22 8
Цитата Сообщение от cfbogd Посмотреть сообщение
нужно выполнить первую процедуру, дождаться пока выключиться таймер, и только тогда вызвать вторую процедуру.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.Proc1
begin
   {делаем что-то}
   timer.Enabled := true; // включаем таймер
end;
 
procedure TForm1.OnTimer(Sender: TObject)
begin
   {делаем что-то}
   dec(width, step); 
   timer.Enabled:=not (width = 0); // условие выключения таймера
   if not timer.Enabled then Proc2; // если таймер выключен, то вызываем вторую процедуру
end;
 
procedure TForm1.Proc2
begin
   {делаем что-то уже с выключенным таймером}
end;
как-то так, теперь словами:
вызываем первую процедуру, в ней запускаем таймер, в обработчике таймера проверяем его работу, если не работает, то вызываем вторую процедуру
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
01.05.2017, 21:52 9
есть и другие варианты
таймер все время работает, но в зависимости от состояния некоего флага запускает либо первую процедуру, которая производит один шаг первой анимации
либо вторую, которая соответственно выполняет один шаг второй анимации
переключение флага производится при достижении какого-то условия
0
botsik
262 / 262 / 140
Регистрация: 05.06.2016
Сообщений: 1,247
Записей в блоге: 1
02.05.2017, 17:00  [ТС] 10
krapotkin, неплохая идея, попробую.
А пока наверстал процедуру без таймера
Она здесь
Delphi
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Tdir = (dTOP, tLEFT, tWIDTH, tHEIGHT);
.  .  .
Procedure anm(p: TPanel; d: Tdir; firstpos, secondpos: integer);
const
  s = 10;
var
  b, c: boolean;
begin
  b := firstpos < secondpos;
  repeat
    case d of
      dTOP:
        if b then
        begin
          p.Top := p.Top + s;
          c := p.Top >= secondpos;
        end
        else
        begin
          p.Top := p.Top - s;
          c := p.Top <= secondpos;
        end;
      tLEFT:
        if b then
        begin
          p.Left := p.Left + s;
          c := p.Left >= secondpos;
        end
 
        else
        begin
          p.Left := p.Left - s;
          c := p.Left <= secondpos;
        end;
      tWIDTH:
        if b then
        begin
          p.Width := p.Width + s;
          c := p.Width >= secondpos;
        end
        else
        begin
          p.Width := p.Width - s;
          c := p.Width <= secondpos;
        end;
      tHEIGHT:
        if b then
        begin
          p.Height := p.Height + s;
          c := p.Height >= secondpos;
        end
        else
        begin
          p.Height := p.Height - s;
          c := p.Height <= secondpos;
        end;
    end;
    sleep(5);
    Application.ProcessMessages;
  until c;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  anm(panel1, tWIDTH, panel1.Width, 0);   // hide
  anm(panel1, tWIDTH, panel1.Width, 500); // show
end;

проблема лишь в том, что мне нужно передавать не только панели, и другие компоненты...
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
02.05.2017, 17:12 11
Цитата Сообщение от cfbogd Посмотреть сообщение
проблема лишь в том, что мне нужно передавать не только панели, и другие компоненты...
Delphi
1
Procedure anm(p: TComponent; d: Tdir; firstpos, secondpos: integer);
?
0
botsik
262 / 262 / 140
Регистрация: 05.06.2016
Сообщений: 1,247
Записей в блоге: 1
02.05.2017, 17:24  [ТС] 12
TFullControl, да, но как обращаться к *визуальному компоненту и изменять left, top и т.д.?
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
02.05.2017, 17:45 13
cfbogd, универсального способа не знаю, можно вручную все лопатить, но думаю, более опытные товарищи подскажут менее энергоемкий метод, подождем...
Delphi
1
2
3
4
5
6
var
  bat: TButton;
  pnl: TPanel;
begin
if (p is TPanel) then pnl:=TPanel(p) ...
if (p is TButton) then btn:=TButton(p) ...
0
botsik
262 / 262 / 140
Регистрация: 05.06.2016
Сообщений: 1,247
Записей в блоге: 1
02.05.2017, 17:51  [ТС] 14
TFullControl, можно и не ждать. Узнал что TComponent - это компоненты вообще, а вот TControl - именно визуальные компоненты. Исходя из этого имеем:
Delphi
1
Procedure anm(p: TControl; d: Tdir; firstpos, secondpos: integer);
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
02.05.2017, 17:55 15
Интересно, что если компонент имеет свойства Left и тп, то можно вот таким образом обращаться к любым компонентам. То есть передавать эдиты, кнопки и т.п. и оно будет работать. Ясное дело, что это бредовый код, но рабочий.
Delphi
1
2
3
Procedure anm(p: TComponent; d: Tdir; firstpos, secondpos: integer);
...
TPanel(p).left:=TPanel(p).left+5;
Добавлено через 2 минуты
cfbogd, мои поздравления.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
02.05.2017, 22:07 16
не надо Application.ProcessMessages
потому что ломается цикл обработки сообщений в вашей программе
надо таймер
0
botsik
262 / 262 / 140
Регистрация: 05.06.2016
Сообщений: 1,247
Записей в блоге: 1
02.05.2017, 22:28  [ТС] 17
Цитата Сообщение от krapotkin Посмотреть сообщение
надо таймер
тогда придется ждать пока таймер выключиться
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
02.05.2017, 22:34 18
Конечный автомат
в данном случае граф переходов содержит две вершины - запустить одну процедуру или вторую, о чем написано в #9
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
03.05.2017, 06:36 19
Цитата Сообщение от cfbogd Посмотреть сообщение
таймер выключиться
ааааааа

таймер выключится, когда по какому-то условию кто-то, возможно инопланетяне, напишут Timer.enabled:=false;
Миниатюры
Процедуру в очередь  
0
cfbogd
03.05.2017, 19:55  [ТС]     Процедуру в очередь
  #20

Не по теме:

Цитата Сообщение от krapotkin Посмотреть сообщение
ааааааа
вы уж простите :pardon: приходиться писать не на родном языке, чтобы не нарушать правил форума.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2017, 19:55

Используя очередь или стек, описать процедуру или функцию, определяющую число вхождений элемента Е в дерево Т
Народ помогите пожалуйста! Проблема в том, что не понимаю суть задания. Прошу не код, а объяснения...

Сформировать односвязную очередь из элементов, которые входят в очередь Q1, но не входят в очередь Q2
Составить программу обработки динамической структуры данных: сформировать односвязную очередь Q из...

Очередь (сделать очередь, чтобы добавляло, удаляло, читало. Не STL.)
Помогите пожалуйста написать очередь. Есть Температура double и ее тип int ну и нужно сделать...

Сформировать очередь по файлу целых чисел. Промоделировать очередь в супермаркете
Сформировать очередь по файлу целых чисел. Промоделировать очередь в супермаркете. В каждый момент...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru