Выкинуть MsgBox, не "замораживая" при этом программу

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Выкинуть MsgBox, не "замораживая" при этом программу

Сообщение Rody66 » 23.09.2011 (Пт) 16:20

Собственно цель - создать независимый msgbox, который никак не будет влиять на работу программы. То есть при вызове мсгбокса, чтобы программа не останавливалась, а продолжала дальше свою работу. Пробовал кидать месагу в новом потоке, но все счетчики на форме точно так же останавливаются, а в скомпилированном виде, вообще ошибка "память не может быть..", ну в общем как всегда трабла с этими потоками. Так вот, у меня есть парочка вариантов, хоть и не слишком оптимальны, но, тем не менее, озвучу:
Первый вариант запускать себя саму же (программу) с определенными параметрами. Например soft.exe /title "Заголовок собщения" /text "Текст сообщения" /type 48
В инициализации формы сделать проверку на наличие параметров, и если оные имеются, хайдить форму, и каким то образом провести парсинг, загнать все параметры в переменные, после чего кинуть мессагу с этими переменными.
Так же имеется несколько более извращенный способ - это создать маленькую программу, функция которой - только выводить мессагу, сделать подгрузку ресурсов и подгружать тайтл, текст и тип сообщения, после чего точно так же загонять все в переменные и выводить месагу. Эту программу кинуть в ресурсы основной программы, которая при необходимости вывести независимую месагу, будет загружать ресурс, задавать необходимые данные, писать получившееся в msg.exe и запускать.
Но имхо, все это как то мудрено. Может быть есть способ проще? Спасибо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Выкинуть MsgBox, не "замораживая" при этом программу

Сообщение Хакер » 23.09.2011 (Пт) 16:22

Обоснуй, зачем нужен немодальный MsgBox.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.09.2011 (Пт) 17:08

Просто изпользовать WinApi с нулевым дескриптором:
Код: Выделить всё
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long

Private Sub Command1_Click()
  MessageBox 0, "Текст сообщения", "Заголовок сообщения", vbYesNoCancel Or vbDefaultButton2
End Sub

Private Sub Timer1_Timer()
  Form1.Caption = Format(Now(), "dd.MM.yyyy HH:mm:ss")
End Sub

Недостаток этого кода в неюникодном варианте MessageBox'а.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Выкинуть MsgBox, не "замораживая" при этом программу

Сообщение Хакер » 23.09.2011 (Пт) 17:13

Qwertiy, ты чувствуешь разницу между немодальным и неблокирующем MsgBox-ом?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Выкинуть MsgBox, не "замораживая" при этом программу

Сообщение Rody66 » 23.09.2011 (Пт) 17:17

Qwertiy, все гениально просто, большое спасибо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Выкинуть MsgBox, не "замораживая" при этом программу

Сообщение Хакер » 23.09.2011 (Пт) 17:19

А ты, Rody66, осознаёшь, что предложенный вариант не отвечает требованиям, описанным тобою в первом сообщении?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Выкинуть MsgBox, не "замораживая" при этом программу

Сообщение Rody66 » 23.09.2011 (Пт) 17:27

Хакер, в таком случае, я извиняюсь, что ввел тебя тем самым в заблуждение, но имел ввиду я как раз то, что предложил Qwertiy, глупо было не подумать об api, ведь там имеется альтернатива большинству дефолтных функций вб.
ps Кстати, с фтп мы так и не закончили, по поводу колбеков то, кроме тебя помочь некому.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.09.2011 (Пт) 17:32

Хакер писал(а):Qwertiy, ты чувствуешь разницу между немодальным и неблокирующем MsgBox-ом?

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

Я вообще редко слежу за нюансами формулировок, а общий смысл я понял правильно.

UPDATE:
Хакер писал(а):Обоснуй, зачем нужен немодальный MsgBox.
Rody66 писал(а):Собственно цель - создать независимый msgbox, который никак не будет влиять на работу программы.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Выкинуть MsgBox, не "замораживая" при этом программу

Сообщение Rody66 » 23.09.2011 (Пт) 17:47

Обоснуй, зачем нужен немодальный MsgBox.

Дак нечего обосновывать, просто так вышло, что таким образом делать удобнее, вот и все. Вопрос исчерпан, всем спасибо.
UP:
Собственно цель - создать независимый msgbox, который никак не будет влиять на работу программы.

Все верно, вариант с апи почти никак на работу программы и не влияет, все нужные таймеры работают.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Выкинуть MsgBox, не "замораживая" при этом программу

Сообщение Хакер » 23.09.2011 (Пт) 18:26

Давайте так.
Что нужно.
а) Чтобы функция вернулся управление не тогда, когда юзер закроет бокс, а сразу же.
б) Чтобы окно бокса было не модально основному окну.
в) Просто чтобы таймеры работали.

Rody66 писал(а):ps Кстати, с фтп мы так и не закончили, по поводу колбеков то, кроме тебя помочь некому

Последний ответ в теме — за мной. Никаких вопросов от тебя больше не было.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Выкинуть MsgBox, не "замораживая" при этом программу

Сообщение Rody66 » 23.09.2011 (Пт) 18:40

Давайте так.
Что нужно.
а) Чтобы функция вернулся управление не тогда, когда юзер закроет бокс, а сразу же.
б) Чтобы окно бокса было не модально основному окну.
в) Просто чтобы таймеры работали.

Признаю ошибку в формулировке с моей стороны. В данном случае, мне был необходим вариант в. Теперь же появилась еще одна задача, которую желательно выполнить - это по всей видимости как раз вариант а. То есть, чтобы код не останавливался на мсгбоксе (как это происходит с апи в том числе), в общем то неплохой вариант, перед выводом месаги, запустить таймер с интервалом 1, который при завершении своих операций будет выключаться, но как то это не эстетично :) Создавать свой мсгбокс из формы тоже не хочется. Тут уже как раз твой немодальный мсг потребуется, по всей видимости.
Последний раз редактировалось Rody66 23.09.2011 (Пт) 19:25, всего редактировалось 3 раз(а).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Выкинуть MsgBox, не "замораживая" при этом программу

Сообщение Хакер » 23.09.2011 (Пт) 19:10

Для «в» нужен SetTimer.
«а» возможен, но бесполезен, потому что потребность в чём-то таком может быть вызвана только неправильной архитектурой.
«б» идеологически вреден и за его использование нужно расстреливать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Выкинуть MsgBox, не "замораживая" при этом программу

Сообщение Rody66 » 23.09.2011 (Пт) 19:31

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

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Выкинуть MsgBox, не "замораживая" при этом программу

Сообщение arthur2 » 23.09.2011 (Пт) 19:45

Qwertiy писал(а):Недостаток этого кода в неюникодном варианте MessageBox'а.
А что мешает в объявлении апишки вместо А написать W? (плюс некоторые несложные тонкости, чтобы избежать неявной конвертации)
Артур
 
   

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.09.2011 (Пт) 19:59

arthur2 писал(а):А что мешает в объявлении апишки вместо А написать W? (плюс некоторые несложные тонкости, чтобы избежать неявной конвертации)

Лично я эти тонкости не помню. В .NET достаточно поставить слово Unicode в Declare, а в VB6?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Выкинуть MsgBox, не "замораживая" при этом программу

Сообщение arthur2 » 23.09.2011 (Пт) 20:26

А здесь достаточно вместо А написать W. Строки нужно объявить byval as long и передавать не сами строки, а указатели на них - strptr(s) Ещё лучше - объявить нужную W-функцию в тлб, тогда не нужно будет ухищрений - можо будет передавать саму строку. Поищи статью тёмыча - там есть подробные объяснения про уникодные строки в апи.
Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 30

    TopList  
cron