Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Управление объектами, Массив объектов 
:(
    Опции темы
azesmcar
Дата 2.2.2005, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата
А кто больше замедляет программу - dynamic_cast или сравнение строк с вызовом виртуальных функций еще проверить надо, хотя я процентов на 90 уверен, что первое - быстрее.


Ну проверить так проверить...smile Давай проверять, я думаю что второе быстрее будет
PM   Вверх
Vyacheslav
Дата 2.2.2005, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Ты дал опять нерабочий код
Цитата

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
String clName = "TEdit";
for (int i=0; i < ComponentCount; i++)
{
    if (clName == Components[i]->ClassName())
    {
        (static_cast<TCustomEdit*>(Components[i]))->Text = "";
    }
}
}


ClassName() вернет для компонентов TMyEdit, TEditEX соответственно "TMyEdit" и "TEditEX" и они в условие
Код

 if (clName == Components[i]->ClassName())

никак не попадут Так что "гений" это , пожалй не я, а ты.

Цитата

Боже мой???!!! Неужели это то же самое??? Какой ужас???
А если так написать??? smile
#define String AnsiString
Надо же, ты гений!!! smile

Это к чему? Еще раз. В VCL String синоним AnsiString. Строку
typedef AnsiString String;
не я написал, а те кто разрабатывал VCL. Так что твое предложение заменить AnsiString на String кроме декоративности никакого смысла не несет, по скольку это по определению одно и тоже. Дошло, "гений"?
Цитата

А можно например вот так написать
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
String clName = "TEdit";
for (int i=0; i < ComponentCount; i++)
{
    if (clName == Components[i]->ClassName())
    {
        const TCustomEdit* t = static_cast<TCustomEdit*>(Components[i]);
        TCustomEdit* p = const_cast<TCustomEdit*>(t);
        p->Text = "";
    }
}
}



Лучше вообще не писать. Заменить один неработающий вариант на другой не имеет смысла
Решение элементарно и лаконично, как и положено в С++
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (int i= ComponentCount; i--;)
{
    if (TCustomEdit* Edit = dynamic_cast<TCustomEdit*>(Components[i]))
    {
        Edit->Text = "";
    }
}
}



Цитата

А насчет RTTI не знаю, никогда не интересовался конструкцией VCL, я в GUI не люблю работать...
Знаю только что пробовал, а вот отключил он или не отключил понятия не имею...


А нафига тогда в дискуссию влезать? И утверждать, что собирал VCL без его RTTI. Ради накручивания счетчика сообщений?


Кстати. А это то вообще зачем? Для увеличения скорости, о которой ты так печешься ? smile Или исключительно продемонстрировать свои знания const_cast?
Цитата

Код

const TCustomEdit* t = static_cast<TCustomEdit*>(Components[i]);
 TCustomEdit* p = const_cast<TCustomEdit*>(t);



Это сообщение отредактировал(а) Vyacheslav - 2.2.2005, 10:47


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 2.2.2005, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Тебе весь код по кусочкам нужен??? Перечислить if для всех типов данных???
Хорошо
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  String Edit = "TEdit";
  String EditEx = "TEditEx";
  for (int i=0; i < ComponentCount; i++)
  {
     if (Edit == Components[i]->ClassName() || EditEx == Components[i]->ClassName())
    {
        (static_cast<TCustomEdit*>(Components[i]))->Text = "";
    }
  }
}


Если я теперь не напишу еще один if для всех остальный тобою перечисленных типов ты не обидешся???;)

Хотя вот здесь скажу, dynamic_cast подойдет лучше, но вопрос задавался не для этого случая...

Дальше...
Цитата
А нафига тогда в дискуссию влезать? И утверждать, что собирал VCL без его RTTI. Ради накручивания счетчика сообщений?


А я не утверждал...ты спросил пробовал ли я собирать VCL проект без RTTI, я ответил что пробовал, и он собрался...

Цитата
Это к чему? Еще раз. В VCL String синоним AnsiString. Строку
typedef AnsiString String;
не я написал, а те кто разрабатывал VCL. Так что твое предложение заменить AnsiString на String кроме декоративности никакого смысла не несет, по скольку это по определению одно и тоже. Дошло, "гений"?


так, ну тут и отвечать нечего, по моему ты просто не понял что я написал...

ладно, скажу так
Я ЗНАЮ ЧТО String и AnsiString это одно и тоже
OБЬЯВЛЕНИЕ typedef в файле видел
и уже давно не использую в программах текст AnsiString всегда пишу String

Просто смотря на мой код ты подумал что у мое бурное воображение привело меня к тому что я решил запихнуть сюда STL и написал слово string с большой буквы по ошибке...ну да ладно...

Цитата
Кстати. А это то вообще зачем? Для увеличения скорости, о которой ты так печешься ?  Или исключительно продемонстрировать свои знания const_cast?


Нет, это для того чтобы показать что есть множество способов, но не все годятся для данного случая...

Если нужно проверить скорость то давай проверять...
Я так понимаю сравнение строк будет идти так

ABCD
ACEE
первые символы равны, continue
вторые символы не равны, return false
не очень то медленно...а dynamic_cast помнится вроде Страуструп советовал использовать только в ооочень деликатных ситуациях...

Если иерархия классов такая что другими методами кастинга на желаемый обьект выйти нельзя...
здесь иерархия примитивная...
PM   Вверх
Guest
Дата 2.2.2005, 14:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Если Edit'ы заполняешь из базы, то самое простое:
- присваивай имена контролам в соответствии с именами полей в базе,
- создай класс, что-нибудь типа:

Код

typedef struct {
    TComponent     *component;
    AnsiString      value, name;
} TSimpleField;

typedef std::vector<TSimpleField> TFormFields;

class TControlsList {
private:
TFormFields::iterator     iter;

public:
TADODataSet *ds;
TFormFields    ValField;
...

void __fastcall CreateFields(TComponent *ct);
void __fastcall SetValueFields(void);
...
}

*.cpp

//в цикле вызвать для всех нужных компонентов формы
void __fastcall TControlsList::CreateFields(TComponent *ct)
{
unsigned at = ValField.size();
ValField.resize(at + 1);
ValField.at(at).component = ct;
ValField.at(at).value = "";
ValField.at(at).name = ct->Name;
}

void __fastcall TControlsList::SetValueFields(void)
{
TField *fld;
//где-то прочитал из базы

for ( ds->First(); !ds->Eof; ds->Next() )
{
    for ( iter = ValField.begin(); iter < ValField.end(); ++iter )
    {
       fld = ds->FindField( (*iter).name );  //ищешь поле по имени контрола
       if ( fld )
          if ( (*iter).component->ClassNameIs("TEdit") )
            {
              (*iter).value = fld->AsString;   //сохраняется начальное значение поля
              ((TEdit*)(*iter).component)->Text = fld->AsString;
            }
     }
}


для формы с большим количеством полей вполне нормально

  Вверх
azesmcar
Дата 2.2.2005, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата
Если Edit'ы заполняешь из базы, то самое простое:
- присваивай имена контролам в соответствии с именами полей в базе,
- создай класс, что-нибудь типа:


А разве в этом есть смысл??? В билдере есть TDBEdit...
PM   Вверх
Guest
Дата 2.2.2005, 14:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть смысл. Не всегда хочется пользоваться ими. (Только, давайте не будем дискутировать еще и на эту тему).
  Вверх
Hroft
Дата 2.2.2005, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: 1
Всего: 3



azesmcar, я, конечно, извиняюсь, но ты, похоже, не понял почти ничего из постов
Vyacheslav'а, или просто не захотел понять. С начала перечитай весь топик, только без предосуждения, и успокойся, наконец.
Динамик каст использовать, может, и не рекомендуется, но у нас тут билдер, вполне конкретный компилятор. Решение Vyacheslav'а, на мой взгляд, красивое и полное.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0837 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.