powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Приведение типов в классах
16 сообщений из 16, страница 1 из 1
Приведение типов в классах
    #39511453
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Появилась тут у меня загадочная проблема, вроде недавно работало а тут поломалось при каких-то видимо моих изменениях кода. Но, как я помню, что касается этого ничего не менял, но чудес не бывает. В общем так: Создаю простой комбо с привязанными к элементам объектами


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
vString : TStringObj;
...
 cbRoles.Items.Clear;
 vString := TStringObj.Create('W');
 cbRoles.Items.AddObject('Запись', vString);
 vString := TStringObj.Create('R');
 cbRoles.Items.AddObject('Чтение', vString);
 vString := TStringObj.Create('U');
 cbRoles.Items.AddObject('Недоступен', vString);

до этого создаю объект

type
  StringObj = record
               sValue : string;
              end;

  TStringObj = class(TObject)
  private
    sStr : StringObj;
    function GetStr : StringObj;
    procedure SetStr(OldValue : StringObj);
  public
    constructor Create( ist : string);
    property pStr : StringObj read GetStr write SetStr;
  end;
...
 constructor TStringObj.Create(ist : string);
 begin
    inherited Create;
    sStr.sValue := ist;
 end;

 function TStringObj.GetStr : StringObj;
 begin
  Result := sStr;
 end;

 procedure TStringObj.SetStr(OldValue : StringObj);
 begin
    sStr.sValue := OldValue.sValue;
 end;


и вот в коде в другом модуле мне надо получить значение строки в объекте по выбранному элементу комбо

qRules.FieldByName('Role').AsString := (fRules.cbRoles.Items.Objects[fRules.cbRoles.Items.IndexOf(qRules.FieldByName('RoleName').AsString)] as TStringObj).pStr.sValue;
проверяю - значение qRules.FieldByName('RoleName').AsString верное
но в результате получаю ошибку invalid class typecast понимаю что это неправильное приведение типов классов, но почему неясно, может кто подскажет. Спасибо.

Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511461
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968, fRules.cbRoles.Items.Objects[fRules.cbRoles.Items.IndexOf(qRules.FieldByName('RoleName').AsString)].ClassName - что покажет?

Ну и просто Assigned проверь.
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511472
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил fRules.cbRoles.Items.Objects[fRules.cbRoles.Items.IndexOf(qRules.FieldByName('RoleName').AsString)].ClassName как ни странно равно TStringObj - чудеса
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511496
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968, DLL?
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511501
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что DLL?
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511505
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если имеется ввиду программирую DLL? то нет - разработка Web-приложения
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511518
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968и вот в коде в другом модуле мне надо получить значение строки в объекте по выбранному элементу комбо

qRules.FieldByName('Role').AsString := (fRules.cbRoles.Items.Objects[fRules.cbRoles.Items.IndexOf(qRules.FieldByName('RoleName').AsString)] as TStringObj).pStr.sValue;
проверяю - значение qRules.FieldByName('RoleName').AsString верное
но в результате получаю ошибку invalid class typecast понимаю что это неправильное приведение типов классов, но почему неясно, может кто подскажет. Спасибо.

Другой модуль в том же исполняемом файле ?
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511519
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да конечно и в том же исполняемом модуле и в том же проекте
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511536
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем все эти танцы? Вполне можно обойтись записью без всякого класса.
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511547
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подскажите, пожалуйста, как?
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511589
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968да конечно и в том же исполняемом модуле и в том же проекте

Возможно код стоит разнести по нескольким операторам, смотря в отладчике ход операций.
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511664
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разнес следующим образом

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var p,p1,p2 : string;
    i : integer;
    str_ : TObject;
...

  P := qRules.FieldByName('RoleName').AsString;
  i := fRules.cbRoles.Items.IndexOf(p);
  p1 := fRules.cbRoles.Items.Objects[i].ClassName;
  str_ := fRules.cbRoles.Items.Objects[i];
  p2 := (str_ as TStringObj).sStr.sValue;



на всех операциях значения верные
на последнем операторе естественно та же ошибка
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511677
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968подскажите, пожалуйста, как?
как вариант
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
type
  PStringObj = ^StringObj;
...

var
  Ptr: PStringObj;
...
  New( Ptr );
  Ptr^.sValue := 'W';
  cbRoles.Items.AddObject('Запись', Ptr);
...


и не забыть Dispose( ... )

хотя для одной буквы можно еще проще
Код: pascal
1.
  cbRoles.Items.AddObject('Запись', Pointer( Ord( 'W' ) ) );
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511736
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968Разнес следующим образом

var p,p1,p2 : string;
i : integer;
str_ : TObject;
...

P := qRules.FieldByName('RoleName').AsString;
i := fRules.cbRoles.Items.IndexOf(p);
p1 := fRules.cbRoles.Items.Objects[i].ClassName;
str_ := fRules.cbRoles.Items.Objects[i];
p2 := (str_ as TStringObj).sStr.sValue;

на всех операциях значения верные
на последнем операторе естественно та же ошибка

Код: pascal
1.
2.
  str_ := fRules.cbRoles.Items.Objects[i];
  Assert(str_ is TStringObj, Format('Expected TStringObj, received %s', [str_.ClassName]));



?
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511780
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968,

А TStringObj у Вас объявлен в одном месте? Или по проекту есть несколько определений этого класса?
...
Рейтинг: 0 / 0
Приведение типов в классах
    #39511784
Priks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если повторить ваш код в чистом виде, то все работает.
Значит проблема именно в приложении.
Проверьте какие еще модули подключены - может есть одноименная переменная еще где-то.
Смутил еще вот этот момент:
и вот в коде в другом модуле мне надо получить значение строки в объекте по выбранному элементу комбо

qRules.FieldByName('Role').AsString := (fRules.cbRoles.Items.Objects[fRules.cbRoles.Items.IndexOf(qRules.FieldByName('RoleName').AsString)] as TStringObj).pStr.sValue;
но здесь комбобокс cbRoles используется только как контейнер с данными и абсолютно пофиг, что там в нем выбрано.
Может проще запросом сразу сделать обновление qRules.Role исходя из qRules.RoleName ?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Приведение типов в классах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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