| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Управление объектами |
| Автор: Wapo 31.1.2005, 18:12 |
| У меня возникла следуящая проблема. На форме очень много компонентов TEdit имеющие имена Edit1, Edit2 ... Edit N. При каждой загрузке формы нужно заполнить их. Писать вручную очень долго и не очень красиво. Как можно организовать обращение к компонентам в цикле. |
| Автор: Vyacheslav 31.1.2005, 18:57 |
| Обратиться то в цикле можно, только как в цикле будешь изменять то, чем их заполнить надо |
| Автор: NiJazz 1.2.2005, 09:04 | ||
Вопрос к знатокам: как привести к TEdit? |
| Автор: Vyacheslav 1.2.2005, 10:32 | ||
Ой какой кошмар . Пoпроще нельзя? Это же С++
|
| Автор: Vyacheslav 1.2.2005, 10:46 | ||
Кстати. Зачем использовать явно слючевое слово operator .
|
| Автор: Adil' 1.2.2005, 10:53 |
| Хочу дополнить - оба кода будут работать, только если у Edit'oв Owner'ом Form1 является (хотя обычно так и бывает З.Ы. Vyacheslav за что жы так над for'ом глумишься? Я даже с первого захода не понял как оно работает З.З.Ы. dynamic_cast |
| Автор: NiJazz 1.2.2005, 12:12 | ||||
Это он будет приводить все компоненты подряд?
Тут он выдавал ошибку. |
| Автор: Vyacheslav 1.2.2005, 12:41 |
| 1) Он будет пытаться приводить все компоненты. Если это не удается, то Edit'у будет привоен NULL 2) Обрати внимание: у меня AnsiString clName = "TEdit"; |
| Автор: azesmcar 1.2.2005, 13:49 | ||
| Vyacheslav clName == Components[i]->ClassName() работать не станет потому что типа ShortString а clName AnsiString..нету такого оператора сравнивания... И зачем делать dynamic_cast??? Для dynamic_cast тебе нужно будет включить в проект RTTI (Run Time Type Information)..не очень весело...по моему так лучше...
Добавлено @ 13:50 У AnsiString -а есть оператор сравнивания, но какой в этом смысл??? обяви сразу ShortString и покончь с делом... |
| Автор: Vyacheslav 1.2.2005, 15:26 | ||||||
1) Это работает по правилам С++ . Если не веришь, проверь хотя бы в тупую код. А после этого может быть найдешь объясненние. Если не найдешь, я объясню А вот ShortString оператора сравнения нет, поэтому твой код работать не будет 2) А ты пробовал собрать программу с использованием VCL без RTTI. Или ты думаешь, что ClassName обходится без RTTI? Тогда внимательно прочитай help про TObject
|
| Автор: azesmcar 1.2.2005, 17:06 | ||||||
можно просто заменить на
У меня билдера нету, так на память помнил что вроде бы так...вот так точно работает... Вот и все, а прочесывать всю иерархию для всех обьектов dynamic_cast -ом нахожу нецелеобразным...если обьяснишь почему вышеупомянутое правильно и обоснуешь я с тобой соглашусь...dynamic_cast довольно сильно замедляет программу, в данном случае он бессмысленен, если можно проверить тип перед кастингом...а насчет RTTI я уже сказал..Пробовал, собирал, работает... |
| Автор: Vyacheslav 1.2.2005, 17:59 | ||||||||||||||||||
Ну-ну
Ну-ну. String, говоришь? Загляни- ка в symac.h. Это ни о чем не говорит?
Я не собираюсь выводить тебя из твоего сладкого заблужения о возможности исключить RTTI из VCL. Только вот прежде чем делать такие заявления, надо хотя бы иметь основания А в реалиях имеем следущее Вот этот код без использования VCL
При попытке отрубить RTTI не откомпилируется с выдачей ошибки и будет совершенно прав
Для этого достаточно в опциях отключить флажок Enable RTTI или в параметра ком. строки добавить -RT- А вот этот код с VCL
будет спокойно собираться и работать в любом случае: будешь ли ставить галочку или не будешь, будешь добавлять -RT- или нет. То есть если подключен VCL компилятору глубоко наплевать какие опции там стоят, ибо VCL без RTTI работать не способен и к VCLу по крайней мере его RTTI будет подключен обязательно А насчет использовать, или не использовать. Напиши мне пожайлуста код, который у всех Controlo'v на форме поменяет цвет. Или хотя бы представь, что кроме TEdit, на форме есть еще TMyEdit, TEditEX, котрые порождены от TCustomEdit и у всех у них нужно очитстить Text |
| Автор: Adil' 1.2.2005, 18:12 | ||
| Попробовать собрать VCL-ную прогу с отключенным RTTI можно, да вот только при этом RTTI у VCL не отключится бо как все оно от TObject идет, и к нему и приходит, а он, родной, объявлен как DELPHICLASS, а значит и он сам, и наследники его автоматом RTTI поддерживают. Так что отключение RTTI в опциях проекта влияет только на "пользовательские" классы, которые без __rtti объявлены. А кто больше замедляет программу - dynamic_cast или сравнение строк с вызовом виртуальных функций еще проверить надо, хотя я процентов на 90 уверен, что первое - быстрее.
А где-то в хэдерах билдера есть такое typedef AnsiString String; Добавлено @ 18:15 О, пока расписывал, Vyacheslav уже отповедь выдал |
| Автор: Vyacheslav 1.2.2005, 18:27 | ||
Совершенно верно. И dynamic_cast для VCL классов будет работать в любом случае. А раз тащить его все равно приходится, то грех не воспользоваться |
| Автор: azesmcar 2.2.2005, 08:49 | ||||||||
Пожалуйста
Боже мой???!!! Неужели это то же самое??? Какой ужас??? А если так написать??? #define String AnsiString Надо же, ты гений!!! А можно например вот так написать
Все равно в VCL это все уже есть, почему бы не попользоваться?? Грех! Ну разве что потому что медленее...чуточку..а dynamic_cast не очень то чуточку...я не спорю, я предлагаю вариант... А насчет RTTI не знаю, никогда не интересовался конструкцией VCL, я в GUI не люблю работать... Знаю только что пробовал, а вот отключил он или не отключил понятия не имею... |
| Автор: azesmcar 2.2.2005, 09:12 | ||
Ну проверить так проверить... |
| Автор: Vyacheslav 2.2.2005, 10:31 | ||||||||||||||||||||
Ты дал опять нерабочий код
ClassName() вернет для компонентов TMyEdit, TEditEX соответственно "TMyEdit" и "TEditEX" и они в условие
никак не попадут Так что "гений" это , пожалй не я, а ты.
Это к чему? Еще раз. В VCL String синоним AnsiString. Строку typedef AnsiString String; не я написал, а те кто разрабатывал VCL. Так что твое предложение заменить AnsiString на String кроме декоративности никакого смысла не несет, по скольку это по определению одно и тоже. Дошло, "гений"?
Лучше вообще не писать. Заменить один неработающий вариант на другой не имеет смысла Решение элементарно и лаконично, как и положено в С++
А нафига тогда в дискуссию влезать? И утверждать, что собирал VCL без его RTTI. Ради накручивания счетчика сообщений? Кстати. А это то вообще зачем? Для увеличения скорости, о которой ты так печешься ?
|
| Автор: azesmcar 2.2.2005, 11:44 | ||||||||
| Тебе весь код по кусочкам нужен??? Перечислить if для всех типов данных??? Хорошо
Если я теперь не напишу еще один if для всех остальный тобою перечисленных типов ты не обидешся???;) Хотя вот здесь скажу, dynamic_cast подойдет лучше, но вопрос задавался не для этого случая... Дальше...
А я не утверждал...ты спросил пробовал ли я собирать VCL проект без RTTI, я ответил что пробовал, и он собрался...
так, ну тут и отвечать нечего, по моему ты просто не понял что я написал... ладно, скажу так Я ЗНАЮ ЧТО String и AnsiString это одно и тоже OБЬЯВЛЕНИЕ typedef в файле видел и уже давно не использую в программах текст AnsiString всегда пишу String Просто смотря на мой код ты подумал что у мое бурное воображение привело меня к тому что я решил запихнуть сюда STL и написал слово string с большой буквы по ошибке...ну да ладно...
Нет, это для того чтобы показать что есть множество способов, но не все годятся для данного случая... Если нужно проверить скорость то давай проверять... Я так понимаю сравнение строк будет идти так ABCD ACEE первые символы равны, continue вторые символы не равны, return false не очень то медленно...а dynamic_cast помнится вроде Страуструп советовал использовать только в ооочень деликатных ситуациях... Если иерархия классов такая что другими методами кастинга на желаемый обьект выйти нельзя... здесь иерархия примитивная... |
| Автор: Guest 2.2.2005, 14:33 | ||
| Если Edit'ы заполняешь из базы, то самое простое: - присваивай имена контролам в соответствии с именами полей в базе, - создай класс, что-нибудь типа:
для формы с большим количеством полей вполне нормально |
| Автор: azesmcar 2.2.2005, 14:36 | ||
А разве в этом есть смысл??? В билдере есть TDBEdit... |
| Автор: Guest 2.2.2005, 14:47 |
| Есть смысл. Не всегда хочется пользоваться ими. (Только, давайте не будем дискутировать еще и на эту тему). |
| Автор: Hroft 2.2.2005, 15:19 |
| azesmcar, я, конечно, извиняюсь, но ты, похоже, не понял почти ничего из постов Vyacheslav'а, или просто не захотел понять. С начала перечитай весь топик, только без предосуждения, и успокойся, наконец. Динамик каст использовать, может, и не рекомендуется, но у нас тут билдер, вполне конкретный компилятор. Решение Vyacheslav'а, на мой взгляд, красивое и полное. |