Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 07.02.2018
Сообщений: 7
RAD XE3+

Ошибка при компиляции проекта

06.07.2020, 23:36. Показов 2130. Ответов 17

Студворк — интернет-сервис помощи студентам
Приветствую!

Помогите разобраться с ошибкой при компиляции. Invalid typecast с указанием на 11 строку в этом коде.
С generic столкнулся впервые.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function GetVal<T>(Source: TListBox): TList<T>;
var 
  I: Integer;
  values : TList<T>;
begin
  Result:= nil;
  if (not Assigned(Source)) then Exit;
  values := TList<T>.Create();
  try
    for I := 0 to (Source.Items.Count - 1) do
       values.Add(T(Source.Items.Objects[I]));
  except end;
  Result:= values;
end;
Среда Delphi 10.3
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.07.2020, 23:36
Ответы с готовыми решениями:

Ошибка при компиляции проекта
program Project1; uses FMX.Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}, Unit3 in 'Unit3.pas'...

Ошибка при компиляции проекта
Всем привет, ребят кто может глянуть проект, ошибка при компиляции, никак не пойму в чем дело, саму ошибку кинуть не могу, сейчас на роботе...

Ошибка при компиляции проекта на другом ПК
Скопировал программу на другой комп. .ехе - работают, если не компилировать. Пробовал удалять строчки из .dfm, но нет толку!...

17
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
07.07.2020, 11:05
Цитата Сообщение от VittoV Посмотреть сообщение
T(Source.Items.Objects[I])
так нельзя. Т - это неопределенный тип.
0
0 / 0 / 0
Регистрация: 07.02.2018
Сообщений: 7
07.07.2020, 11:24  [ТС]
Это перенос из ХЕ. В ХЕ компилит без проблем.
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
07.07.2020, 12:59
скорее дело должно обстоять вот так вот, T должно быть предаварительно чем-то, судя по тому, что мы ображаемся к объектам листбокса, то пусть T будет как класс
Delphi
1
2
3
  TMyClass = class
    function GetVal<T: class>(Source: TListBox): TList<T>;
  end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function TMyClass.GetVal<T>(Source: TListBox): TList<T>;
var
  I: Integer;
  values : TList<T>;
begin
  Result:= nil;
  if (not Assigned(Source)) then Exit;
  values := TList<T>.Create();
  try
    for I := 0 to (Source.Items.Count - 1) do
      begin
       values.Add(T(Source.Items.Objects[I]));
      end;
  except end;
  Result:= values;
end;
Delphi
1
2
3
4
5
6
7
procedure TForm1.Button1Click(Sender: TObject);
var Q: TMyClass;
begin
  Q := TMyClass.Create;
  {какой-то список := }Q.GetVal<TButton>(ListBox1);
  FreeAndNil(Q);
end;
только хреновый этот метод в плане архитектуры, тут прямо в методе создается новый список, а кто его потом чистить будет и удалять? Только извне.. а это плохо в разных местах создавать и удалять
1
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
07.07.2020, 13:22
всегда в наличии вариант
Delphi
1
as T
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
07.07.2020, 13:27
Цитата Сообщение от krapotkin Посмотреть сообщение
всегда в наличии вариант
оба типа должны иметь одинаковую базу, чтобы привести одно к другому, тут надо было сперва сказать, что мы работаем с типом данного, что может быть класс, тобишь ссылочный тип. а потом хоть as T, хоть T(...)
Только в том методес больше косяков, чем полезностей...
0
0 / 0 / 0
Регистрация: 07.02.2018
Сообщений: 7
07.07.2020, 21:44  [ТС]
Вот оригинальній код из XE - (точнее кусок кода)

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
unit HControls;
 
interface
 
uses DBCtrlsEh, StdCtrls, Generics.Collections;
 
type
  TControlsExt = class(TObject)
  private
 
  public
    class function GetValues<T>(Source: TListBox) : TList<T>;
  end;
 
implementation
 
{ TControlsExt }
 
class function TControlsExt.GetValues<T>(Source: TListBox): TList<T>;
var I: Integer;
    values : TList<T>;
begin
  Result:= nil;
  if (not Assigned(Source)) then Exit;
  values := TList<T>.Create();
  try
    for I := 0 to (Source.Items.Count - 1) do
      values.Add(T(Source.Items.Objects[I]));
  except end;
  Result:= values;
