| 
| 
 | Вопрос # 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] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |