powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / приведение типов...
25 сообщений из 46, страница 1 из 2
приведение типов...
    #32874013
Имя пользователя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хочу загрузить в комбобокс список полей таблицы. причем хочу, чтоб отображались не сами названия полей а их лэйблы.
хотел сделать так:
Код: plaintext
1.
ComboBox1->Items->AddObject(Data->ADOQuery1->Fields->Fields[i]->DisplayName, (TObject *) (Data->ADOQuery1->Fields->Fields[i]->FieldName));

компилю в билдере6.
в итоге получаю:
Cannot cast from 'const AnsiString' to 'TObject *'

подскажите плиз как вывернуться из этой ситуации?
...
Рейтинг: 0 / 0
приведение типов...
    #32874029
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сорри, сижу не в builder'е, посему вопрос: а какие аргументы требует ф-ция addobject? + может стоит вывести в label->text названия полчаемых типов - и сравнить с требуемыми аргументами указ. ф-ции.
...
Рейтинг: 0 / 0
приведение типов...
    #32874094
Имя пользователя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AddObject(const AnsiString, TObject *)
а
Data->ADOQuery1->Fields->Fields ->FieldName - это AnsiString
...
Рейтинг: 0 / 0
приведение типов...
    #32874136
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
imho, трабл в том, что пытаешься привести объект ansistring к указателю на объект. заранее оговорюсь, что вполне могу ошибаться. сё человек и т.д....
...
Рейтинг: 0 / 0
приведение типов...
    #32874149
Имя пользователя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторimho, трабл в том, что пытаешься привести объект ansistring к указателю на объект. заранее оговорюсь, что вполне могу ошибаться. сё человек и т.д....

да все верно. это я знаю. просто не совсем точно сформулировал вопрос.
как мне привести тип данных AnsiString к типу TObject * ?!

например int приводится запросто.
...
Рейтинг: 0 / 0
приведение типов...
    #32874159
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
may be, проканает так:
Код: plaintext
1.
AnsiString tmp = Data->ADOQuery1->Fields->Fields[i]->FieldName;
TObject * ptrObj = &tmp;
далее по тексту
...
Рейтинг: 0 / 0
приведение типов...
    #32874508