end;
end.
Как писал, в ХЕ компилируется без ошибок. При попытке в 10.3 ошибка на values.Add(T(Source.Items.Objects[I]));
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
07.07.2020, 21:56
добавь в 12 строчке T вот это T: class, должно сработать.
только данный кусок кода с нехилой утечкой памяти будет)))

values надо где-то удалять...

может хотябы так переделать..
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function TMyClass.GetVal<T>(Source: TListBox): TList<T>;
var
  I: Integer;
  values : TList<T>;
begin
  Result:= nil;
  if (not Assigned(Source)) then Exit;
 
  try
    values := TList<T>.Create();
    for I := 0 to (Source.Items.Count - 1) do
      values.Add(T(Source.Items.Objects[I]));
  finally
    FreeAndNil(values);
  end;
 
  Result:= values;
end;
1
0 / 0 / 0
Регистрация: 07.02.2018
Сообщений: 7
07.07.2020, 22:36  [ТС]
При замене на
Pascal
1
 class function GetValues<T: class>(Source: TListBox) : TList<T>;
сработало.
Но что-то подсказывает что на этом не все.
Буду смотреть дальше.
В данный момент задача хотя бы откомпилить проект с проведением необходимых корректур.
Понял что перенос с ХЕ веселое дело.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
08.07.2020, 10:26
Цитата Сообщение от Arcor Посмотреть сообщение
finally
    FreeAndNil(values);
  end;
Result:= values;
эм... обращение к объекту после его удаления...
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
08.07.2020, 10:55
Лучший ответ Сообщение было отмечено VittoV как решение

Решение

Цитата Сообщение от DenNik Посмотреть сообщение
эм... обращение к объекту после его удаления...
ну в обращении нет ничего противозаконного , но и смысла, да, нету))) я в самом первом своем сообщении начал говорить, что этот метод, сплошная кака)))) как по мне я бы его вообще вывел бы мне привычным и устоявшимся методом - через параметр функции, а результатом вернул бы true/false в зависимости от чего-то там...

Добавлено через 4 минуты

например так...

Delphi
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
function TMyClass.GetVal<T>(ASource: TListBox; out AList: TList<T>): Boolean;
var i: Integer;
begin
 
  Result := False;
 
  if not Assigned(ASource) then Exit;
 
  for i := 0 to ASource.Items.Count - 1 do
    AList.Add(T(ASource.Items.Objects[i]));
 
  Result := AList.Count > 0;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var Q: TMyClass;
    L: TList<TButton>;
begin
  Q := TMyClass.Create;
 
  L := TList<TButton>.Create;
  if Q.GetVal<TButton>(ListBox1, L) then чота там;
 
  // только еще где-то и все кнопки из списка удалить надо будет вручную из ListBox
  // тут ведь только ссылки затрутся.. Хотя может удаление где-то и происходит, но думаю что врятли, с таким подходом то...
 
  FreeAndNil(L);
  FreeAndNil(Q);
end;
только вот зачем все эти бубны с плясками? Ой наоборот жеж

Добавлено через 3 минуты
а еще лучше и вот так вот
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function TMyClass.GetVal<T>(ASource: TListBox; out AList: TList<T>): Boolean;
var i: Integer;
begin
 
  Result := False;
 
  if not Assigned(ASource) then Exit;
 
  for i := 0 to ASource.Items.Count - 1 do
    begin
      // если это является нужным типом объекта, то только тогда запихивать в список
      // иначе будет рано или поздно AV, если будет недопустимый к преобразованию тип
      if ASource.Items.Objects[i] is T then
        AList.Add(ASource.Items.Objects[i] as T);
    end;
 
  Result := AList.Count > 0;
end;
1
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
08.07.2020, 11:08
Цитата Сообщение от Arcor Посмотреть сообщение
ну в обращении нет ничего противозаконного
незнание или игнорирование закона не освобождает от ответственности... за возникший AV
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
08.07.2020, 11:13
Цитата Сообщение от DenNik Посмотреть сообщение
незнание или игнорирование закона не освобождает от ответственности... за возникший AV
так функция возвращала бы nil, а там, как я понимаю, предусмотрена проверка была и до меня... исходя из того, что результат инициализирован как nil, но возможно это мои догадки, погода нелетная, телепатор подвисает
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
08.07.2020, 11:46
Arcor, я согласен, что метод автора бредовый. однако если рассматривать твою функцию, то даже если она отработает корректно, в любом случае вернёт nil. смысл?

