Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 238

/ вопрос решён /

Здравствуйте, эксперты!

Программа генерирует сообщения для пользователя и выдает их на экран.
Нужно, чтобы после отображения сообщения, программа не ожидала нажатия пользователя на кнопку ОК, а продолжила свою работу, а сообщения бы скапливались на экране.

Подскажите пожалуйста как это можно реализовать.

Например, как вывести следующие сообщения подряд:

procedure TForm1.Button1Click(Sender: TObject);
begin
MessageBox(handle,'test1','Заголовок',MB_OK);
MessageBox(handle,'test2','Заголовок',MB_OK);
end;

neon Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: neon (статус: Посетитель)
Вопрос отправлен: 27 апреля 2011, 21:15
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: DNK

Здравствуйте, neon!
Подсказываю схему. Сделать свою форму с меткой и кнопкой. Установить свойства: BorderStyle=bsDialog и FormStyle=fsStayOnTop (всегда будет поверх всех окон данного приложения). Процедура MessageBox должна будет содержать следующее:
1. Проходимся по массиву Screen.Forms и с помощью оператора is находим существующие окна данного класса и анализируем их координаты.
2. Создаётся экземпляр формы.
3. Устанавливаем позицию формы так, чтобы с остальными окнами оно распологалось каскадом (но нужно следить чтоб за край экрана не ускакала).
3. Заносится сообщение в метку.
4. Показываем форму с помощью метода Show.

P.S.: Есть вероятно что, можно организовать вывод и стандартных окон при помощи параллельных нитей, но я не знаю всех ньюансов данного способа.

Ответ отправил: DNK (статус: Студент)
Время отправки: 27 апреля 2011, 22:09


Мини-форум вопроса

Всего сообщений: 28; последнее сообщение — 4 мая 2011, 14:10; участников в обсуждении: 6.

Страницы: [« Предыдущая] [1] [2]

DNK

DNK (статус: Студент), 2 мая 2011, 17:04 [#21]:

Цитата (neon):

Зачем перебирать контролы, я и так знаю что у меня кнопка 'OK'
Как отследить нажатие?
Чем не вариант?
cmp := Fmes.FindComponent('OK');
if Assigned(cmp) then
  TButton(cmp).OnClick := clk
"Digital Networked Knight"
min@y™

min@y™ (статус: Доктор наук), 2 мая 2011, 17:14 [#22]:

Цитата (DNK):

Чем не вариант?
Этот метод требует имени дочернего контрола, а не Caption. Иди курить учебник.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 2 мая 2011, 20:25 [#23]:

min@y™: Это и есть Name, а не Caption. Кури мои предыдущие сообщения.
"Digital Networked Knight"
min@y™

min@y™ (статус: Доктор наук), 3 мая 2011, 18:46 [#24]:

2DNK: Дико извиняюсь, я был не прав. Действительно, имена кнопок равны их надписям.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
neon

neon (статус: Посетитель), 4 мая 2011, 12:46 [#25]:

DNK: Спасибо! Еще на один шаг ближе..
А как корректно теперь закрыть то самое окно?
Fmes.Free - вызывает ошибку
Fmes.Close - Если открыто несколько окон закрыват не свое окно)

unit test;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
    TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
     procedure clk (Sender: TObject);
  end;
 
var
  Form1: TForm1;
  Fmes:TForm;
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
 cmp : TComponent;
  begin
   Fmes:=CreateMessageDialog('test1',mtWarning, [mbOK]);
   Fmes.FormStyle:=fsStayOnTop;
   cmp := Fmes.FindComponent('OK');
   if Assigned(cmp) then  TButton(cmp).OnClick := clk;
   Fmes.Show;
   end;
 
 procedure TForm1.clk(Sender: TObject);
 begin
  //Fmes.Free;
  Fmes.Close;
 end;
 
end.
min@y™

min@y™ (статус: Доктор наук), 4 мая 2011, 13:18 [#26]:

Цитата (neon):

А как корректно теперь закрыть то самое окно? Fmes.Free - вызывает ошибку Fmes.Close - Если открыто несколько окон закрыват не свое окно)

Дык у тебя переменная-то Fmes одна, а должен быть список или массив.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 4 мая 2011, 13:23 [#27]:

Потому что глобальные переменные - это зло! Переменную Fmes перенеси в метод Button1Click, чтоб не маячила где непопадя. В нём же добавь назначение обработчика закрытия формы до метода Show:
Fmes.OnClose := FmesClose;
Код обработчика:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;
Код метода clk:
TForm(TButton(Sender).Owner).Close;
"Digital Networked Knight"
neon

neon (статус: Посетитель), 4 мая 2011, 14:10 [#28]:

DNK: Спасибо тебе Огромнейшее!!!!
Все получилось!

Всем остальным, кто откликнулся, тоже большое СПАСИБО!

 
unit test;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
    TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
 
  private
    { Private declarations }
     procedure clk (Sender: TObject);
     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
 cmp : TComponent;
 Fmes:TForm;
  begin
   Fmes:=CreateMessageDialog('test1',mtWarning, [mbOK]);
   Fmes.FormStyle:=fsStayOnTop;
   Fmes.Caption:='Заголовок';
   cmp := Fmes.FindComponent('OK');
   if Assigned(cmp) then  TButton(cmp).OnClick := clk;
   Fmes.OnClose:=FormClose;
   Fmes.Show;
   end;
 
 procedure TForm1.clk(Sender: TObject);
 begin
  TForm(TButton(Sender).Owner).Close;
 end;
 
 procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
 begin
 Action := caFree;
 end;
 
end.

4 мая 2011, 14:14: Статус вопроса изменён на решённый (изменил автор вопроса — neon)

Страницы: [« Предыдущая] [1] [2]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 апреля 2026, 01:55
Выполнено за 0.04 сек.