Здравствуйте, уважаемые!
Помогите, пожалуйста, разобраться в следующих вопросах.
Первый.
В дельфи, на форме куча компонент типа TEdit, TComboBox И TLabel они представляют различные поля одной записи,
кроме этого на форме есть компонент TTreeView, который тоже отображает запись.
После изменения значения одного из TEdit.Text нужно перерисовать все компоненты кроме TreeView —
его перерисовка нужна только когда изменится структура записи, а перерисовываясь каждый раз он неприятно моргает.
Пробовал в обработчике TEdit.OnChange задавать TRect включающий только нужные компоненты
и писать
InvalidateRect(Form1.Handle,MyRect,true);
Form1.Update;
все равно перерисовывается вся форма.
Как запретить перерисовку компонента TreeView если она мне не нужна?
И второй вопрос.
В дельфи, в компоненте TEdit, требуется вводить целые числа.
Пишу:
procedure TForm1.Edit1Change(Sender: TObject);
begin
StrToInt(Edit1.Text);
end;
procedure TForm1.MyExcept(Sender: TObject; E: Exception);
begin
if E is EConvertError then
begin
Edit1.Text:='';
MessageDlg('Неверный символ', mtInformation, [mbOk], 0)
end
else raise E;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException:=MyExcept;
end;
при вводе в Edit1 буквы приложение прерывает выполнение и сообщает об ошибке,
только после этого вызывается обработчик MyExcept.
Как сделать, чтобы при возникновении исключительной ситуации не прерывалось приложение,
а выпольнялись только нужные мне действия?
это то что надо или как?
[sql]
for i := 0 to ComponentCount-1 do
if (Components[i] is TControl) and
(Components[i] <> MyTreeView)
then TControl(Components[i]).Update; // ну или что ты там с контролом хотел сделать?
[sql]
AD>И второй вопрос. AD>Как сделать, чтобы при возникновении исключительной ситуации не прерывалось приложение,
tools -> Debugger options.. -> Language Exceptions
сними крыжик с "Stop on Delphi Exceptions".
Здравствуйте ArcaD, Вы писали:
AD>Как сделать, чтобы при возникновении исключительной ситуации не прерывалось приложение, AD>а выпольнялись только нужные мне действия?
Debuger Delphi всегда выводит свое сообщение об исключительных ситуациях, когда же запускаешь уже скомпеленный файл то сразу вызывается ваш обработчик сообщение.
Т.е. попробуяти запусть конечный exe-файл и все будет нормально!
G>Здесь я бы посоветовал использовать TMaskEdit, где можно задать маску для ввода, и не иметь лишнего гимора с обработкой исключений по конвертации.
Для программиста конечно TMaskEdit ну очень удобен.. вот только не пробовали ли вы им пользоваться?
поле ввода: -3___
пользователь ткнул мышкой в контрол и ввел: -3__45
(уверен что дописал в конец)
положим программист учтет эту ситуацию и удалит лишние пробелы, но юзер то хотел ввести еще символ, а "маска" не позволила..
Здравствуйте ArcaD, Вы писали:
AD>В дельфи, в компоненте TEdit, требуется вводить целые числа. AD>при вводе в Edit1 буквы приложение прерывает выполнение и сообщает об ошибке, AD>только после этого вызывается обработчик MyExcept. AD>Как сделать, чтобы при возникновении исключительной ситуации не прерывалось приложение, AD>а выпольнялись только нужные мне действия?
Я знаю точно, что здесь тебе не надо использовать обработку ошибок. Воспользуйся простым способом:
const
Nums: set of = ['0','1','2','3','4','5','6','7','8','9'];
Далее в программе в TEdit.OnKeyPress напиши обработку:
if Key in Nums then begin
< обработка ошибки, например:>
ShowMessage('Error char!!!');
Key:=#0 //////////////// --------- Это важно, иначе все в пустую. Выдаст сообщение и напишет символ, а так нет end
else
...
TMaskEdit не очень хорош, т.к. строка заполнена пробелами сначала и вызовет ошибку конвертации, если заполнена не вся.