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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2013, 13:53   #1
hemn6vyr
Пользователь
 
Регистрация: 18.06.2012
Сообщений: 67
По умолчанию Antifreeze. Не хочет создаваться в потоках.

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

Если использовать просто sleep то наведённый на окошко указатель показывает "зависание" приложения, что не совсем этично :-)

Есть ли какие нибудь компоненты аналоги антифриза?

Код:
Unit PopUpThreadUnit;

Interface

  Uses
    System.Classes,
    Vcl.Forms,
    Vcl.StdCtrls,
    Winapi.Windows,
    System.SysUtils,
    Vcl.Graphics,
    Vcl.Controls,
    Vcl.Dialogs,
    IdAntiFreezeBase,
    Vcl.IdAntiFreeze;

  Type
    PopUpThread = Class(TThread)
      AntiFreeze: TIdAntiFreeze;
      Procedure Execute; Override;
    End;

  Var
    PopUpMessage: String;
    FontColor: TColor;
    Count: Integer;

Implementation

  Procedure PopUpThread.Execute;
    Var
      H, Aw: HWND;
      Rec: TRect;
      NeededTop: Integer;
      HintForm: TForm;
      HintLabel: TLabel;
      Rgn: HRGN;

    Begin
      Try
        AntiFreeze := TIdAntiFreeze.Create(Nil);
        If Count >= 1 Then
          Count := Count + 1
        Else
          Count := 1;
        NameThreadForDebugging('PopUpWindow');
        H := FindWindow('Shell_TrayWnd', Nil);
        If H = 0 Then
          Exit;
        GetWindowRect(H, Rec);
        HintForm := TForm.Create(Nil);
        With HintForm Do
          Begin
            Width := 250;
            Height := 50;
            Color := FontColor;
            BorderStyle := BsNone;
            Rgn := CreateRoundRectRgn(0, 0, ClientWidth, ClientHeight, 15, 15);
            SetWindowRgn(Handle, Rgn, True);
            HintLabel := TLabel.Create(Nil);
            With HintLabel Do
              Begin
                Parent := HintForm;
                WordWrap := True;
                Caption := ' ' + Trim(PopUpMessage) + ' ';
                Align := AlClient;
                Layout := TlCenter;
                Alignment := TaCenter;
              End;
            AlphaBlend := True;
            AlphaBlendValue := 220;
            Aw := GetActiveWindow;
            ShowWindow(Handle, SW_SHOWNOACTIVATE);
            SetActiveWindow(Aw);
            Left := Screen.Width - Width;
            Top := Screen.Height - 50;
            NeededTop := Rec.Top - Height * Count;
            While Top > NeededTop Do
              Begin
                Top := Top - 2;
                Repaint;
                Antifreeze.Sleep(15);
                Antifreeze.Process;
              End;
            Antifreeze.Sleep(2500);
            NeededTop := Screen.Width - 20;
            Count := Count - 1;
            While Top < NeededTop Do
              Begin
                Top := Top + 2;
                Repaint;
                Antifreeze.Sleep(15);
                Antifreeze.Process;
              End;
            HintLabel.Free;
            Free;
          End;
      Except
        On Error: Exception Do
          Begin
            ShowMessage('Ошибка: [' + Error.ClassName + '] [' + Error.Message + ']');
          End;
      End;
    End;
End.
hemn6vyr вне форума Ответить с цитированием
Старый 27.04.2013, 14:02   #2
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

вроде антифриз только на инди действует, нет? Да и не нужно больше одного. Его так же можно просто в дезайнтайме на форму кинуть из вкладки инди миск.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 27.04.2013, 14:07   #3
hemn6vyr
Пользователь
 
Регистрация: 18.06.2012
Сообщений: 67
По умолчанию

Цитата:
Сообщение от alextrof94 Посмотреть сообщение
вроде антифриз только на инди действует, нет? Да и не нужно больше одного. Его так же можно просто в дезайнтайме на форму кинуть из вкладки инди миск.
Вот он антифриз.
Код:
IdAntiFreezeBase,
Vcl.IdAntiFreeze;
==========
AntiFreeze: TIdAntiFreeze;
==========
AntiFreeze := TIdAntiFreeze.Create(Nil);
дезайнтайма не было, форма описана тут
Код:
HintForm: TForm;
==========
HintForm := TForm.Create(Nil);
With HintForm Do
  Begin
    Width := 250;
    Height := 50;
    Color := FontColor;
    BorderStyle := BsNone;
    Rgn := CreateRoundRectRgn(0, 0, ClientWidth, ClientHeight, 15, 15);
    SetWindowRgn(Handle, Rgn, True);
    HintLabel := TLabel.Create(Nil);
hemn6vyr вне форума Ответить с цитированием
Старый 27.04.2013, 14:08   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Есть ли какие нибудь компоненты аналоги антифриза?
Компонентов нет, но есть схемы: То что антифриз должен защищать засосывать в сопроцесс TTHread. Ессно нужно научится работать с этим классом.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
общий компонент типо AntiFreeze - есть ли? paravoz1k Общие вопросы Delphi 5 18.03.2012 15:28
Сокеты в потоках unmazable Общие вопросы Delphi 0 12.03.2012 13:35
Canvas в потоках demigod82 Общие вопросы Delphi 9 05.03.2012 08:51
при нажатии на кнопку должна создаваться новая форма ***СкаЙ*** Помощь студентам 5 13.06.2007 11:51