Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.23;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.014 c
3-1147846173
Ega23
2006-05-17 10:09
2006.07.23
union по двум SP


15-1150977103
TUser
2006-06-22 15:51
2006.07.23
USB-вентиляторы


15-1150941036
Perwomai
2006-06-22 05:50
2006.07.23
Футбол и национализм


2-1151949191
Fantos
2006-07-03 21:53
2006.07.23
Мерцание png


2-1151852788
Gizza
2006-07-02 19:06
2006.07.23
Свернуть MainForm





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский