Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

try except как способ выбора [D5, XP]


Страницы:   1 2

Юнкер ©   (2006-06-25 21:22:00) 

Комбобокс CB содержит строки:
1
2
10
100
*
Нужно чтобы при выборе звездочки присвоить переменной значение 99 Правильно ли будет делать такой код?

try
i := strtoint(cb.Text);
except
i := 99;
end;


Какие грабли могут быть при таком использовании try-except?


TUser   (2006-07-01 20:35:00) [1]

> Какие грабли могут быть при таком использовании try-except?

Тут возможно несколько ошибок, в частности, - AV, если cv не существует. Такая ситуация может "скрыть" реальную ошибку в программе. Разумно написать on E:E..., т.е. ловить только тот эксепшен, которого ты ожидаешь.


Юнкер   (2006-07-01 20:08:00) [2]

Спасибо за развернутые ответы.

Для очистки всех итемов комбобокса сделаю cb.Items.Clear


Жуков Олег   (2006-07-01 19:58:00) [3]

В твоём случае это не объекты, а целые числа, поэтому удалять ничего нужно. TObject - это как бы тот же самый Integer, указывающий на адрес объекта в памяти. Памятьвыделяется при вызове конструктора объекта -
 obj := TObject.Create();
В этом примере конструктор, во-первых, забирает у ОС кусок памяти и отдаёт его объекту, во-вторых возвращает адрес этого куска в переменную obj. При этом, т.к. программа забрала себе память для объекта, то где-то в программе её нужно и отдать обратно. Это делается  вызовом деструктора объекта: obj.Destroy().
У тебя же никаких конструкторов объектов не вызывается, ты просто пользуешься тем, что "TObject - это как бы тот же самый Integer" для хранения в переменных типа TObject вместо адресов памяти твоих произвольных целых чисел. В твоих Objects хранятся "как бы объекты", указывающие на какие-то левые участки памяти, но в этих участках памяти может быть всё что угодно, это не значит что там есть настоящие объекты. Поэтому при обращении к таким переменным как к объекту, вероятнее всего возникнет исключение Access Violation, но можно пользоваться такими переменными как Integer (используя приведение типов) не задумываясь об освобождении и выделении памяти.


Loginov Dmitry   (2006-07-01 19:38:00) [4]

У тебя самих объектов нет, только несуществующие ссылки на несозданные объекты (как сказанул!!!). Поэтому Items.Clear или Items.Delete


Юнкер   (2006-07-01 19:21:00) [5]

А как удалить эти Тобъекты ? Чтобы очистить все итемы комбобокса подойдет cb.Items.Clear ? Или объекты подругому удаляются?

Спасибо за помощь.


Loginov Dmitry   (2006-07-01 16:43:00) [6]

> Только целочисленный тип?


Ага


> А как сделать 0.5 ?


Умнож, например на 1000 и обрежь с помощью Trunc (это перед AddObject)

Затем при выборе строки дели это число на 1000.


Юнкер   (2006-07-01 16:22:00) [7]


> 0.5

"Invalid typecast".
Ничего непонимаю. Только целочисленный тип? А как сделать 0.5 ?


Юнкер   (2006-07-01 16:08:00) [8]

да, конечно. я что-то туплю.

Спасибо.


Virgo_Style   (2006-07-01 15:59:00) [9]

0.5


Юнкер   (2006-07-01 15:55:00) [10]

Ага. А так:
cb.Items.AddObject('0,50',TObject(0,5));
неполучается. Пишет:  ')' expected but ',' found
Похоже ему нужно целое число?

Как сделать?


Юнкер   (2006-07-01 15:39:00) [11]

Спасибо.


Юрий Зотов   (2006-07-01 15:31:00) [12]

cb.Items.AddObject('1',TObject(1));


Юнкер   (2006-07-01 15:28:00) [13]


> заполнять
> cb.AddItem('1',TObject(1));

Ундекларед индитифер.

Я не нашел как добавить Тобъект в итем комбобокса. Д5. Я наверное что-то не так делаю? Может не комбобокс?


Dmitrij_K   (2006-06-25 22:45:00) [14]

i := StrToIntDef(cb.Text, 99)


Palladin   (2006-06-25 22:18:00) [15]

но(!), лучше всего в твоем случае поступить следующим образом

заполнять
cb.AddItem('1',TObject(1));
cb.AddItem('2',TObject(2));
cb.AddItem('10',TObject(10));
cb.AddItem('100',TObject(100));
cb.AddItem('*',TObject(99));

и брать значение как
i:=Integer(cb.Items.Objects[cb.ItemIndex]);

предварительно проверив ItemIndex=-1 конечноже...


Юнкер   (2006-06-25 22:07:00) [16]

Спасибо.


Palladin   (2006-06-25 21:59:00) [17]

думаешь правильно

просто если у тебя будет не одно, а несколько нечисловых значений, все таки придется повернуться к if'ам передом... иногда это случается довольно поздно :) и переписываться придется довольно много...


Юнкер   (2006-06-25 21:40:00) [18]


> if not TryIntToStr(cb.Text,i) then
>  i := 99;

Но ведь это будет одинаково с

try
i := strtoint(cb.Text);
except
i := 99;
end;

Я правильно думаю? И граблт если есть, те же?


Джо   (2006-06-25 21:39:00) [19]

А вообще, я вводил бы утверждение (Assertion) дабы явно подчеркнуть, что допустимые параметры могут быть только такими: или "*" или число в строковом представлении.


Джо   (2006-06-25 21:36:00) [20]

Пардон, вот так:

if not TryIntToStr(cb.Text,i) then
 i := 99;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо