Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.23;
Скачать: CL | DM;

Вниз

try except как способ выбора   Найти похожие ветки 

 
Юнкер   (2006-06-25 21:22) [0]

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

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


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


 
Джо ©   (2006-06-25 21:26) [1]

А почему не просто

if cb.Text = "*" then
 i := 99

?


 
Юнкер   (2006-06-25 21:29) [2]


> А почему не просто
>
> if cb.Text = "*" then
>  i := 99

Потому что: i := strtoint(cb.Text);


 
Джо ©   (2006-06-25 21:35) [3]

> Потому что: i := strtoint(cb.Text);

if cb.Text = "*" then
 i := 99
else
 i := IntToStr(cb.Text);


Ну, или даже так:


> if cb.Text = "*" then
> i := 99


 
Джо ©   (2006-06-25 21:36) [4]

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

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


 
Джо ©   (2006-06-25 21:39) [5]

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


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


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

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

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

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


 
Palladin ©   (2006-06-25 21:59) [7]

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

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


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

Спасибо.


 
Palladin ©   (2006-06-25 22:18) [9]

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

заполнять
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 конечноже...


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

i := StrToIntDef(cb.Text, 99)


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


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

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

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


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

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


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

Спасибо.


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

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

Как сделать?


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

0.5


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

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

Спасибо.


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


> 0.5

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


 
Loginov Dmitry ©   (2006-07-01 16:43) [18]

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


Ага


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


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

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


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

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

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


 
Loginov Dmitry ©   (2006-07-01 19:38) [20]

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


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

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


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

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

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


 
TUser ©   (2006-07-01 20:35) [23]

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

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



Страницы: 1 вся ветка

Текущий архив: 2006.07.23;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.03 c
2-1151770920
pushkin42
2006-07-01 20:22
2006.07.23
Systray


2-1151913621
ZZZ_ZZZ
2006-07-03 12:00
2006.07.23
Алгоритм работы архиваторов


15-1150952995
Ega23
2006-06-22 09:09
2006.07.23
С Днём рождения! 22 июня


15-1151048897
MsGuns
2006-06-23 11:48
2006.07.23
Доступ к объектам 1С из Делфи через COM


1-1149649436
_HAWK_
2006-06-07 07:03
2006.07.23
Как перевести на WinAPI?