Форум: "Начинающим";
Текущий архив: 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