При выходе из функции, результат содержит последнее значение.
Continue Заставляет перейти к следующей итерации цикла
Goto Вызывает скачок к метке, независимо от вложения
Halt Заканчивает программу с дополнительным диалогом.
RunError Заканчивает программу с диалогом ошибки
При выходе из функции, результат содержит последнее значение.
Continue Заставляет перейти к следующей итерации цикла
Goto Вызывает скачок к метке, независимо от вложения
Halt Заканчивает программу с дополнительным диалогом.
RunError Заканчивает программу с диалогом ошибки
Добрый вечер, Мастера! Подскажите где в моем коде ошибка. Мне необходимо на возникновение ошибки при конвертировании корректно выйти из процедурs? чтобы можно бвыло исправить ошибку без аварийной остановки и системного диалога об ошибке.
procedure TForm1.MyProcedure();
begin
try
Edit2.Text := FloatToStr(Edit1.Text);
except
on EConvertError do
Exit;
Урок №1: Условия в Delphi — оператор «If Then» на примере программы «Решение квадратного уравнения»
end;
end;
procedure TForm1.Create(Sender : Object);
begin
Edit1.Text := «0.6»; // здесь я умышленно ставлю ошибку вместо запятой точку
MyProcedure();
end;
Извините допустил ошибку следует код читать так:
procedure TForm1.MyProcedure();
begin
try
Edit2.Text := FloatToStr(StrToFloat(Edit1.Text));
except
on EConvertError do
Exit;
end;
end;
procedure TForm1.Create(Sender : Object);
begin
Edit1.Text := «0.6»; // здесь я умышленно ставлю ошибку вместо запятой точку
MyProcedure();
end;
procedure TForm1.MyProcedure();
begin
try
Edit2.Text := FloatToStr(Edit1.Text);
except
on E:Exception do
LogWrite(«Эк, кого-то закосячило. Обшибка: » + E.ClassName + «: » + E.Message);
end;
end;
нет, но смысл же не втом чтобы записать просто число, а в том чтобы можно было исправитьзапись в редактируемом поле если вместо запятой поставлена точка и при этом не выскакивала аварийная системная ошибка о неверном конвертировании. Спасибо
А вот как вариант?
1. Выставить DecimalSeparator как надо.
2. На Экцепте возвратить фокус в Едит (с сообщением. )
По умолчанию дельфийский отладчик сообщает о любом исключении, даже если оно потом обрабатывается в try/except, и вы, скорее всего, сообщение отладчика ошибочно называете системным. Отключите опцию Stop on Delphi Exception в окне ToolsDebugger options на странице Language exceptions. или просто запустите программу не из-под дельфей
> [0] Dr. Andrew (20.09.07 18:45)
procedure TForm1.MyProcedure();
begin
try
Edit2.Text := FloatToStr(StrToFloat(Edit1.Text));
except
raise; //Возбуждаем ошибку в вызывающей процедуре
end;
end;
procedure TForm1.Create(Sender : Object);
begin
Edit1.Text := «0.6»; // здесь я умышленно ставлю ошибку вместо запятой точку
Программирование в Delphi Урок 8. Компоненты Главное меню и диалоговые окна
try
MyProcedure();
except
ShowMessage(«Ошибка ввода значения в эдит1»); //Обрабатываем ее(ошибку)
Edit1.SetFocus;
end;
end;
> Dr. Andrew (20.09.07 19:16) [3]
>
> нет, но смысл же не втом чтобы записать просто число, а
> в том чтобы можно было исправитьзапись в редактируемом поле
> если вместо запятой поставлена точка и при этом не выскакивала
> аварийная системная ошибка о неверном конвертировании. Спасибо
>
А обработка OnKeyDown в «редактируемом поле » не помогает?
> procedure TForm1.Create(Sender : Object);
> begin
> Edit1.Text := «0.6»; // здесь я умышленно ставлю ошибку вместо запятой точку
> try
> MyProcedure();
> except
> ShowMessage(«Ошибка ввода значения в эдит1»); //Обрабатываем ее(ошибку)
> Edit1.SetFocus;
> end;
> end;
А я что-то и не обратил внимания, что код на создании формы. Хоть эта и ошибка в данном случае,
но я другое хотел показать. Впрочем это было конкретно ответ на вопрос в сабже,
а решений конкретной проблемы из примера к вопросу, тоже предложили несколько вариантов.
Источник: computermaker.info
Закрытие формы нажатием Escape в Delphi
Для удобства работы оператора многооконной программы иногда полезно сделать функционал закрытия текущей формы по нажатию клавиши Escape. Стандартный выход нажатием мышкой на кнопке выхода окна (крестик в верхнем правом углу) иногда действительно может быть менее удобным, чем одна клавиша на клавиатуре. Это может быть, например, при заполнении последовательно нескольких форм с переходами на второстепенные формы для выбора каких-то дополнительных значений или настроек.
Реализовать эту функцию не сложно. Создадим новую программу с пустой формой. Далее добавим для события OnKeyPress формы программный код, выполняющий закрытие формы (метод Close). Причем, перед ним должно быть условие, проверяющее, что была нажата именно клавиша Escape. Без такого условия программа будет закрываться при нажатии на любую клавишу. Вот пример готового кода:
procedure TMyForm.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #27 then Close; end;
Здесь, Key – это переменная, содержащая код нажатой клавиши; #27 код символа Esc; Close – команда закрытия формы.
Если сейчас запустить программу и нажать Esc, программа, как и планировалось, закроется. Однако, еще не все. Если сейчас добавить на форму любой компонент, то фокус программы будет передан ему. Это значит, что пока на форме нет ничего, то запуская программу, события клавиатуры и мыши срабатывают именно для формы и наша программа корректно работает. Но, если активным будет какой-либо другой компонент (фокус), то по нажатию кнопки на клавиатуре будет срабатывать событие OnKeyPress этого компонента, а не формы.
Установив сейчас компонент Edit на форму и запустив программу, можно убедиться, что нажатие на Esc не дает никакого результата. Ведь для события OnKeyPress нашего Edit не было ничего указано.
Можно конечно, теперь для каждого компонента назначить обработку этого события с командой выхода. Но такое решение не очень-то удобно, т.к. такое оно слишком громоздко, а главное – ведь другие компоненты могут иметь собственные процедуры на это событие.
Следовательно, нужно сделать так, чтобы форма реагировала на событие OnKeyPress, не мешая этому же событию срабатывать в других компонентах. Для этого нужно настроить свойство формы KeyPreview. Это логическое свойство как раз отвечает за порядок обработки событий клавиатуры. По умолчанию оно равно False (Ложь). Это значит, что событие обрабатывается текущим активным компонентом.
Присваивая этому свойству значение True (Истина), мы указываем, что в начале события клавиатуры будут выполняться обработчиками событий формы, а затем активным компонентом.
Т.к. в инспекторе объектов этого свойства формы нет, можно настроить его программно, на событие создания формы OnCreate. Добавим в программу такой код:
procedure TMyForm.FormCreate(Sender: TObject); begin MyForm.KeyPreview := True; end;
Теперь, при запуске программы (если быть точным, то при создании формы), свойству формы KeyPreview будет присвоено значение True.
После такой доработки, программа будет корректно закрываться по нажатию на Escape при любых имеющихся компонентах в окне. Причем, даже тогда, когда какие-то из них будут содержать свои процедуры на событие OnKeyPress, они так же будут правильно выполняться.
Источник: space-base.ru
Как сделать выход из программы в делфи
Здравствуйте, помогите пожалуйста.
Надо сделать так, чтобы выход из программы был только с кнопки (чтобы на крестик в правом верхнем углу не хакрывалось).
Из лабы: «Нужно запретить выход из программы стандартными способами, перехватив событие формы OnCloseQuery разрешив закрытие программы лишь в случае нажатия мышкой на клавишу «Выход». «
Для кнопки я написала так:
procedure TForm1.Button1Click(Sender: TObject); begin Close; end;
Работало, до тех пор, пока я не написала для крестика. Пробовала разные варианты. 2 из них:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin action:=caNone; end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=false; end;
В обоих случаях форма не закрывалась ни на крестик ни на кнопку, вообще никак.
Последний раз редактировалось Решетова Алена; 06.03.2013 в 08:55 .
Регистрация: 16.05.2012
Сообщений: 3,211
Добавьте в прогу логическую переменную, которая определит, что закрытие формы происходит с кнопки.
public IsButton: boolean; . . procedure TForm1.OnCreate(Sender: TObject); begin IsButton:=false; end; procedure TForm1.Button1Click(Sender: TObject); begin IsButton:=true; Close; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if not IsButton then action:=caNone; end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin If not IsButton then CanClose:=false; end;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы.
Источник: www.programmersforum.ru