Два вопроса по Delphi
От: ArcaD  
Дата: 07.06.02 06:45
Оценка:
Здравствуйте, уважаемые!
Помогите, пожалуйста, разобраться в следующих вопросах.
Первый.
В дельфи, на форме куча компонент типа 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.

Как сделать, чтобы при возникновении исключительной ситуации не прерывалось приложение,
а выпольнялись только нужные мне действия?
Re: Два вопроса по Delphi
От: vav Россия  
Дата: 07.06.02 07:54
Оценка:
это то что надо или как?
[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".
Re[2]: Два вопроса по Delphi
От: ArcaD  
Дата: 07.06.02 08:19
Оценка:
Здравствуйте vav
Спасибо за Ваш ответ. Как раз то, что нужно.
Re: Два вопроса по Delphi
От: BOBAH Россия  
Дата: 07.06.02 08:31
Оценка:
Здравствуйте ArcaD, Вы писали:

AD>Как сделать, чтобы при возникновении исключительной ситуации не прерывалось приложение,

AD>а выпольнялись только нужные мне действия?

Debuger Delphi всегда выводит свое сообщение об исключительных ситуациях, когда же запускаешь уже скомпеленный файл то сразу вызывается ваш обработчик сообщение.
Т.е. попробуяти запусть конечный exe-файл и все будет нормально!
Re: Два вопроса по Delphi
От: Gonza Россия  
Дата: 07.06.02 08:58
Оценка:
Здравствуйте ArcaD, Вы писали:

AD>И второй вопрос.

AD>В дельфи, в компоненте TEdit, требуется вводить целые числа.

Здесь я бы посоветовал использовать TMaskEdit, где можно задать маску для ввода, и не иметь лишнего гимора с обработкой исключений по конвертации.
best wishes Andrew
Re[2]: Два вопроса по Delphi
От: vav Россия  
Дата: 07.06.02 09:11
Оценка:
G>Здесь я бы посоветовал использовать TMaskEdit, где можно задать маску для ввода, и не иметь лишнего гимора с обработкой исключений по конвертации.

Для программиста конечно TMaskEdit ну очень удобен.. вот только не пробовали ли вы им пользоваться?

поле ввода: -3___

пользователь ткнул мышкой в контрол и ввел: -3__45
(уверен что дописал в конец)
положим программист учтет эту ситуацию и удалит лишние пробелы, но юзер то хотел ввести еще символ, а "маска" не позволила..
Re: Два вопроса по Delphi
От: &reY Украина http://www.livejournal.com/~1000turov/
Дата: 07.06.02 14:05
Оценка:
Здравствуйте ArcaD, Вы писали:

AD>В дельфи, в компоненте TEdit, требуется вводить целые числа.


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (key in ['0'..'9', #8]) then Key := #0;
end;
Re: Два вопроса по Delphi
От: Гойда Александр Александрович Россия  
Дата: 07.06.02 15:06
Оценка:
Здравствуйте 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 не очень хорош, т.к. строка заполнена пробелами сначала и вызовет ошибку конвертации, если заполнена не вся.

Желаю удачи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.