Лидеры рейтинга
Мастер-Эксперт
960
Мастер-Эксперт
548
Академик
354
Мастер-Эксперт
312
Профессионал
275
Профессор
73
Профессор
53
8.1.6
02.01.2021
JS: 2.2.2
CSS: 4.2.0
jQuery: 3.5.1
Создание программ на языках Pascal, Delphi и Lazarus.
Администратор раздела: Зенченко Константин Николаевич (Старший модератор)
|
Перейти к консультации №: |
|
Здравствуйте! Прошу помощи в следующем вопросе:
Delphi
Посчитать сумму к оплате в StringGrid : стоимость путевки на одного человека * количество взрослых и детей (на ребенка с учетом скидки в 20%).
Нужно чтобы когда вводишь значения в стоимость путёвки, кол-во взрослых и детей сразу вычислялась сумма. Я так понимаю это надо делать через событие SetEditText.
Помогите пожалуйста, застрял на этом.
-----
Прикрепленное изображение (кликните по картинке для увеличения):
Состояние: Консультация закрыта
Oтветов пока не поступило.
Зенченко Константин Николаевич
Старший модератор ID: 31795
+1
|
Ericsson: Код покажите. ===== |
Посетитель ID: 403884
0
|
"стоимость путевки на одного взрослого человека" - это значение просто задаётся пользователем, без привязки ко времени. Код (Pascal) :: выделить код unit prog; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.ToolWin, Vcl.ActnMan, Vcl.ActnCtrls, Vcl.ActnMenus, Vcl.StdCtrls, Vcl.Grids; type TForm3 = class(TForm) MainMenu1: TMainMenu; N1: TMenuItem; Editing: TMenuItem; Help: TMenuItem; About: TMenuItem; OpenT: TMenuItem; OpenAsT: TMenuItem; SaveT: TMenuItem; SaveAsT: TMenuItem; out: TMenuItem; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Table: TStringGrid; EditOn: TMenuItem; EditOff: TMenuItem; procedure AboutClick(Sender: TObject); procedure outClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure OpenTClick(Sender: TObject); procedure EditOnClick(Sender: TObject); procedure EditOffClick(Sender: TObject); procedure HelpClick(Sender: TObject); procedure SaveTClick(Sender: TObject); procedure SaveAsTClick(Sender: TObject); procedure OpenAsTClick(Sender: TObject); procedure TableSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string); procedure TableSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); private { Private declarations } public { Public declarations } end; var Form3: TForm3; implementation {$R *.dfm} uses Help, ABOUT1; procedure TForm3.FormCreate(Sender: TObject); begin Table.ColWidths[0] := 40; Table.Cells[0, 0] := '№'; Table.Cells[1, 0] := 'номер тура'; Table.Cells[2, 0] := 'страна'; Table.Cells[3, 0] := 'количество дней'; Table.Cells[4, 0] := 'фамилия туриста'; Table.Cells[5, 0] := 'количество взрослых'; Table.Cells[6, 0] := 'количество детей'; Table.Cells[7, 0] := 'стоимость путевки на одного взрослого человека'; Table.Cells[8, 0] := 'сумма к оплате'; end; procedure TForm3.EditOnClick(Sender: TObject); begin self.Table.Options := self.Table.Options + [goEditing]; end; procedure TForm3.EditOffClick(Sender: TObject); begin self.Table.Options := self.Table.Options - [goEditing]; end; procedure TForm3.HelpClick(Sender: TObject); begin Form1.Show; end; procedure TForm3.AboutClick(Sender: TObject); begin AboutBox.Show; end; procedure TForm3.OpenAsTClick(Sender: TObject); var L: TStringList; i: integer; begin if not OpenDialog1.Execute then Exit; L := TStringList.Create; L.LoadFromFile(OpenDialog1.FileName); for i := 0 to L.Count - 1 do Table.Rows[i].CommaText := L.Strings[i]; L.Free; end; procedure TForm3.OpenTClick(Sender: TObject); var List: TStringList; i, j: Integer; begin Table.Visible:=True; List:=TStringList.Create; List.LoadFromFile('таблица.txt'); with Table do for i:=0 to RowCount-1 do for j:=0 to ColCount-1 do Cells[j, i]:=List[i*ColCount+j]; end; procedure TForm3.SaveAsTClick(Sender: TObject); var L: TStringList; i: integer; begin if not SaveDialog1.Execute then Exit; L := TStringList.Create; for i := 0 to Table.RowCount - 1 do L.Add(Table.Rows[i].CommaText); L.SaveToFile(SaveDialog1.FileName); L.Free; end; procedure TForm3.SaveTClick(Sender: TObject); var List: TStringList; i, j: Integer; begin List:=TStringList.Create; with Table do for i:=0 to RowCount-1 do for j:=0 to ColCount-1 do List.Add(Cells[j, i]); List.SaveToFile('таблица.txt'); end; procedure TForm3.TableSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin if (ARow=Table.RowCount-1) or (ACol=Table.ColCount-1) then CanSelect:=False; end; procedure TForm3.TableSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string); var b, n, c: integer; { b - значение строки редактирования} j: byte; { j - параметр цикла для текущего номера столбца} nRow, adult, child: real; begin with Table do if (ARow<>RowCount-1) and (ACol<>ColCount-1) then begin if value <> ' ' then {если введенное значение не пусто} begin val(Value, b, c); {переводим в число} if (c<>0) then Cells[ACol, ARow]:=' '; end; nRow:=0; {обнуляет сумму оценок в строке} for j:=5 to 7 do if Cells[j,ARow]<>'' then {если ячейка таблицы с координатами j, ARow не пустая} begin adult:=StrToFloat (Table.Cells [5,1])+StrToFloat (Table.Cells [7,1]); child:=StrToFloat (Table.Cells [6,1])+ StrToFloat (Table.Cells [7,1])*0.2; nRow:=nRow+adult+child; end; Table.Cells[8,ARow]:= nRow; end; end; procedure TForm3.outClick(Sender: TObject); begin close; end; end. Последнее редактирование 23.11.2020, 12:51 Ericsson (Посетитель) |
Посетитель ID: 403884
0
|
Там в SetEditText я для себя пытался хотя-бы что-то сделать в первой строке. Но нужно чтобы считались и последующие ячейки |
Зенченко Константин Николаевич
Старший модератор ID: 31795
+1
|
Ericsson: Сразу оговорюсь у меня не 10-ка, а D6 Код (Pascal) :: выделить код procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); var a,b,c,d,e,f:integer; begin if(ARow>0)and(ARow<Form1.StringGrid1.RowCount)and (ACol>0)and(ACol<Form1.StringGrid1.ColCount)then if Value<>''then begin Form1.StringGrid1.Cells[ACol,ARow]:=Value; if tryStrToInt(Form1.StringGrid1.Cells[3,ARow],a)then begin if tryStrToInt(Form1.StringGrid1.Cells[4,ARow],b)then begin if tryStrToInt(Form1.StringGrid1.Cells[5,ARow],c)then begin if tryStrToInt(Form1.StringGrid1.Cells[6,ARow],d)then begin if tryStrToInt(Form1.StringGrid1.Cells[7,ARow],e)then begin Form1.StringGrid1.Cells[8,ARow]:=IntToStr(a*(b*c+d*e)); end else ShowMessage('7 '+IntToStr(ARow)); end else ShowMessage('6 '+IntToStr(ARow)); end else ShowMessage('5 '+IntToStr(ARow)); end else ShowMessage('4 '+IntToStr(ARow)); end else ShowMessage('3 '+IntToStr(ARow)); end; end; Получается что-то вроде. Куча begin end , большенство из них можно убрать. Верху форма сразу после форм креате, а внизу после изменения ----- ===== |
Посетитель ID: 403884
0
|
Переделал под свою таблицу и условия, но почему теперь во всех ячейках могу вводить только один символ? Код (Pascal) :: выделить код procedure TForm3.TableSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string); var a,b,c :integer; begin with Table do if(ARow>0)and(ARow<Table.RowCount)and (ACol>0)and(ACol<Table.ColCount)then if value <> ' ' then Table.Cells[ACol,ARow]:=Value; if tryStrToInt(Table.Cells[5,ARow],a)then begin if tryStrToInt(Table.Cells[6,ARow],b)then begin if tryStrToInt(Table.Cells[7,ARow],c)then begin Table.Cells[8,ARow]:=FloatToStr((a*b)+((b*c)-0.2)); end; end; end; end; Последнее редактирование 23.11.2020, 17:44 Ericsson (Посетитель) |
Зенченко Константин Николаевич
Старший модератор ID: 31795
+1
|
Ericsson: Цитата: Ericsson но почему теперь во всех ячейках могу вводить только один символ? Это из-за Код (Pascal) :: выделить код if Value<>''then Уберите её Цитата: Ericsson И как запретить в ячейках (там где стоимость путёвки и кол-во взрослых и детей) вводить любые символы кроме чисел? Обработчик такой Код (Pascal) :: выделить код procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char); const Digit=['0', '1'..'9']; begin if (not (Key in Digit)) then Key:=#0; end; Условие нужно будет доработать, чтобы к примеру в колонках, к примеру ниже какого-то числа отключалось это условие ===== |
Посетитель ID: 403884
0
|
Код (Pascal) :: выделить код procedure TForm3.TableSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string); var a,b,c :integer; begin with Table do if(ARow>0)and(ARow<Table.RowCount)and (ACol>0)and(ACol<Table.ColCount)then if tryStrToInt(Table.Cells[5,ARow],a)then // кол-во взрослых begin if tryStrToInt(Table.Cells[6,ARow],b)then // кол-во детей begin if tryStrToInt(Table.Cells[7,ARow],c)then // стоимость begin Table.Cells[8,ARow]:=FloatToStr ((a*c)+((b*c) - 0.2)); end; end; end; end; ----- |
Зенченко Константин Николаевич
Старший модератор ID: 31795
0
|
Ericsson: Цитата: Ericsson почему даже при кол-ве детей = 0, в "сумме оплаты" всё равно считает с -20% Вы так записали Код (Pascal) :: выделить код Table.Cells[8,ARow]:=FloatToStr ((a*c)+((b*c) - 0.2)); У меня считается Код (Pascal) :: выделить код Form1.StringGrid1.Cells[8,ARow]:=IntToStr(a*(b*c+d*e)); Кол-во дней*(кол-во взрослых*стоимость суток на человека+кол-во детей*сутки на ребенка) практически е:=с*0,2 или е:=с*0,8, это как посмотреть Если в TForm3.FormCreate или TForm3.OpenAsTClick или при любом изменении добавить refresh, т.е. подпрограмма, которая автоматически все поменяет, то будет Вам удача. ===== |
Зенченко Константин Николаевич
Старший модератор ID: 31795
+1
|
Ericsson: Получилось? ===== |
Посетитель ID: 403884
0
|
Да, всё получилось, спасибо вам |
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.