Создать приложение с использованием следующих базовых компонентов:
Рабочее приложение
Проектируемое
приложение
Задаем
Обработчики событий:
procedure TForm1.CheckBox1Click(Sender: TObject); begin if CheckBox1.Checked then //Если покупаем, тогда begin RadioGroup1.Enabled := true; //активен выбор end else RadioGroup1.Enabled := false; //иначе никакого выбора end;
procedure TForm1.CheckBox2Click(Sender: TObject); begin if CheckBox2.Checked then begin RadioGroup2.Enabled := true; end else RadioGroup2.Enabled := false; end;
procedure TForm1.CheckBox3Click(Sender: TObject); begin if CheckBox3.Checked then begin RadioGroup3.Enabled := true; end else RadioGroup3.Enabled := false; end;
procedure TForm1.Button1Click(Sender: TObject); var Perv, Vtor, Tret, Itog: Real; begin Perv:=0; Vtor:=0; Tret:=0; if CheckBox1.Checked then begin case RadioGroup1.ItemIndex of 0: Perv := 3.55; 1: Perv := 3.25; 2: Perv := 5; end; end; if CheckBox2.Checked then begin case RadioGroup2.ItemIndex of 0: Vtor := 15; 1: Vtor := 5; 2: Vtor := 3.5; end; end; if CheckBox3.Checked then begin case RadioGroup3.ItemIndex of 0: Tret := 8; 1: Tret := 3; 2: Tret := 5; end; end; Itog:=Perv+Vtor+Tret; if Itog =0 then Label2.Caption:='Вы ничего не заказали...' Else Label2.Caption:='Вы заказали на '+FloatToStr(Itog)+' руб.'; end; end.
как реализовать в меню, допустим 2 борща?в нинешном варианте рассчитано так, что на каждого посетителя надо заного считать, если второй или третий захочет тоже блюдо,что и первый.
Я кажется понял Вас. Если Вы хотите добавить функцию выбора нескольких порций одного блюда, то Вам следует добавить edit'ы рядом с каждым блюдом. Это для того, чтобы клиент указывал количество блюда. Для реализации достаточно умножить цену блюда на рядом стоящий edit. Например: case Radiogroup1.itemindex of 0: perv:=3.55*strtoint(edit1.text); ... end;
спасибо большое за подсказку. очень интересный сайт с примерамы разнообразних программ, надеюсь не забросите это дело и обязательно ресурс станет популярным. и еще если можно вопрос: можно сделать так, чтобы при нажатий edit, появлялось что то наподобые выртуальной клавиатуры, но только с цифрами и с средствами делфи, без использования сторонных програм.
сайт только начинает развиваться, так что все впереди еще!
Цитата
с средствами делфи
с какими именно средствами? А вообще чтобы сделать на подобии виртуальной клавиатуры, то Вам следует немного потрудиться. Могу привести как вариант, создать панель со всеми необходимыми кнопками и при запуске программы сделать её невидимой (panel1.visible:=false;). А при нажатии на edit сделать эту панель снова видимой. (прописать в событии OnChange код: panel1.visible:=true;)
с панелю хорошее решение. еще одно полезное свойство можно ввести в программу, которое будет полезно тем кто меню разрабатывает. к примеру клиент хочет заказать из 1-их блюд, Борщ и Суп с клецками. в RadioGroup есть возможность множественного выбора, а не одной позиций?или такое только в checklistbox возможно?но у checklistbox вроде нет такой функций чтобы расстояние между колонками регулировать и все наименования блюд будут очень близко к друг другу.
В таком случае можно взять checkbox'ы и поместить их в groupbox, а потом увеличить высоту каждого checkbox'a. Надюсь, Вы понимаете, тогда Вам придется переписать код программы.
возможно к checkbox-ам применить "case of" или наподобие код, чтобы узнать какой checkbox отмечен галочкой? а не узнавать оператором "if checbox1 and chekcbox2" и так каждый отдельный checkbox.
Нужна ваша помощь опять. Спрашивал на форуме программистов, но никто не смог помочь. Может вы будете знать,и если не затруднит подскажете... делаю меню ресторана. на форме имеется 3 штуки 'TPanel' (это как бы столики) под номерами 1,2,3 и stringgrid, в который при нажатий кнопки отображается результат подсчета, наименования, дата и время... Задача в том, чтобы хранить содержимое stringgrid в файле или памяти . То есть нажимая на одну из трех TPanel, допустим в первый номер 1, содержимое stringgrid должно стать пустим если оно заполнено, после этого выведенный результат подсчета в stringgrid должен быть привязан к панели номер 1. Далее при нажатий панели номер 2, содержимое stringgrid опять должно стать пустим и новый результат подсчета должен привязатся к панели номер 2. После этого если нажать на панель 1, запомненное содержание должно отобразится уже не делая stringgrid пустим, при нажатий на панель 2, должно отобразится ее содержание и т.д. Как можно это реализовать так или по другому, чтобы были заказы по столикам? Это нужно для того чтобы при заказе с одного столика, может придти клиент на другой столик и надо будет принять его заказ, но при этом предыдущий столик захочет добавить что то к заказанному, и так держать столики в памяти до оплаты.
Довольно интересная задумка. Я лично решил бы эту проблему таким образом: 1. Добавил бы глобальную переменную ( пусть будет nstol: integer) 2. На каждый панель в собитие OnClick прописал бы след. код: nstol:=N; (где N любое число соответствующее номеру панели, т.е. стола) 3. В свойствах OnClick всех внутри лежащих компонентов каждой панели необходимо выбрать событие OnClick соответсвующей панели.
4. И последнее, процедуру Button1Click подкорректировал бы так: case nstol of 1: begin Операция_1 end; 2: begin Операция_2 end; ... N: begin Операция_N end; end; Где Операция_1 – расчет для стола 1, Операция_N – соответственно для стола N. Далее спокойно можно выводить результат в StringGrid'е. Попробуйте, если что не понятно спрашивайте. А насчет сохранения данных каждого стола я не понял, зачем это надо.
http://i46.fastpic.ru/big....59e.png Спасибо, но это не совсем то,что я хотел. Я хочу чтобы результат стола 1 сохранялся (пока не оплачено) после того как нажму на стол 2. Ведь первый столик может добавить заказ. это исходник, но он в Delphi XE3 http://rghost.net/45264458
В общем у нас версии Делфи не сошлись. Я думаю, что тебе придется данные сохранять в трех xls документах и при нажатии на панель эти данные загружались в стринггрид как ранее не рассчитанные заказы. Или же можно обойтись с ini-файлами, которые восстанавливали бы значения для каждого стола. В таком случае при нажатии на стол1 все данные в эдитах вернутся, и человек просто добавляет кол-во какого-то блюда.
Хорошая идея хранить показатели Edit, а не стринггрид. Толко возможно чтобы в один ini файл все вводить, а не использовать десятки ini файлов, если столов много.
Конечно можно. В таком случае придется сначала условие поставить. К примеру так: case nstol of 1: begin INI.WriteString('Stol_1','edit1',Edit1.text); ... end; 2: begin INI.WriteString('Stol_2','edit1',Edit1.text); ... end; ... N: begin INI.WriteString('Stol_N','edit1',Edit1.text); ... end; end; И то же самое для чтения. Тут принцип хоть и громоздкий, но понятен, надеюсь.
2. На каждый панель в собитие OnClick прописал бы след. код: nstol:=N; (где N любое число соответствующее номеру панели, т.е. стола)
Вот и дальше сравниваешь значение этой переменной и делаешь соответствующие операции. var INI.TInifile; begin INI:=TiniFile.Create(extractfilepath(paramstr(0))+'INI.ini'); case nstol of 1: begin INI.WriteString('Stol_1','edit1',Edit1.text); INI.WriteString('Stol_1','edit2',Edit2.text); ... end; 2: begin INI.WriteString('Stol_2','edit1',Edit1.text); INI.WriteString('Stol_2','edit2',Edit2.text); ... end; ... N: begin INI.WriteString('Stol_N','edit1',Edit1.text); ... end; end; end; Так понятнее? Ну а для чтение данных пишешь код аналогичным образом. var INI: TIniFile; begin INI:=TiniFile.Create(extractfilepath(paramstr(0))+'INI.ini'); case nstol of 1: begin edit1.text:=ReadString('Stol_1','edit1','0'); edit2.text:=ReadString('Stol_1','edit2','0'); ... end; 2: begin edit1.text:=ReadString('Stol_2','edit1','0'); edit2.text:=ReadString('Stol_2','edit2','0'); ... end; ... N: begin edit1.text:=ReadString('Stol_N','edit1','0'); ... end; end; end; Ну вот, примерно так. Дальше, думаю, сам сообразишь.
nstol указал как глобальную переменную и при клике панели присваивается номер стола. Соответственно после case nstol of. если nstol равен 1, то должна записаться первая строка 1: begin edit1.text:=ReadString('Stol_1','edit1','0'); edit2.text:=ReadString('Stol_1','edit2','0'); ... end; если nstol равен 2, то вторая строка 2: begin edit1.text:=ReadString('Stol_2','edit1','0'); edit2.text:=ReadString('Stol_2','edit2','0'); ... end; правильно понял? тогда не получается в одну строку поместии это 1: begin edit1.text:=ReadString('Stol_1','edit1','0'); edit2.text:=ReadString('Stol_1','edit2','0'); пишет ошибку. приходится делить на две строки,но тогда nstol равны 1, прочитает первую строку.