|
Вопрос # 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] [Следующая »]
|
Егор (статус: 10-ый класс), 27 апреля 2011, 21:16 [#1]:
а memo не катит?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
IlluminatI (статус: 2-ой класс), 27 апреля 2011, 21:22 [#2]:
Тебе именно окошки нужны? Если нет, то либо Memo, либо ListBox.
|
|
Ерёмин А.А. (статус: *Администратор), 27 апреля 2011, 21:39 [#3]:
CreateMessageDialog() и потом Show.
|
|
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 (статус: Посетитель), 28 апреля 2011, 06:49 [#6]:
Ерёмин А.А.: За CreateMessageDialog() и потом Show. спасибо.
Как вариант может подойти, но в CreateMessageDialog заголовок не изменишь, а хотелось бы еще и его заменить, например на Сообщение от администратора.
Еще есть варианты?
Я пишу Клиент-Сервер. Одна из функций которого принимать и отображать сообщения от сервера, поэтому мне нужны имено окошки, а не мемо итд.. Вот и ищу, как это можно сделать стандартными средствами, а не рисовать окна самому
|
|
min@y™ (статус: Доктор наук), 28 апреля 2011, 08:30 [#7]:
Цитата (neon):
Нужно, чтобы после отображения сообщения, программа не ожидала нажатия пользователя на кнопку ОК, а продолжила свою работу, а сообщения бы скапливались на экране.
Чой-то мне эта идея не нравится. Представь, что юзер вышел покурить на улицу, потом решил пивка глотнуть, потом встретил подружку и пошёл с ней дружить в её квартирку часика на 2. Приходит потом на рабочее место, а там на экране 100500 твоих мессаджбоксов и комп намертво висит.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
neon (статус: Посетитель), 28 апреля 2011, 09:39 [#8]:
min@y™: Теоретически ты прав
Но! я же не маньяк... максимум за день будет висеть 2-3 сообщения!!!
Твой комп это выдержит 
ДА, и копьютер по-любому будет выключен вечером.
И пользователь будет вынужден прочесть 3! сообщения.
|
|
min@y™ (статус: Доктор наук), 28 апреля 2011, 09:50 [#9]:
Всё равно, я бы так делать не стал, а выводил бы сообщения в виде лога куданить в THtmlLite или чего-нить ещё гипертекствое.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ерёмин А.А. (статус: *Администратор), 28 апреля 2011, 10:26 [#10]:
Цитата (neon):
Как вариант может подойти, но в CreateMessageDialog заголовок не изменишь, а хотелось бы еще и его заменить
Почему же, эта функция генерирует целую форму, с которой потом можно делать что угодно. Когда впервые о ней узнал, тоже подумал: «ну нифига себе, насколько всё проще».
|
|
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 (статус: Студент), 28 апреля 2011, 11:37 [#12]:
Цитата (Егор):
зачем так сложно? почему просто не поместить форму по центру? Конечно можно обойтись без этого. Не очень красиво, когда предыдущее сообщение не видно из-за последующего.
"Digital Networked Knight"
|
|
min@y™ (статус: Доктор наук), 28 апреля 2011, 11:52 [#13]:
Цитата (neon):
Только вот теперь, как при нажатии на кнопку ОК сделать чтобы форма сообщения Закрывалась (Fmes.Free), а то зыкрывается только по нажатию крестика
А вот тут придётся добраться до ентой кнопки извне и назначить ей обработчик OnClick, в котором и закрывать форму.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
neon (статус: Посетитель), 28 апреля 2011, 12:31 [#14]:
А вот тут придётся добраться до ентой кнопки извне...
это и так очевидно...
Как это можно решить?
|
|
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™ (статус: Доктор наук), 28 апреля 2011, 13:01 [#16]:
Цитата (neon):
А вот тут придётся добраться до ентой кнопки извне...
это и так очевидно... Как это можно решить?
Да ёпрстэ! Залезь ты в модуль dialogs.pas, скопипасть оттудова исходник функции и переделай. Соль и перец добавь по вкусу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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™ (статус: Доктор наук), 1 мая 2011, 11:02 [#18]:
Цитата (neon):
Пытаюсь создать эвент но в процедуру закрытия кнопки программа не идет
Это ты назначаешь обработчик OnClick формы, а не кнопки на ней.
Цитата (neon):
Чета не получаеццо ))) Можешь готовый код написать?
Могу. А пиво будет?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
neon (статус: Посетитель), 1 мая 2011, 14:22 [#19]:
min@y™: А пиво будет
не вопрос ... тебе в килобайтной таре или мегабайтной)))
|
|
min@y™ (статус: Доктор наук), 1 мая 2011, 16:31 [#20]:
Цитата (neon):
не вопрос  ... тебе в килобайтной таре или мегабайтной
Не, мне в трёхлитровой, пожалуйста. 3х литров, думаю, хватит.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|