Добавлено через 1 минуту
кстати, меня тоже всегда интересовал вопрос, как корректно освобождать подобные временные объекты, если они являются результатом функции

Добавлено через 3 минуты
в свою очередь могу предложить вариант с массивом

Delphi
1
2
3
4
5
6
7
8
function GetVal<T>(Source: TListBox): TArray<T>
var
  values : TList<T>;
begin
  ...
  Result:= values.ToArray;
  values.Free;
end;
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
08.07.2020, 11:56
Цитата Сообщение от DenNik Посмотреть сообщение
однако если рассматривать твою функцию, то даже если она отработает корректно, в любом случае вернёт nil. смысл?
какую из них? я привел адекватное решение ответами выше

Цитата Сообщение от DenNik Посмотреть сообщение
кстати, меня тоже всегда интересовал вопрос, как корректно освобождать подобные временные объекты, если они являются результатом функции
не прибегать к такому решению просто. Правило: где надо использовать, там создал и там же удалил, все остальное приведет к костльной работе программы с кучей ненужных обвесок, чтобы замазать дыры

Если уж возвращать функцией что-то созданное, обозвать как-то ярко такую функцию Create_Чота_Тама(), чтобы интуитивно понимать, что функция вернет какой-то ресурс, который создан и который придется удалить уже извне. По типу конструктора, он тоже назван интуитивно Create, по сути его можно хоть ВасяПупкин обозвать, конструктором он не перестанет быть.

Но я еще ни одной такой функции не написал в реальных проектах, ибо из тестовых проектов, где напоигратсья что есть что, выявляются все эти косяки, потом больше обвязки лепишь, чтобы все это нейтрализовать

Добавлено через 5 минут
Цитата Сообщение от DenNik Посмотреть сообщение
в свою очередь могу предложить вариант с массивом
зачем копировать информацию? А если там будет терабайт данных? Конечно маловероятно, но все равно, копирование это долгий процесс. А потом все на дургой стороне копировать снова из массива куда-то еще ?
0
0 / 0 / 0
Регистрация: 07.02.2018
Сообщений: 7
08.07.2020, 12:37  [ТС]
Я же писал - это перенос (точнее - попытка) кода из версии XE в 10.3 (уже 10.4).
Код писался уже давненько.
При разборе выяснил что входящий TListBox - это набор данных загруженных из БД.
Таким же макаром реализовано и для TComboBox, только извлекается одно значение по индексу.
Справочники типа "Название" - "Значение". "Значения" разнотипные и загружаются в ASource.Items.Objects[i].
Я просто пытаюсь понять - заменять это все на более корректную реализацию или можно обойтись меньшей морокой.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
08.07.2020, 13:37
Цитата Сообщение от VittoV Посмотреть сообщение
заменять это все на более корректную реализацию или можно обойтись меньшей морокой.
Если так разобраться, то заменить на более корректную реализацию - как раз и будет меньшая морока, ибо костыли имеют свойство плодиться в геометрической прогресии
1
0 / 0 / 0
Регистрация: 07.02.2018
Сообщений: 7
08.07.2020, 13:48  [ТС]
Спасибо за информацию.
Тема закрыта.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.07.2020, 13:48
Помогаю со студенческими работами здесь

Ошибка (brcc32) при компиляции проекта
Создал я значит форму, пихнул в ресурсы картинку, решил воспроизвести ее на экран так сказать. Скомпилил проект, ошибка возникла. Плюнул на...

Ошибка при компиляции проекта. Модуль fCtrls.
Добрый день уважаемые форумчане. Столкнулся со следующей проблемой: При компиляции проекта выдает следующую ошибку: ...

Ошибка "Could not create output file" при компиляции проекта
Здравствуйте, у меня при компиляции приложения в rad studio xe 7, когда делаю отчет как на вашем видео вылезает следующая ошибка: ...

Ошибка "Could not create output file" при компиляции проекта
Пытаюсь компилировать программу Ошибка: synafpc.pas(150): F2039 Could not create output file 'C:\Program...

Ошибки при компиляции проекта на Delphi XE7
Доброе время суток :sleep: Помогите пожалуйста !!!! при компиляции проекта на Delphi XE7 выдаёт ошибки такова рода : ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru