Консультация № 199693
23.11.2020, 10:36
0.00 руб.
1 10 0
Здравствуйте! Прошу помощи в следующем вопросе:
Delphi
Посчитать сумму к оплате в StringGrid : стоимость путевки на одного человека * количество взрослых и детей (на ребенка с учетом скидки в 20%).
Нужно чтобы когда вводишь значения в стоимость путёвки, кол-во взрослых и детей сразу вычислялась сумма. Я так понимаю это надо делать через событие SetEditText.
Помогите пожалуйста, застрял на этом.
Прикрепленные файлы:
82dfc9cc822c0650a80af8ea954e221446ac1306.png

Обсуждение

давно
Старший Модератор
31795
6196
23.11.2020, 11:36
общий
Адресаты:
Код покажите.

Насколько я понял "стоимость путевки на одного взрослого человека" - это в сутки.
Я бы первое изменил в Form1.StringGrid1.Options опцию goEditing := true.
Тогда Вы будете работать с каждой ячейкой грида как с Edit, т.е. у Вас появится возможность вводить прямо в грид.

Ещё посмотрел бы на функцию TryStrToInt - проверяет возможность перевода строки в число. Т.к. пользователь может ввести что угодно, и программа будет вылетать если там не число, а так ему можно всегда сказать что он

Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403884
6
23.11.2020, 12:38
общий
23.11.2020, 12:51
"стоимость путевки на одного взрослого человека" - это значение просто задаётся пользователем, без привязки ко времени.
Я не особо понимаю как это сделать, поэтому написал "что-то"
[code lang=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.[/code]
давно
Посетитель
403884
6
23.11.2020, 12:55
общий
Там в SetEditText я для себя пытался хотя-бы что-то сделать в первой строке. Но нужно чтобы считались и последующие ячейки
давно
Старший Модератор
31795
6196
23.11.2020, 16:04
общий
Адресаты:
Сразу оговорюсь у меня не 10-ка, а D6
[code lang=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;[/code]
Получается что-то вроде. Куча begin end , большенство из них можно убрать. Верху форма сразу после форм креате, а внизу после изменения
Прикрепленные файлы:
e4f946e74f86d3ca2f7058764b9d875c.jpg
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403884
6
23.11.2020, 17:34
общий
23.11.2020, 17:44
Переделал под свою таблицу и условия, но почему теперь во всех ячейках могу вводить только один символ? Если удаляю этот код, то всё работает нормально. И как запретить в ячейках (там где стоимость путёвки и кол-во взрослых и детей) вводить любые символы кроме чисел?
[code lang=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;[/code]
давно
Старший Модератор
31795
6196
23.11.2020, 17:47
общий
Адресаты:
Цитата: Ericsson
но почему теперь во всех ячейках могу вводить только один символ?

Это из-за
[code lang=pascal]if Value<>''then [/code]
Уберите её


Цитата: Ericsson
И как запретить в ячейках (там где стоимость путёвки и кол-во взрослых и детей) вводить любые символы кроме чисел?


Обработчик такой
[code lang=pascal]procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
const Digit=['0', '1'..'9'];
begin
if (not (Key in Digit)) then Key:=#0;
end;[/code]
Условие нужно будет доработать, чтобы к примеру в колонках, к примеру ниже какого-то числа отключалось это условие
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403884
6
23.11.2020, 18:22
общий
Хотел бы ещё спросить, почему даже при кол-ве детей = 0, в "сумме оплаты" всё равно считает с -20%?
[code lang=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;[/code]
Прикрепленные файлы:
b0ab927ad4891275f1cfa401050b820f.png
давно
Старший Модератор
31795
6196
23.11.2020, 21:30
общий
Адресаты:
Цитата: Ericsson
почему даже при кол-ве детей = 0, в "сумме оплаты" всё равно считает с -20%

Вы так записали
[code lang=pascal]Table.Cells[8,ARow]:=FloatToStr ((a*c)+((b*c) - 0.2));[/code]
У меня считается
[code lang=pascal]Form1.StringGrid1.Cells[8,ARow]:=IntToStr(a*(b*c+d*e));[/code]
Кол-во дней*(кол-во взрослых*стоимость суток на человека+кол-во детей*сутки на ребенка)
практически е:=с*0,2 или е:=с*0,8, это как посмотреть
Если в TForm3.FormCreate или TForm3.OpenAsTClick или при любом изменении добавить refresh, т.е. подпрограмма, которая автоматически все поменяет, то будет Вам удача.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
24.11.2020, 16:00
общий
Адресаты:
Получилось?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403884
6
25.11.2020, 06:25
общий
Да, всё получилось, спасибо вам
Форма ответа