Компонент TExcelApplication не найден (устаревшее преобразование)

В устаревшем приложении Delphi-7 для экспорта данных в Excel используется TExcelApplication. Перенося это на Rio, Delphi посылает смешанные сигналы относительно доступности этого компонента.

Когда компонент помещается в форму, среда IDE сообщает, что TExcelComponent «не найден», и открывается паскаль-код, но представление формы (F12) недоступно. Однако проект ДЕЙСТВИТЕЛЬНО компилируется, и доступ к компоненту (для открытия файлов Excel и т. Д.) Работает во время выполнения.

Когда я удаляю компонент из формы и динамически создаю его в FormCreate, код ДЕЙСТВИТЕЛЬНО компилируется, но во время выполнения код генерирует ошибку: «TExcelApplication не может быть найден»

«Использует Excel2000» в коде.

Некоторые поисковые запросы указали мне, что мне нужно установить пакет Office в Delphi (см. Снимок экрана). Действительно, галочка «MS-Office2000…» была отключена, поэтому я включил ее и сохранил; однако это не помогло. При нажатии на «Компоненты» действительно отображается компонент TExcelApplication. Однако установка этого флажка (включая выход из Delphi и сборку проекта) не помогает (та же проблема).

https://gyazo.com/960eb8b53b891a5cc320e6866513c41a

Файл bpl в подкаталоге embarcadero программных файлов не существует в моей системе (и нет, я не удалял его оттуда или что-то в этом роде; я никогда не был там раньше, и там есть множество других bpl).

Итак, я немного напуган ... как мне заставить что-то простое, например, экспорт данных в Excel, снова заработать?

Заранее спасибо, Юр.


person Jur    schedule 15.07.2020    source источник
comment
Fwiw, я могу открыть проект D7 TExcelApplication в Delphi 10.2 без каких-либо проблем, если у меня установлен пакет «Microsoft Office 2000 Sample Automation Server Wrapper Components». Так что похоже, что ваша проблема связана с DFM или настройкой Delphi. Вы пробовали создать новый пакет, добавить в него Word2000 и установить его?   -  person MartynA    schedule 15.07.2020


Ответы (1)


в процессе

  1. ExcelXP, Excel2000, Excel97 - эти устройства представляют собой просто отшлифованные внутренние версии стандартного импорта ActiveX. Вы можете использовать их, или вы всегда можете самостоятельно импортировать их, используя стандартное меню «Компоненты / Импорт Active X».

Динамическое связывание, как показано в ответе MArtynA, тоже может работать, но оно лишит вас возможности проверки синтаксиса во время компиляции.

var Excel: Variant; // or OleVariant
...
   Excel := CreateOleObject('Excel.Application');

Если вы неправильно набрали какой-либо идентификатор или использовали свойство / метод, которые еще не поддерживаются или больше не поддерживаются в вашей версии Excel - вы узнаете об этом только тогда, когда ваше приложение попытается его использовать, компиляция не предупредит вас.

  1. runtime the code generates an error: “TExcelApplication cannot be found” означает, что вы нарушили потоковую передачу DFM. В частности, ReadComponent функция, анализирующая ресурс DFM вашего приложения, обнаруживает, что необходимо загрузить класс с именем 'TExcelApplication', но в словаре такого класса нет. Используйте RegisterClass(TExcelApplication); в разделе инициализации устройства. Или переместите объявление объекта обратно в published раздел вашего класса формы - тогда Delphi RTL прозрачно выполнит этот вызов за вас.

  2. IDE сообщает, что TExcelComponent «не найден» и устанавливает пакет Office в Delphi - действительно, см. Ошибка при открытии файла dfm - класс xxxx не найден

Файл bpl в подкаталоге embarcadero программных файлов не существует в моей системе - если бы это было так, вы не смогли бы установить этот флажок, потому что он точно пытается загрузить BPL времени разработки в вашу среду IDE. И это дало бы вам совсем другую ошибку, о невозможности бездельничать ваш BPL.

Лично я никогда не устанавливаю Delphi в Program Files, потому что какой-то старый код может выйти из строя с длинными и содержащими пробелы путями, а также потому, что я предпочитаю иметь возможность возиться со средствами разработки без проблем с UAC (контроль доступа пользователей Windows Vista +), включая свою виртуальную теневую файловую систему (% LocalAppData% \ VirtualStore).

В моей установке XE2 исходные файлы .pas лежат в c:\RAD Studio\9.0\OCX, а c:\RAD Studio\9.0\bin имеет ТРИ dcl*office*.bpl - для Office 2000, XP и 2010.

