Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
5 / 5 / 2
Регистрация: 28.02.2010
Сообщений: 127

InputBox из формы

17.12.2012, 05:44. Показов 2194. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно сделать некий продвинутый InputBox (с разными комбобоксами и т.д.), он должен возвращать строку (AnsiString).
Я решил сделать так: сделать отдельную форму, на ней поля для ввода и кнопка OK, в cpp этой формы будет функции, которые будет вызывать главная форма и в начале каждой функции ShowModal.
Должно получиться так: в главной форме вызывается функция из второй формы, появляется модальное окно, пользователь выбирает опции, жмет ОК, затем форма закрывается и возвращает строку, я сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall TForm_Input_Boxes::Button_OKClick(TObject *Sender)
{
    Close();
}
AnsiString __fastcall TForm_Input_Boxes::IB_Signal(AnsiString str)
{
    ShowModal();
 
    ComboBox1->Clear();
    ComboBox1->Items->Add("нет");
    ComboBox1->Items->Add("предупредительный");
    ComboBox1->Items->Add("критический");
 
    ComboBox1->ItemIndex = ComboBox1->Items->IndexOf(&str[str.Pos(" ")+1]);
 
return ComboBox1-Text;
}
Собственно, из главной функции и вызывается IB_Signal, но есть 2 вопроса:
1. Как сделать, чтобы функция возвращала содержимое ComboBox1-Text именно после того, как нажата Button_OKClick?
2. При вызове функции форма не успевает прорисоваться, тоесть, ComboBox1->Items->Add как будто не выполняются, но при следующем вызове в комбо боксе видно все добавленные данные, я правда не понял, оно не добавляется именно при первом открытии формы, или всегда... Но вопрос в том, как это исправить?
Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2012, 05:44
Ответы с готовыми решениями:

Замена формы на InputBox
Как не вызывая формы ввести InputBox? Вне формы выдается ошибка, а внутри формы сначала появляется форма, а затем окно InputBox или что...

InputBox Присвоение введенного имени в название формы
Доброго времени суток. Кароче мне надо чтобы сначала запуска програмы появлялось окошко где спрашиваеться 'желаете зарегаться'...

Вывести информацию из первой формы из InputBox во вторую форму в Label1
Нужно вывести информацию из первой формы из InputBox (оператор YourName) во вторую форму в Label1. На кнопке, которая находится на первой...

8
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
17.12.2012, 06:26
TForm_Input_Boxes->OnCloseQuery()
C++
1
2
3
if (Button_OKClick()) {
  IB_Signal("AnsiString str");
}
вариантов море:
Выполнить код из обработчика нажатия Button1 при нажатии Button2

Или просто в обработчике TForm_Input_Boxes->OnCloseQuery()
C++
1
2
3
...
IB_Signal("AnsiString str");
...
0
5 / 5 / 2
Регистрация: 28.02.2010
Сообщений: 127
17.12.2012, 16:53  [ТС]
Но ведь в этих случаях IB_Signal не будет возвращать строку туда, где ее вызвали (вызывают из главной формы).
Я еще попробовал сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
bool    ok_click;
 
AnsiString __fastcall TForm_Input_Boxes::IB_Signal(AnsiString str)
{
    ShowModal();
    ok_click = false;
 
    ComboBox1->Clear();
    ComboBox1->Items->Add("нет");
    ComboBox1->Items->Add("предупредительный");
    ComboBox1->Items->Add("критический");
 
    ComboBox1->ItemIndex = ComboBox1->Items->IndexOf(&str[str.Pos(" ")+1]);
 
    [B]while(!ok_click) Application->HandleMessage();[/B]
 
    return ComboBox1->Text;
}
 
void __fastcall TForm_Input_Boxes::Button_OKClick(TObject *Sender)
{
    ok_click = true;
    Close();
}
Тоесть, IB_Signal не завершиться пока не выполнится Button_OKClick, но почему то while(!ok_click) не работает и прога постоянно висит на этом месте.
Еще придумал такой вариант:
IB_Signal сама по себе ничего не возвращает, а просто записывает переменную в отдельную строку, в функции та строка, которая возвращается будет записываться в отдельную переменную, а в главной форме сначало будет вызов IB_Signal, а потом считывание значения с той переменной. Но это уже крайний способ
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.12.2012, 17:01
Цитата Сообщение от Br.Misha Посмотреть сообщение
IB_Signal сама по себе ничего не возвращает, а просто записывает переменную в отдельную строку, в функции та строка, которая возвращается будет записываться в отдельную переменную, а в главной форме сначало будет вызов IB_Signal, а потом считывание значения с той переменной. Но это уже крайний способ
Чего это он крайний? Хороший способ, стандартный, можно сказать, для диалогов.
0
5 / 5 / 2
Регистрация: 28.02.2010
Сообщений: 127
17.12.2012, 17:16  [ТС]
ок, тогда так и сделаю, а как быть со второй проблемой(не успевает прорисоваться)?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.12.2012, 17:20
Просто вызов ShowModal() поставь в конце после заполнения ComboBox1...
0
5 / 5 / 2
Регистрация: 28.02.2010
Сообщений: 127
17.12.2012, 17:28  [ТС]
ЫЫЫЫыыы, пасибки! помогло))).
Только сейчас кое что не понятно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
AnsiString __fastcall TForm_Input_Boxes::IB_Signal(AnsiString str)
{
    ComboBox1->Clear();
    ComboBox1->Items->Add("нет");
    ComboBox1->Items->Add("предупредительный");
    ComboBox1->Items->Add("критический");
 
    ComboBox1->ItemIndex = ComboBox1->Items->IndexOf(&str[str.Pos(" ")+1]);
 
    ShowModal();
 
    return ComboBox1->Text;
}
Теперь функция возвращает после нажатия ОК или закрытия формы именно то, что я выбрал в ComboBox1. С одной стороны хорошо, что первая проблема отпала сама по себе, но почему так?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.12.2012, 17:39
ShowModal() останавливает исполнение кода, где бы она ни была вызвана. В данном случае идет заполнение полей на форме диалога, потом отображение самого диалога - при этом исполнение кода функции IB_Signal() останавливается на строчке с вызовом ShowModal() - затем пользователь что-то делает в диалоге и закрывает его. Как только форма диалога закрыта, метод ShowModal() возвращает исполнение кода в точку, где он был вызван - в метод IB_Signal(), который отрабатывает до конца и возвращает результат.

Тут надо быть осторожнее - если при закрытии формы диалога у тебя будет происходить ее разрушение, то последняя строчка return ComboBox1->Text; вероятнее всего приведет к access violation, так как экземпляр формы уже будет на тот момент разрушен.
0
5 / 5 / 2
Регистрация: 28.02.2010
Сообщений: 127
17.12.2012, 20:11  [ТС]
понятно. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.12.2012, 20:11
Помогаю со студенческими работами здесь

InputBox
В среде Delphi , разработать программу осуществляющая ввод вещественных значений x,y и вычисляющую значение функции z по формуле : z = ...

InputBox
Здравствуйте) Подскажите, пожалуйста, как сделать так, чтобы в InputBox была только кнопка OK (без Cancel).

InputBox в C#
Здравствуйте. Собственно сабж. Требуется от пользователя ввести в новом окне сообщение и нажать ok (cancel). Вопросов 2: 1) Есть ли...

InputBox
Как сделать, чтобы перед появлением формы появлялся InputBox, а только потом форма? И если поле InputBox не было заполнено, появлялась...

InputBox
Здравствуйте народ! Нужна ваша помощь! Вот исходник: unit Unit1; interface uses Windows, Messages, SysUtils,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru