![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
try except как способ выбора [D5, XP]
Юнкер © (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;