Вы уверены, что у вас нет ни того, ни другого? Затем поищите такие файлы на всем своем диске. По-прежнему не найден - запустите установку Delphi, измените и убедитесь, что вы действительно установили образцы компонентов автоматизации Office. Попробуйте использовать пакеты OfficeXP или Office2010 - они должны быть обратно совместимы с Office 2000 в соответствии с рекомендациями Microsoft COM.

Если все еще не найдено, вы можете сделать Компоненты / Импорт компонентов / Импорт ActiveX для Excel.

  1. Кроме того, мне интересно увидеть RxLib в вашем списке. Официально RxLib закончился с Delphi 5 и никогда не поддерживал Delphi6 +, вместо этого жертвуя проект JediVCL. Существовали неофициальные патчи (например, Polaris Software), но мне интересно, вложили ли они много поддержки в Unicode-версии Delphi. Даже J.E.D.I. сегодня остро не хватает рабочей силы.

  2. И еще раз, если вам нужно полноценное взаимодействие с Excel. Это дает вам доступ на уровне VBA к внутреннему дереву объектов Excel. Но это обременяет ваших пользователей необходимостью покупать и устанавливать Excel, а также довольно медленно. Если вы используете только ограниченное подмножество функций книги Excel, создание файлов XLSX в вашей программе может быть как быстрее, так и компактнее. По крайней мере, так мы перешли в нашем приложении. Теперь пользователи могут экспортировать электронные таблицы независимо от того, установлен ли Excel или какой-либо другой офис или вообще не установлен, и делать это намного быстрее.

