Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2015, 16:51   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
Вопрос Всплывающая форма

Доброго времени суток!
Есть пример всплывающей формы. В нём применяется Sleep, что соответственно приводит к подвисанию формы. Решил всё это сделать в потоке. Всё работает, но стоило подключить возможность остановки потока, как началось веселье. При последующих вызовах потока форма не желает отображаться.
Код:
...
type
  // Поток для Popup
  TPopup_Thread = class(TThread)
  private
    { Private declarations }
    i, x, y, iAction: Integer;
    Form: TForm;
  protected
    procedure Execute; override;
    procedure SyncProc;
  public
  end;
...
procedure TFormPopup.FormCreate(Sender: TObject);
begin
  // Делаем форму поверх всех окон
  SetWindowPos(Self.Handle, HWND_TOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
  SetWindowLong(Self.Handle, GWL_HWNDPARENT, GetDesktopWindow);
end; 

procedure TFormPopup.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Popup_Thread.Terminate;
  Self.Close;
end;

procedure TFormPopup.ProcShowPopup;
begin
  Popup_Thread := TPopup_Thread.Create(True);
  Popup_Thread.Form := Self;
  Popup_Thread.FreeOnTerminate := True;
  Popup_Thread.Start;
end;

procedure TPopup_Thread.Execute;
var
  i2: Integer;
begin
  // Присваиваем переменной X значение, равное вертикальному разрешению экрана
  x := Screen.Width;
  // Тут немного сложнее…WorkAreaHeight выводит не горизонтальное разрешение экрана, а горизонтальное разрешение рабочей области, то есть без панели задач
  y := Screen.WorkAreaHeight;

  iAction := 0;
  Synchronize(SyncProc);

  // Запускаем цикл, который за каждый шаг приподнимает форму на один пиксель
  for i2 := y downto y - Form.Height do
  begin
    if Self.Terminated then Break;

    i := i2;
    iAction := 1;
    Synchronize(SyncProc);
    Sleep(10); // Спим… Изменяя это значение можно менять скорость выезда окна (чем меньше тем быстрее)
  end;

  iAction := 2;
  Synchronize(SyncProc);

  Terminate;
end;

procedure TPopup_Thread.SyncProc;
begin
  case iAction of
  0: begin
    // Присваеваем свойству Top значение вертикали экрана, тем самым опускаем форму в самый низ экрана
    Form.Top := Screen.Height;
    // Горизонтальное положение формы := Горизонтальное разрешение экрана минус ширина формы. Располагаем форму в правом углу экрана
    Form.Left := x - Form.Width;
    // Устанавливаем прозрачность формы на 100 из 255 (не забываем установить в свойствах формы AlphaBlend := True)
    Form.AlphaBlendValue := 100;
  end;

  1: begin
    Form.Top := i; // Присваиваем вертикали значение i
    Form.FormStyle := fsStayOnTop; // Делаем форму поверх всех окон
  end;

  2: begin
    Form.FormStyle := fsStayOnTop;
    Form.AlphaBlendValue := 255; // Убираем прозрачность
  end;

  end;
end;
Shouldercannon вне форума Ответить с цитированием
Старый 07.03.2015, 16:58   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Close зачем в FormMouseUp?
Terminate в Execute какая-то тайная фишка?
И зачем вообще поток? Все просто таймером делается
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.03.2015, 17:01   #3
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

Цитата:
последующих вызовах потока
это как? убив поток его опять создавать надо
lomastr_ вне форума Ответить с цитированием
Старый 07.03.2015, 17:26   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

идея хорошая, реализация – ацтой.
полностью развяжи поток и форму, можно даже synchronize() выкинуть, передавай команды туды-сюды через sendmessage() и/или postmessage().
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 07.03.2015, 19:13   #5
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,453
По умолчанию

вот готовый TKMAlert v.1.0
beegl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Всплывающая форма ZET78 JavaScript, Ajax 4 29.10.2010 12:51
Всплывающая форма Swatch Microsoft Office Access 2 24.05.2010 11:02
Всплывающая форма? CraftR14 Общие вопросы Delphi 13 20.04.2010 20:55
Всплывающая подсказка Swatch Microsoft Office Access 1 18.03.2010 18:49
Всплывающая таблица asg Microsoft Office Excel 6 18.03.2009 07:58