Экспертная система 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] [Следующая »]

Егор

Егор (статус: 10-ый класс), 27 апреля 2011, 21:16 [#1]:

а memo не катит?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
IlluminatI

IlluminatI (статус: 2-ой класс), 27 апреля 2011, 21:22 [#2]:

Тебе именно окошки нужны? Если нет, то либо Memo, либо ListBox.
Ерёмин А.А.

Ерёмин А.А. (статус: *Администратор), 27 апреля 2011, 21:39 [#3]:

CreateMessageDialog() и потом Show.
DNK

DNK (статус: Студент), 27 апреля 2011, 22:16 [#4]:

Про CreateMessageDialog не знал. Значит всё ещё проще.
"Digital Networked Knight"
Егор

Егор (статус: 10-ый класс), 28 апреля 2011, 04:27 [#5]:

Цитата (DNK):

1. Проходимся по массиву Screen.Forms и с помощью оператора is находим существующие окна данного класса и анализируем их координаты.
2. Создаётся экземпляр формы.
3. Устанавливаем позицию формы так, чтобы с остальными окнами оно распологалось каскадом (но нужно следить чтоб за край экрана не ускакала).

зачем так сложно? почему просто не поместить форму по центру?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
neon

neon (статус: Посетитель), 28 апреля 2011, 06:49 [#6]:

Ерёмин А.А.: За CreateMessageDialog() и потом Show. спасибо.

Как вариант может подойти, но в CreateMessageDialog заголовок не изменишь, а хотелось бы еще и его заменить, например на Сообщение от администратора.

Еще есть варианты?

Я пишу Клиент-Сервер. Одна из функций которого принимать и отображать сообщения от сервера, поэтому мне нужны имено окошки, а не мемо итд.. Вот и ищу, как это можно сделать стандартными средствами, а не рисовать окна самому ;)
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2011, 08:30 [#7]:

Цитата (neon):

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

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

neon (статус: Посетитель), 28 апреля 2011, 09:39 [#8]:

min@y™: Теоретически ты прав
Но! я же не маньяк... максимум за день будет висеть 2-3 сообщения!!!
Твой комп это выдержит :)

ДА, и копьютер по-любому будет выключен вечером.
И пользователь будет вынужден прочесть 3! сообщения.
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2011, 09:50 [#9]:

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

Ерёмин А.А. (статус: *Администратор), 28 апреля 2011, 10:26 [#10]:

Цитата (neon):

Как вариант может подойти, но в CreateMessageDialog заголовок не изменишь, а хотелось бы еще и его заменить

Почему же, эта функция генерирует целую форму, с которой потом можно делать что угодно. Когда впервые о ней узнал, тоже подумал: «ну нифига себе, насколько всё проще».
neon

neon (статус: Посетитель), 28 апреля 2011, 11:24 [#11]:

Ерёмин А.А.: Точно целую форму рисует, круто!

Только вот теперь, как при нажатии на кнопку ОК сделать чтобы форма сообщения Закрывалась (Fmes.Free), а то зыкрывается только по нажатию крестика

procedure TForm1.Button1Click(Sender: TObject);
var
 Fmes:TForm;
begin
 Fmes:=CreateMessageDialog('test1',mtWarning  , [mbOK]);
 Fmes.Caption:='Заголовок';
 Fmes.Show;
 
 Fmes:=CreateMessageDialog('test2',mtWarning, [mbOK]);
 Fmes.Caption:='Заголовок2';
 Fmes.Show;
end;
DNK

DNK (статус: Студент), 28 апреля 2011, 11:37 [#12]:

Цитата (Егор):

зачем так сложно? почему просто не поместить форму по центру?
Конечно можно обойтись без этого. Не очень красиво, когда предыдущее сообщение не видно из-за последующего.
"Digital Networked Knight"
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2011, 11:52 [#13]:

Цитата (neon):

Только вот теперь, как при нажатии на кнопку ОК сделать чтобы форма сообщения Закрывалась (Fmes.Free), а то зыкрывается только по нажатию крестика

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

neon (статус: Посетитель), 28 апреля 2011, 12:31 [#14]:

А вот тут придётся добраться до ентой кнопки извне...

это и так очевидно...
Как это можно решить?
DNK

DNK (статус: Студент), 28 апреля 2011, 12:41 [#15]:

Не иначе как перебирать Contols или метода FindComponent.

ButtonNames: array[TMsgDlgBtn] of string = (
    'Yes', 'No', 'OK', 'Cancel', 'Abort', 'Retry', 'Ignore', 'All', 'NoToAll',
    'YesToAll', 'Help');
"Digital Networked Knight"
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2011, 13:01 [#16]:

Цитата (neon):

А вот тут придётся добраться до ентой кнопки извне...
это и так очевидно... Как это можно решить?

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

neon (статус: Посетитель), 1 мая 2011, 08:12 [#17]:

DNK: Не иначе как перебирать Contols или метода FindComponent.
Зачем перебирать контролы, я и так знаю что у меня кнопка 'OK'
Как отследить нажатие?


min@y™: Соль и перец добавь по вкусу
Чета не получаеццо ))) Можешь готовый код написать?

Пытаюсь создать эвент но в процедуру закрытия кнопки программа не идет

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
    procedure clk (Sender: TObject);
    { Private declarations }
  public
    Fmes:TForm;
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
 
var
 mr:TModalResult;
begin
 Fmes:=CreateMessageDialog('test1',mtWarning  , [mbOK]);
 Fmes.Caption:='Заголовок';
 Fmes.OnClick := clk;
 Fmes.Show;
 
 Fmes:=CreateMessageDialog('test2',mtWarning, [mbOK]);
 Fmes.Caption:='Заголовок2';
 Fmes.Show;
end;
 
 procedure TForm1.clk(Sender: TObject);
 begin
   Fmes.Free;
   //ShowMessage('нажата кнопка');
 end;
 
 
 
end.
min@y™

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

Цитата (neon):

Пытаюсь создать эвент но в процедуру закрытия кнопки программа не идет

Это ты назначаешь обработчик OnClick формы, а не кнопки на ней.

Цитата (neon):

Чета не получаеццо ))) Можешь готовый код написать?

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

neon (статус: Посетитель), 1 мая 2011, 14:22 [#19]:

min@y™: А пиво будет
не вопрос :)... тебе в килобайтной таре или мегабайтной)))
min@y™

min@y™ (статус: Доктор наук), 1 мая 2011, 16:31 [#20]:

Цитата (neon):

не вопрос :)... тебе в килобайтной таре или мегабайтной

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

Страницы: [1] [2] [Следующая »]

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:35
Выполнено за 0.04 сек.