person Arioch 'The    schedule 15.07.2020
comment
RegisterClass при инициализации не компилируется: [код] [Ошибка dcc32] uMatchFactDM.pas (6210): E2010 Несовместимые типы: 'tagWNDCLASSW' и 'класс TExcelApplication' [/ code] RxLib широко используется в коде, в частности TRxMemoryData . Я нашел версию, которая работает сейчас, не знаю где, это было несколько недель назад; но теперь эти таблицы памяти работают нормально. Я не решаюсь преобразовать их в таблицы FD, они постоянно сортируются (метод SortOnFields), и мне пришлось бы заменить весь этот код индексами. Если он не сломан, не чинить? - person Jur; 15.07.2020
comment
@jur - изменить порядок предложения USES или использовать квалифицированный вызов unitname.functionname. Вы пытаетесь вызвать RegisterClass из Windows, и вам нужен один из SysUtils или classes или что-то в этом роде, проверьте справку Delphi, в каком конкретном модуле он находится - сделайте это последним. Кроме того, это все еще плохой маршрут, не ходи туда. Вы сохраняете TExcelApplication параметры в исходниках DFM, но не видите их в GUI Form Designed, что означает, что они всегда могут быть неожиданно изменены или удалены. Не ходи туда. ИЛИ очистите файл DFM. Откройте файл DFM в блокноте или в конструкторе форм Delphi Alt + F12 или щелкните правой кнопкой мыши и просмотрите как текст - person Arioch 'The; 15.07.2020
comment
@Jur TJvMemoryDataset является особенно глючным и медленным (поскольку это делают все луковые слои TDataSet), у меня особенно были проблемы с наборами данных, имеющими 0 или 1 строку, попытка чтения из него была очень непоследовательной. Если у вас нет сложного поиска (сортировка по разным столбцам для разных сценариев использования) и все, что нужно вашему приложению, - это хранилище ключей / значений, подумайте о том, чтобы избавиться от него. Лично я переписал один класс, чтобы вместо него использовать TDictionary<integer {key}, record {values}>, и он стал намного быстрее и надежнее. Если вы это сделаете, вы можете вместо этого попробовать SQL в памяти (NexusDB, SQLite и т. Д.) - person Arioch 'The; 15.07.2020
comment
5. Да, верю; Фактически, пользователи вносят правки в Excel, затем возвращаются в мое приложение и нажимают кнопки для дальнейшей обработки (и, пожалуйста, не спрашивайте меня, почему именно; я не писал этот материал))) - person Jur; 15.07.2020
comment
@Jur Затем переустановите Delphi и убедитесь, что вы также установили компоненты Office. У нас есть устаревшее приложение Clarion, работающее таким образом, но оно использует DDE для отправки команд обратно из Excel, а не из COM :-) - person Arioch 'The; 15.07.2020
comment
при очистке dfm, что именно я очищаю, я имею в виду, от каких компонентов / свойств мне нужно избавиться? - person Jur; 15.07.2020
comment
вы удалили TExcelApplication из своих источников - удалите его из DFM. Но вам все же лучше исправить проблему загрузки IDE (принцип минимальных изменений, о котором вы говорили выше). На самом деле, такие инструменты, как GExperts и CnWizards, имеют кнопку преобразования компонента в код. Вы можете загрузить форму в Delphi 7, щелкнуть по ней и получить невизуальный код, создав объект и установив все свойства, которые не использовались по умолчанию в DFM. - person Arioch 'The; 15.07.2020
comment
лол, ну, вся причина, по которой этот проект вообще был начат, заключалась в том, что какой-то старый ПК (2005?), на котором был установлен Delphi-7, наконец перешел в компьютерный мир ... не знал, где теперь найти старый Delphi-7) )) И да, я уже удалил компонент ExcelApp из dfm (до того, как вообще сюда зайти) - person Jur; 15.07.2020
comment
I found a version that works now в основном вы говорите, что вытащили какой-то случайный мусор, который вы не можете проверить и понять, и у него даже нет некоторых разработчиков, которым вы могли бы задавать вопросы. Любой открытый исходный код - это ВАШ СОБСТВЕННЫЙ код по определению. Так что переход на полумертвый JediVCL, вероятно, будет лучше, чем использование снимка неизвестного происхождения с неизвестным качеством. Вы не можете диагностировать даже Delphi, который не загружает компоненты, как бы вы диагностировали ошибки с помощью этой неизвестной производной RxLib? Особенно технические ошибки со строками Unicode или Win64? Вот драконы, вы прокладываете дорогу в ад ... - person Arioch 'The; 15.07.2020
comment
1. Также вы можете попробовать FPC / Lazarus, возможно, дистрибутив PilotLogic (CodeTyphoon или что-то в этом роде). Казалось бы, не хуже Delphi 7 и он поддерживает живой проект. Конечно, в FPC нет ничего лучше BPL, но если вы их не используете - кого это волнует. // 2. После покупки Delphi у вас должен быть 6-месячный льготный период, и вы можете потребовать лицензионные коды для ЛЮБОЙ предыдущей версии Delphi от Delphi 7 к той, которую вы приобрели. По крайней мере, так было с XE2 и XE4. Проверьте это до истечения временного окна! Возьмите копию D7. // 3. Можно ли превратить старый компьютер в виртуальную машину? мы сделали, sysinternals disk2vhd - person Arioch 'The; 15.07.2020
comment
Дело принято. однако это экстренное преобразование с ограниченными ресурсами, и его просто нужно как можно скорее запустить и снова запустить. Так что да, было бы лучше пойти по длинному пути и сделать это должным образом (и мне МОЖЕТ быть позволено сделать это позже), но пока я делаю только то, что АБСОЛЮТНО необходимо, чтобы восстановить его ... и Кажется, что эти мемтаблицы ДЕЙСТВИТЕЛЬНО работают. - person Jur; 15.07.2020
comment
В случае крайней необходимости - и вы приобрели последнюю версию Delphi, попробуйте получить ВСЕ коды активации и установочные пакеты для ВСЕХ предыдущих версий. На 99% они вам никогда не понадобятся, но остается 1%. - person Arioch 'The; 15.07.2020
comment
передано в компьютерный мир - что конкретно вы имеете в виду, нет ли шанса, что вы можете заставить старый жесткий диск запускаться хотя бы один раз для сеанса disk2vhd? Кроме того, VirtualBox может запускать диски VHD, но не VHDX. - person Arioch 'The; 15.07.2020
comment
Любой открытый исходный код - это ВАШ СОБСТВЕННЫЙ код по определению. Это определенно не так! Что насчет авторского права на признание и т. Д. - person MartynA; 15.07.2020
comment
@MartynA: Я говорил о технической стороне и обязанностях программиста перед своей компанией и пользователями своей программы. Что касается авторских прав, то номинально они есть, но практически их так много, что упоминать их все нецелесообразно. См. Раздел 2/3 BSD и см. XFree86 vs X.org :-) - person Arioch 'The; 15.07.2020
comment
С уважением, слово, которое вы использовали, является собственным и не имеет никакого отношения к происхождению. Я предлагаю вам правильно понять свои факты ... - person MartynA; 15.07.2020
comment
disk2vhd session - как вы, наверное, уже поняли, у меня недостаточно технических знаний, чтобы понять вас. Да, HDD жив, но уже не загрузочный. Я решил, что несколько аппаратных разработчиков нашли способ виртуализировать его и сделать его снова загрузочным, чтобы можно было запустить Deplhi-7, но они сказали мне, что либо это невозможно, либо процесс настолько сложен, что я не смог понять даже терминологию. они использовали ... и учитывая нехватку времени (и в любом случае общую ценность наличия этого в текущей версии Delphi), этот путь казался проще. - person Jur; 15.07.2020
comment
@MartynA Я не могу редактировать старый комментарий, и даже формально Юр теперь является соавтором производной RxLibrary, которую он установил в своем Delphi (и изменил несколько байтов здесь и там во время установки). Так что да, у него такие же права и обязанности по отношению к этой производной, как и у всех других неизвестных авторов. Но он известен и у него есть обязанности перед пользователями и начальством, которых нет у других неизвестных соавторов. По сути, он только что сделал форк и теперь является его единственным автором / сопровождающим. Он владеет им. - person Arioch 'The; 15.07.2020
comment
см. последний пример dict.org/bin/Dict?Form=Dict2&Database= gcide & Query = own - предоставить; сознавать; признать правду; признаваться; узнавать в определенном персонаже; поскольку мы признаем, что лишились вашей любви. - Юру определенно принадлежит только что созданный форк RxLib и ВСЕ ошибки, преднамеренные или непреднамеренные, которые он содержит. - person Arioch 'The; 15.07.2020
comment
@Jur not bootable означает больше проблем с программным обеспечением Windows и т. Д. Таким образом, похоже, что не компьютер попал в рай, а Windows попала в рай, и у вас нет сохраненной копии этой Windows. В любом случае, если у вас возникла чрезвычайная ситуация и у вас нет опыта, вам лучше меняться как можно меньше. Это означает использование Delphi 7 и точно такого же набора компонентов и источников! Итак, установите Delphi 7 - купленный вместе с вами Delphi Rio или восстановленный со старого жесткого диска и работайте в D7there. Последний путь, вероятно, потребует от вас незаконной активации D7 на новом оборудовании. Лучше всего исправить старую загрузку Windows - person Arioch 'The; 15.07.2020
comment
Лично я бы 1) использовал Disk2VHD, чтобы сделать эталонную неизменяемую копию вашего старого жесткого диска в качестве последнего известного надежного эталонного снимка данных. Сохраните хэши MD5 / SHA256, чтобы обнаружить любые возможные изменения. И сделать несколько его копий на разные носители (новый HDD, DVD-R хорошего производителя, но не SSD / flash) и хранить в разных домах. Я бы предпочел старый тупой формат VHD вместо VHDX, потому что это известно большему количеству стороннего программного обеспечения. 2) сделайте копии файлов VHD и работайте с копиями, чтобы сделать старую загрузку Windows в Hyper-V, VirtualBox или любом другом проигрывателе виртуальных машин. - person Arioch 'The; 15.07.2020
comment
Какая винда там была на самом деле? если 2000 / XP, то шансы просто найти тот же самый дистрибутив Windows и установить его на старый диск, я притворяюсь, что обновляю режим Windows, может это исправить. НО вы проводите эксперименты только с расходными копиями, а не с ФИКСИРОВАННЫМ эталоном, который вы делаете, чтобы не работать над ним. Данные, которые у вас есть только один раз, - это данные, которых у вас на самом деле нет. - person Arioch 'The; 15.07.2020
comment
Ой, это выше моей головы ... Я просто функциональный парень, которому поручено это, потому что разработчики - люди Visual Studio / MVC / C # / Javascript, которые отказались это сделать, и я единственный, кто когда-то работал с Delphi ... но БОЛЬШОЕ СПАСИБО вам обоим за то, что все равно пытались мне помочь !! - person Jur; 15.07.2020
comment
Родной программин близок к голому железу, радуйтесь! вы тоже станете вставлять и извлекать аппаратные части из коробки :-) Но я дал вам пути для изучения, которые я считаю более эффективными и безопасными. Итак, начните их обоих сейчас и учитесь по ходу дела. Надеюсь, на вашем новом ПК есть место для клонирования старого жесткого диска в файл формата VHD (не забудьте сделать файл доступным только для чтения и сохранить подписи md5 / sha256), тогда ваше начальство должно предоставить вам надежные и многоместные хранилища для этот клон. А затем установите новый Delphi 7 на свой новый компьютер, параллельно решая проблему с загрузкой Windows NNN. - person Arioch 'The; 15.07.2020
comment
хе да, я, скорее всего, вернусь, если только я не вернусь к своей обычной работе по участию в обсуждениях, отображаются ли идентификаторы сотрудника или нет (3-часовая встреча) или цвет кнопки обновления (зеленая или синяя, 2-часовая встреча ) - person Jur; 15.07.2020