Имя пользователя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет (
авторAnsiString tmp = Data->ADOQuery1->Fields->Fields ->FieldName;
TObject * ptrObj = &tmp;

тоже не работает.
с той же ошибкой. Cannot convert 'AnsiString *' to 'TObject *'
...
Рейтинг: 0 / 0
приведение типов...
    #32874545
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
положим, не та же:
Cannot cast from 'const AnsiString' to 'TObject *'
и
Cannot convert 'AnsiString *' to 'TObject *'

теперь может попробовать так:
Код: plaintext
1.
2.
AnsiString tmp * =new AnsiString();
*tmp = Data->ADOQuery1->Fields->Fields->FieldName;
TObject * ptrObj = static_cast<TObject *>(tmp);
...
Рейтинг: 0 / 0
приведение типов...
    #32874714
Имя пользователя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь ошибка такая:

[C++ Error] Unit3.cpp(41): E2108 Improper use of typedef 'AnsiString'
[C++ Error] Unit3.cpp(41): E2379 Statement missing ;
[C++ Error] Unit3.cpp(42): E2451 Undefined symbol 'tmp'

первые две ошибки относятся к первой строке.
...
Рейтинг: 0 / 0
приведение типов...
    #32874816
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это означает, что ansistring нельзя объявить подобным образом. либо отсутствует конструктор по умолчанию, либо он запрещен. надо глянуть по f1 для ansistring. остальные ошибки - лишь следствие.
...
Рейтинг: 0 / 0
приведение типов...
    #32874822
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и это, надеюсь ты заметил мою очепятку:
не ansistring tmp * ... a ansistring * tmp, естественно.
...
Рейтинг: 0 / 0
приведение типов...
    #32874930
Имя пользователя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чесно попробовав на всякий случай
ansistring tmp *
я конечно попробовал и
ansistring * tmp, но результат был

Cannot cast from 'AnsiString *' to 'TObject *'
для строки TObject * ptrObj = static_cast<TObject *>(tmp);

щас я уже думаю, использовать конструкцию типа
Код: plaintext
Data->ADOQuery1->Fields->Fields[ComboBox1->ItemIndex]->FieldName
чтоы получить имя поля по его номеру ...
...
Рейтинг: 0 / 0
приведение типов...
    #32875016
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
гмм, скажу счаз то, с чего стоило начать: глянуть help по addobject(...) -для чего и как она юзается. может, там найдется пример ее использования. есть еще вариант 100%, imho: объявить
Код: plaintext
1.
2.
TItem * newIt = new TItem(look for help);
newIt->some text property = your string;
combobox->AddObject(..., (TObject *)(newIt));
...
Рейтинг: 0 / 0
приведение типов...
    #32875141
FDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FDD
Гость
AnsiString наследуется от TObject?
...
Рейтинг: 0 / 0
приведение типов...
    #32875155
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
видимо нет, иначе бы (TObject *) ansistring var прокатывал при отсутствии явного запрета на подобное приведение (а с чего бы ему быть?)
...
Рейтинг: 0 / 0
приведение типов...
    #32875211
Имя пользователя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автормм, скажу счаз то, с чего стоило начать: глянуть help по addobject(...) -для чего и как она юзается. может, там найдется пример ее использования.

я использовал метод комбобокса addobject для сохранения в нем структуры: значение какого-то поля из БД и соответсвующего ему кода.
код - это всегдя int. и с преобразованием этого типа данных проблем не было. а сейчас хотел вместа int сохранить в этой структуре AnsiString.

поскольку такой вариант не получался, я решил вместо имени поля хранить его номер. но потом понял, что он будет совпадать с ItemIndex. поэтому я и решил отказаться вообще от addobject воспользовавшись просто add("").

а что за класс TItem?
это какой-то стандартный класс? а то билдер говорит undefined symbol 'TItem'
...
Рейтинг: 0 / 0
приведение типов...
    #32875226
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если в combobox'е есть список Items он должен состоять из каких-то объектов, к-рые по аналогии могли бы называться TItem - стандартное решение для подобных контролов. тот факт, что TItem компилятор не воспринимает означает лишь, что это объект именуется как-то иначе. TcbItem, for example.
...
Рейтинг: 0 / 0
приведение типов...
    #32875543
FDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FDD
Гость
У меня к сожалению нет билдера, но я как-то плохо себе представляю, чтобы метод AddObject(const AnsiString, TObject *) мог принимать в качестве второго параметра что-то кроме указателя на экземпляр TObject или отнаследованного от него класса.
...
Рейтинг: 0 / 0
приведение типов...
    #32875615
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
верно; у меня тоже нет давно билдера, поэтому я не смог вспомнить, что ansistring не является наследником tobject.
...
Рейтинг: 0 / 0
приведение типов...
    #32875888
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FDDУ меня к сожалению нет билдера, но я как-то плохо себе представляю, чтобы метод AddObject(const AnsiString, TObject *) мог принимать в качестве второго параметра что-то кроме указателя на экземпляр TObject или отнаследованного от него класса.

Да запросто он принимает, я писал когда-то примерно так:
Код: plaintext
1.
2.
3.
AnsiString *tmp  = new AnsiString();
tmp = &Data->ADOQuery1->Fields->Fields->FieldName;
TObject * ptrObj = (TObject *)tmp;
...
Рейтинг: 0 / 0
приведение типов...
    #32876278
Имя пользователя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторAnsiString *tmp = new AnsiString();
tmp = &Data->ADOQuery1->Fields->Fields->FieldName;
TObject * ptrObj = (TObject *)tmp;
компилятор в ответ на это говорит:
Must take address of a memory location

если немного изменить
Код: plaintext
1.
AnsiString aaa =Data->ADOQuery1->Fields->Fields[i]->FieldName;
tmp = &aaa;

то работает. только я не пойму самой логики...
как я понимаю:
Код: plaintext
1.
2.
3.
4.
5.
6.
//указателю типа АнсиСтринг присваивается адрес строки
tmp = &Data->ADOQuery1->Fields->Fields->FieldName; 
// указатель приводится к типу TObject *
TObject * ptrObj = (TObject *)tmp;
// добовляем в комбобокс объект, который является указателем на строку.
ComboBox1->Items->AddObject(Data->ADOQuery1->Fields->Fields[i]->DisplayName, ptrObj);

т.е. получается что в комбобоксе будут храниться не строки, а указатели на строки?

а как сделать обратное преобразование? т.е. получить из комбобокса строку?
в ответ на
ShowMessage((AnsiString)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]));
получаю
Could not find a match for 'AnsiString::AnsiString(TObject *)'
...
Рейтинг: 0 / 0
приведение типов...
    #32876583
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
т.е. получается что в комбобоксе будут храниться не строки, а указатели на строки?
если синтасксис ф-ции предусматривает передачу в качестве параметра указателя, то ничего с этим не поделаешь; да и делать не надо =) ведь никто не грит, что в combobox'е будут отображаться значение указателей, а не объектов, на к-рые они ссылаются =))))
...
Рейтинг: 0 / 0
приведение типов...
    #32876591
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что касается
ShowMessage((AnsiString)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]));
то почему не сделать:
авторShowMessage(*(ComboBox1->Items->Objects[ComboBox1->ItemIndex]));?? =)
...
Рейтинг: 0 / 0
приведение типов...
    #32876762
FDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FDD
Гость
Да, действительно. Это меня .NET испортил. Сейчас попробовал в VC:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class AnsiString
{	
};
class TObject
{
};

	AnsiString *tmp  = new AnsiString();	
	TObject *ptrObj = (TObject *)tmp;
Компилируется.
Это в C# такое не компилируется:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class AnsiString
{
};
class TObject
{
};
	AnsiString tmp  = new AnsiString();	
	TObject ptrObj = (TObject)tmp;
Только имхо в C# оно как-то правильнее. Не должны приводиться друг к другу неприводимые типы.
...
Рейтинг: 0 / 0
приведение типов...
    #32876800
13th_apostle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а ты не типу приводишь, а указатели, imho. канать такое должно, просто отвественность за возможные unreal exceptions несешь ты.
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / приведение типов...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]