|
Вопрос # 5 238/ вопрос решён / |
|
Здравствуйте, эксперты!
Программа генерирует сообщения для пользователя и выдает их на экран.
Нужно, чтобы после отображения сообщения, программа не ожидала нажатия пользователя на кнопку ОК, а продолжила свою работу, а сообщения бы скапливались на экране.
Подскажите пожалуйста как это можно реализовать.
Например, как вывести следующие сообщения подряд:
procedure TForm1.Button1Click(Sender: TObject);
begin
MessageBox(handle,'test1','Заголовок',MB_OK);
MessageBox(handle,'test2','Заголовок',MB_OK);
end;
 |
Вопрос задал: 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 (статус: Студент), 2 мая 2011, 17:04 [#21]:
Цитата (neon):
Зачем перебирать контролы, я и так знаю что у меня кнопка 'OK'
Как отследить нажатие? Чем не вариант?
cmp := Fmes.FindComponent('OK');
if Assigned(cmp) then
TButton(cmp).OnClick := clk
"Digital Networked Knight"
|
|
min@y™ (статус: Доктор наук), 2 мая 2011, 17:14 [#22]:
Цитата (DNK):
Чем не вариант? Этот метод требует имени дочернего контрола, а не Caption. Иди курить учебник.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
DNK (статус: Студент), 2 мая 2011, 20:25 [#23]:
min@y™: Это и есть Name, а не Caption. Кури мои предыдущие сообщения.
"Digital Networked Knight"
|
|
min@y™ (статус: Доктор наук), 3 мая 2011, 18:46 [#24]:
2DNK: Дико извиняюсь, я был не прав. Действительно, имена кнопок равны их надписям.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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™ (статус: Доктор наук), 4 мая 2011, 13:18 [#26]:
Цитата (neon):
А как корректно теперь закрыть то самое окно? Fmes.Free - вызывает ошибку Fmes.Close - Если открыто несколько окон закрыват не свое окно)
Дык у тебя переменная-то Fmes одна, а должен быть список или массив.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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 (статус: Посетитель), 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]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|