Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2020, 04:58   #1
Sergio7
Новичок
Джуниор
 
Регистрация: 28.04.2020
Сообщений: 7
По умолчанию Нужно добавить окно выхода из программы с кнопками "Да" и "Нет". По кнопке "Нет" окно не закрывается. В чем проблема?

С помощью mrYes кнопка да работает, но не пойму как сделать, чтобы кнопка Нет работала с помощью mrNo
Lazarus

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
Math, Unit2, LMessages;

type

{ TForm1 }

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
procedure FormResize(Sender: TObject);
private

public

end;

var
Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
per0,per: real; //Проценты
kred, srok: integer; //Сумма кредита и срок
An, perep: real; //Ежемесячный платеж и переплата
begin
try
kred:=StrToInt(Edit1.Text);
per0:=StrToFloat(Edit2.Text);
srok:=StrToInt(Edit3.Text);
per:=per0/(100*12); //ставка по займу в месяц
An:=kred*per*power((1+per), srok)/(power((1+per), srok) - 1);
perep:=srok*An-kred;
Label5.Caption:='Ежемесячный платеж = ' + FloatToStrF(An,ffFixed, 4,2)
+ #13 + 'Переплата = ' + FloatToStrF(perep,ffFixed, 4,2);
except
on Err:EConvertError do
begin
Label5.Caption:='Error: '+ Err.message
end;
on Err:EInOutError do begin
Label5.Caption:='Error: '+ Err.message
end;
on Err:EZeroDivide do
begin
Label5.Caption:='Error: '+ Err.message
end;
{on Err:EMatchError do begin
Label5.Caption:='Error: '+ Err.message
end;}
end
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=form2.ShowModal = mrYes;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
Button1.Left:=Form1.Width-145;
Button1.top:=Form1.height-175;
Button2.Left:=Form1.Width-145;
Button2.top:=Form1.height-100;
end;


end.

Последний раз редактировалось Sergio7; 28.04.2020 в 06:17.
Sergio7 вне форума Ответить с цитированием
Старый 28.04.2020, 06:19   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Код:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=form2.ShowModal = mrYes;
end;
нажата кнопка нет ==> showmodal =mrNo; ==>МогуЗакрыть:=ложь; ==>....
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 28.04.2020, 06:43   #3
Sergio7
Новичок
Джуниор
 
Регистрация: 28.04.2020
Сообщений: 7
По умолчанию

evg_m,
Не совсем понял как именно я должен в этом месте написать, не судите строго, я учусь
Просто пр нажатии на НЕТ ничего не происходит, а по идее должно закрыться окно с самим вопросом о закрытии программы


procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=form2.ShowModal = mrYes;
end;
//здесь написать

procedure TForm1.FormResize(Sender: TObject);
begin
Button1.Left:=Form1.Width-145;
Button1.top:=Form1.height-175;
Button2.Left:=Form1.Width-145;
Button2.top:=Form1.height-100;
end;


end.

Последний раз редактировалось Sergio7; 28.04.2020 в 06:50.
Sergio7 вне форума Ответить с цитированием
Старый 28.04.2020, 06:57   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

вы написали (ваш код)
можно закрывать (CanClose =true) только если нажата кнопка ДА(Showmodal=mryes) и нельзя (canclose =false) закрывать во всех прочих случаях.

если надо закрывать всегда (CanClose:=true; )
если там есть и другие кнопки кроме ДА/НЕТ
Код:
r:=form2.ShowModal; 
CanClose:=( r=mryes ) or ( r=mrno );
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 28.04.2020, 08:19   #5
Sergio7
Новичок
Джуниор
 
Регистрация: 28.04.2020
Сообщений: 7
По умолчанию

Извините за несообразительность, но что я делаю не так?

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=form2.ShowModal=mrYes;
CanClose:=( ShowModal=mrYes ) or ( ShowModal=mrNo );
end;
Sergio7 вне форума Ответить с цитированием
Старый 28.04.2020, 08:21   #6
Sergio7
Новичок
Джуниор
 
Регистрация: 28.04.2020
Сообщений: 7
По умолчанию

evg_m,
Извините за несообразительность, но что я делаю не так?

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=form2.ShowModal=mrYes;
CanClose:=( ShowModal=mrYes ) or ( ShowModal=mrNo );
end;
Sergio7 вне форума Ответить с цитированием
Старый 28.04.2020, 08:27   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

у вас ДВА последовательных показа формы и каждый из показов сравнивается с ОДНИМ из вариантов.
1. для сравнения с mrYes;( ShowModal=mryes)
2. для сравнения с mrno (Showmodal=mrno)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 28.04.2020, 09:11   #8
Sergio7
Новичок
Джуниор
 
Регистрация: 28.04.2020
Сообщений: 7
По умолчанию

evg_m,
То есть мы должны показать формы как то так? Но тогда как соотнести mrNo именно с кнопкой НЕТ

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=form2.ShowModal = mrYes;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=form2.ShowModal = mrNo;
end;
Sergio7 вне форума Ответить с цитированием
Старый 28.04.2020, 09:21   #9
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Может легче на кнопку закрытия формы повесить MessageBox ?
https://stackoverflow.com/questions/...r-messageboxes



Цитата:
В момент закрытия Формы часто в программе необходимо выполнить определённые операции. Делается это в обработчике события OnClose Формы. А теперь рассмотрим блокировку закрытия Формы. Если вдруг понадобится заставить пользователя выполнить определённые действия перед закрытием Формы (это касается как дополнительных форм, так и основной Формы программы), нужно воспользоваться обработчиком события OnCloseQuery. В этом обработчике определена переменная логического типа CanClose. Форма будет закрыта только в том случае, когда
Код:
CanClose:=True;
Например, если создать такой обработчик OnCloseQuery основной Формы программы:
Код:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:=False;
end;
то пользователь просто не сможет закрыть программу иначе как через Диспетчер задач Windows!
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 28.04.2020, 10:21   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

начнем сначала.
Где расположены эти кнопки(ДА/НЕТ) ?на какой форме(Form1 /Form2) ?
Что хотим сделать при нажатии НЕТ и и при нажатии ДА ?
своими словами (без кода).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Delphi] Игра Пятнашки. Помогите пожалуйста добавить окно "Вы выиграли", когда комбинация будет собрана правильно, и добавить кнопку "Новая игра" Аня20 Паскаль, Turbo Pascal, PascalABC.NET 1 02.06.2017 08:12
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Для заданной строки определить все входящие в неё символ. Например: строка "abccbbabbac" состоит из символов "a", "b" и "c" Sandakan01 Помощь студентам 1 24.02.2016 03:20