Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Приведение типов в классах / 16 сообщений из 16, страница 1 из 1
28.08.2017, 10:41:15
    #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
28.08.2017, 10:50:31
    #39511461
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение типов в классах
patrick1968, fRules.cbRoles.Items.Objects[fRules.cbRoles.Items.IndexOf(qRules.FieldByName('RoleName').AsString)].ClassName - что покажет?

Ну и просто Assigned проверь.
...
Рейтинг: 0 / 0
28.08.2017, 11:08:37
    #39511472
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение типов в классах
Проверил fRules.cbRoles.Items.Objects[fRules.cbRoles.Items.IndexOf(qRules.FieldByName('RoleName').AsString)].ClassName как ни странно равно TStringObj - чудеса
...
Рейтинг: 0 / 0
28.08.2017, 11:44:04
    #39511496
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение типов в классах
patrick1968, DLL?
...
Рейтинг: 0 / 0
28.08.2017, 11:48:39
    #39511501
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение типов в классах
Что DLL?
...
Рейтинг: 0 / 0
28.08.2017, 11:50:19
    #39511505
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение типов в классах
Если имеется ввиду программирую DLL? то нет - разработка Web-приложения
...
Рейтинг: 0 / 0
28.08.2017, 12:11:53
    #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
28.08.2017, 12:13:29
    #39511519
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение типов в классах
да конечно и в том же исполняемом модуле и в том же проекте
...
Рейтинг: 0 / 0
28.08.2017, 12:35:31
    #39511536
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение типов в классах
Зачем все эти танцы? Вполне можно обойтись записью без всякого класса.
...
Рейтинг: 0 / 0
28.08.2017, 12:51:05
    #39511547
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение типов в классах
подскажите, пожалуйста, как?
...
Рейтинг: 0 / 0
28.08.2017, 13:26:33
    #39511589
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение типов в классах
patrick1968да конечно и в том же исполняемом модуле и в том же проекте

Возможно код стоит разнести по нескольким операторам, смотря в отладчике ход операций.
...
Рейтинг: 0 / 0
28.08.2017, 14:35:42
    #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
28.08.2017, 14:45:07
    #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
28.08.2017, 15:21:48
    #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
28.08.2017, 16:14:39
    #39511780
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение типов в классах
patrick1968,

А TStringObj у Вас объявлен в одном месте? Или по проекту есть несколько определений этого класса?
...
Рейтинг: 0 / 0
28.08.2017, 16:24:22
    #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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Приведение типов в классах / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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