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

InputBox из формы

17.12.2012, 05:44. Показов 2255. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru