Вызов в среде AutoCAD приложения, написанного на Delphi и использующего базу данных
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вызов в среде AutoCAD приложения, написанного на Delphi и использующего базу данных

Вызов в среде AutoCAD приложения, написанного на Delphi и использующего базу данных

Ответ
Поиск в этой теме
Непрочитано 06.10.2010, 18:36 #1
Вызов в среде AutoCAD приложения, написанного на Delphi и использующего базу данных
samos
 
Регистрация: 16.06.2010
Сообщений: 43

Здравствуйте!
Программа, написанная на Delphi, использует таблицы Paradox и BDE. Отлажена и давно эксплуатируется.
Alias не используется.
Все таблицы базы данных находятся в той же директории, где и исполняемый файл (назовем его X).
Сейчас потребовалось запустить программу из среды AutoCad.
Использую функцию startapp:
(startapp "X").
Программа запускается нормально, функция возвращает 33.
В процессе исполнения программы, когда в свойству Active таблицы TTable присваивается значение true, происходит аварийное завершение программы с сообщением:
Table does not exist.
File or directory not exist.
File: c:\Documents and Setting\V\Мои документы\c.db
Не могу понять, в чем дело?
Даже если свойство TTable.TableName прописываю с явным указанием пути к к таблице, все равно в аварийном сообщении идет ссылка на папку \Мои документы.
Заранее благодарен за помощь в решении проблемы.
Просмотров: 10111
 
Непрочитано 06.10.2010, 18:56
#2
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Таблица ищется в рабочей папке, коей является "c:\Documents and Setting\V\Мои документы\". надо переписать чтоб искалась по
Код:
zamtmn вне форума  
 
Автор темы   Непрочитано 06.10.2010, 19:18
#3
samos


 
Регистрация: 16.06.2010
Сообщений: 43


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Таблица ищется в рабочей папке, коей является "c:\Documents and Setting\V\Мои документы\". надо переписать чтоб искалась по
Код:
То, что таблица ищется в папке c:\Documents and Setting\V\Мои документы\ мне понятно.
Непонятно, что надо переписать - вызов функции или программу на Delphi?
samos вне форума  
 
Непрочитано 06.10.2010, 20:01
#4
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Цитата:
Использую функцию startapp:
(startapp "X")
Рабочая папка тут не указывается, автокад ее подсовывает свою. Ваша программа в уверенности что рабочая папка - та где лежит ее exe и другие файлы ищет базу там где ее нет.

Нормальное решение: переписать программу на Delphi чтоб она работала не зависимо от текущей рабочей папки.
Костыли:
Поискать другой способ запуска в автокаде (если он есть).
Запускать заглушку, которая запустит вашу программу настроив правильно рабочую папку
zamtmn вне форума  
 
Автор темы   Непрочитано 06.10.2010, 20:17
#5
samos


 
Регистрация: 16.06.2010
Сообщений: 43


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Рабочая папка тут не указывается, автокад ее подсовывает свою. Ваша программа в уверенности что рабочая папка - та где лежит ее exe и другие файлы ищет базу там где ее нет.

Нормальное решение: переписать программу на Delphi чтоб она работала не зависимо от текущей рабочей папки.
Костыли:
Поискать другой способ запуска в автокаде (если он есть).
Запускать заглушку, которая запустит вашу программу настроив правильно рабочую папку

Если делаю вызов функции с параметром:
(startapp "X" "c:\\Y\\"), то тем самым явно передаю в программу на Delphi путь к директории, где размещены таблицы базы данных.
В программе на Delphi ставлю:
dir:=ExtractFilePath(ParamStr(0))
и тем самым этот путь получаю.
Но Вы, вероятно не обратили внимания, но то, о чем я писал сначала (цитирую):
"Даже если свойство TTable.TableName прописываю с явным указанием пути к к таблице, все равно в аварийном сообщении идет ссылка на папку \Мои документы".
То есть мне путь в строке dir ни к чему. Я и так для TTable его указываю явно.
samos вне форума  
 
Непрочитано 06.10.2010, 20:29
#6
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


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

Если вы еще этого не сделали...
gomer вне форума  
 
Непрочитано 06.10.2010, 20:29
#7
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


ParamStr(0) - путь к запущенному exe. c:\\Y\\ - это будет ParamStr(1) если мне не изменяет память

Цитата:
Но Вы, вероятно не обратили внимания, но то, о чем я писал сначала (цитирую):
"Даже если свойство TTable.TableName прописываю с явным указанием пути к к таблице, все равно в аварийном сообщении идет ссылка на папку \Мои документы".
Обратил, но это вопрос для форума по делфи и базам данных. ИМХО ошибка в программе, гдето вы ищете базу не по
Код:
[Выделить все]
ExtractFilePath(ParamStr(0))+dbName
, а просто по
Код:
zamtmn вне форума  
 
Автор темы   Непрочитано 06.10.2010, 20:46
#8
samos


 
Регистрация: 16.06.2010
Сообщений: 43


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Обратил, но это вопрос для форума по делфи и базам данных. ИМХО ошибка в программе, гдето вы ищете базу не по
Когда я запускаю программу из среды Delphi или из проводника, все работает нормально. В свойстве TTable.TableName может быть прописан полный путь к таблице или просто указана таблица, не имеет значения.
Когда же запуская программу с использованием StartApp, даже если путь передаю через параметр и подключаю к TTable.TableName, все равно идет ошибка. Правильность передачи по параметру проверял, все передается правильно.
Не пойму, где проблема? Все-таки, без вызова из AutoCad-а, все работает...
samos вне форума  
 
Непрочитано 06.10.2010, 20:57
#9
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Цитата:
Когда я запускаю программу из среды Delphi или из проводника, все работает нормально
В этом случае (рабочая папка)=(папка с exe)
Цитата:
Не пойму, где проблема? Все-таки, без вызова из AutoCad-а, все работает...
а в этом случае (рабочая папка)<>(папка с exe) больше разницы никакой нет. попробуйте запустить из проводника, находясь в другой папке и введя полный путь с:\путь\к\программе\прога.exe, должна появиться таже ошибка
zamtmn вне форума  
 
Автор темы   Непрочитано 06.10.2010, 21:26
#10
samos


 
Регистрация: 16.06.2010
Сообщений: 43


Цитата:
Сообщение от zamtmn Посмотреть сообщение
В этом случае (рабочая папка)=(папка с exe)

а в этом случае (рабочая папка)<>(папка с exe) больше разницы никакой нет. попробуйте запустить из проводника, находясь в другой папке и введя полный путь с:\путь\к\программе\прога.exe, должна появиться таже ошибка
Вы совершенно правы!
Запуская программу из другой папки, возникает такая же ошибка, но в аварийном сообщении уже указывается не Мои Документы, а та папка из которой делал вызов. И это несмотря на то, что в свойстве TTabble.TableName явно прописываю путь к папке, где лежат файлы базы данных.
Так и не могу понять, как же решить проблему. Кроме, как использовать TableName ни до чего не дохожу.
samos вне форума  
 
Непрочитано 06.10.2010, 21:43
#11
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Цитата:
И это несмотря на то, что в свойстве TTabble.TableName явно прописываю путь к папке, где лежат файлы базы данных.
Ну если у Вас всё верно, а база по прежнему ищется не там, попробуйте сами установить рабочую папку.
чтото навроде:
Код:
[Выделить все]
uses .....,windows;
..........
begin
..........
SetCurrentDirectory(@ExtractFilePath(ParamStr(0))[1]);
.........
должно помочь

Последний раз редактировалось zamtmn, 06.10.2010 в 21:48.
zamtmn вне форума  
 
Непрочитано 06.10.2010, 21:49
#12
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от samos Посмотреть сообщение
То, что таблица ищется в папке c:\Documents and Setting\V\Мои документы\ мне понятно.
Непонятно, что надо переписать - вызов функции или программу на Delphi?
Как вариант - попробуйте добавить в каталоги поиска AutoCAD путь к каталогу, в котором лежат ваши таблицы (диалоговое окно Options, вкладка Files, группа Support File Search Path).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 06.10.2010, 22:04
#13
samos


 
Регистрация: 16.06.2010
Сообщений: 43


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Ну если у Вас всё верно, а база по прежнему ищется не там, попробуйте сами установить рабочую папку.
чтото навроде:
Код:
[Выделить все]
uses .....,windows;
..........
begin
..........
SetCurrentDirectory(@ExtractFilePath(ParamStr(0))[1]);
.........
должно помочь

Замечательно! Все заработало.
Большое спасибо всем, особенно zamtmn !
samos вне форума  
 
Непрочитано 06.10.2010, 22:24
#14
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


>samos
Мне любопытно - тот вариант, который я предложил не сработал?
Цитата:
попробуйте сами установить рабочую папку.
При таком подходе нужно каждый раз при запуске команды устанавливать рабочую папку, т.к. если в процессе работы автокада юзер через диалоговое окно выберет какой-нить файл (например откроет чертёж) - то рабочий каталог станет другим. Я поэтому и предложил добавить путь к каталогам поиска.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 06.10.2010, 22:30
#15
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Цитата:
Мне любопытно - тот вариант, который я предложил не сработал?
Автокад тут непричем, запускается сторонее exe приложение
Цитата:
При таком подходе нужно каждый раз при запуске команды устанавливать рабочую папку, т.к. если в процессе работы автокада юзер через диалоговое окно выберет какой-нить файл (например откроет чертёж) - то рабочий каталог станет другим. Я поэтому и предложил добавить путь к каталогам поиска.
Папка устанавливается для процесса delphi приложения, на автокад эти действия не влияют. Страшного в этом ничего нет, хотя не очень красиво, согласен. Но уж раз ошибок в коде у автора не найдено (чтото подсказывает что они есть ), другого выхода нет
zamtmn вне форума  
 
Непрочитано 06.10.2010, 22:35
#16
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от hwd Посмотреть сообщение
т.к. если в процессе работы автокада юзер через диалоговое окно выберет какой-нить файл (например откроет чертёж) - то рабочий каталог станет другим.
У каждого процесса свой рабочий каталог. Так что вне зависимости от того какой рабочий каталог будет в AutoCAD в запущенном приложении может быть свой рабочий каталог и изменение его в приложении не поменяет рабочий каталог AutoCAD. А вот .NET-сборкой можно изменить рабочий каталог AutoCAD, т.к. она (.NET-сборка) выполняется в рамках процесса AutoCAD.
Добавление каталога к путям доступа AutoCAD для exe-приложения - это как мертвому припарки. Ну никак это приложение в этих путях доступа искать не будет. А ошибка в коде автора явно есть.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 06.10.2010, 22:50
#17
samos


 
Регистрация: 16.06.2010
Сообщений: 43


Цитата:
Сообщение от hwd Посмотреть сообщение
>samos
Мне любопытно - тот вариант, который я предложил не сработал?

При таком подходе нужно каждый раз при запуске команды устанавливать рабочую папку, т.к. если в процессе работы автокада юзер через диалоговое окно выберет какой-нить файл (например откроет чертёж) - то рабочий каталог станет другим. Я поэтому и предложил добавить путь к каталогам поиска.

Ваш вариант пока не рассматривал, завтра на свежую голову попробую.
Вообще-то, программа моя не имеет прописки в реестре.
Теперь хочу прописывать ее при инсталляции.
Перед запуском из AutoCad в LISP-е из реестра по HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ по имени программы вытаскивать папку, в которой она установлена и использовать этот путь в качестве параметра при вызове (startapp путь+"X"). Пока такая мысль, может опять что не так, завтра буду пробовать.
samos вне форума  
 
Непрочитано 07.10.2010, 11:28
#18
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


1. Надо переписывать дельфийскую программу. Самое лучшее - избавиться от древнего, давным-дано не поддерживаемого BDE и перейти на ADO.

2. Заодно забыть про Paradox, перевести данные в другую БД. Если это локальная база - лучше всего в MDB (Access).

3. Забыть про работу с таблицами, как физическими файлами и работать с базой данных и её таблицами, как объектами базы данных.

4. Не передавать имена файлов через параметры командной строки. Тем более не располагать БД рядом с EXE и не пытаться до нее добраться через Paramsr(0).

5. Не привязываться ни к какой "текущей директории"

6. Физическое расположение БД должно быть в настройках программы. Это уж по желанию и умению. Можно и в реестре, можно и в INI-файле программы, который должен лежать в положенном месте (желательно вычисляемом). Вот в этих настройках и могут быть расписаны все тонкости работы с БД. Может быть и ссылка не на саму БД, а на файл соединения, который создается и редактируется штатными средствами.

Все здесь описанное есть в Demos Delphi. Все средства для работы есть в штаных компонентах, а особо удобные - в дополнительных бесплатных библиотеках.

Если же хочется как следует помучиться много лет - все написанное можно игнорировать.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 07.10.2010, 14:01
#19
samos


 
Регистрация: 16.06.2010
Сообщений: 43


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
1. Надо переписывать дельфийскую программу. Самое лучшее - избавиться от древнего, давным-дано не поддерживаемого BDE и перейти на ADO.

2. Заодно забыть про Paradox, перевести данные в другую БД. Если это локальная база - лучше всего в MDB (Access).

3. Забыть про работу с таблицами, как физическими файлами и работать с базой данных и её таблицами, как объектами базы данных.

4. Не передавать имена файлов через параметры командной строки. Тем более не располагать БД рядом с EXE и не пытаться до нее добраться через Paramsr(0).

5. Не привязываться ни к какой "текущей директории"

6. Физическое расположение БД должно быть в настройках программы. Это уж по желанию и умению. Можно и в реестре, можно и в INI-файле программы, который должен лежать в положенном месте (желательно вычисляемом). Вот в этих настройках и могут быть расписаны все тонкости работы с БД. Может быть и ссылка не на саму БД, а на файл соединения, который создается и редактируется штатными средствами.

Все здесь описанное есть в Demos Delphi. Все средства для работы есть в штаных компонентах, а особо удобные - в дополнительных бесплатных библиотеках.

Если же хочется как следует помучиться много лет - все написанное можно игнорировать.

Спасибо Вам за рекомендации!
Спорить с вышесказанным бессмысленно. В отношении игнорировать - вопрос не простой. Я себя профессиональным программистом не считаю, специальность у меня другая. Но последнее время приходится заниматься программированием. Очень трудно отойти от того стиля к которому привык, который кажется понятным, и когда программы работают хорошо и достаточно надежно. Но вот встретилась ситуация, с которой не смог разобраться. Спасибо, мир не без добрых людей!
В отношении ухода от Paradox и BDE. Мои программы предназначены для работы с локальной базой данных. Клиент-серверные технологии здесь ни к чему, хотя можно было бы уйти от TTable и перейти на SQL.
Вопрос в том, что не вижу альтернативы Paradox-у, как единственной бесплатной базе данных. Использовать Access - это значит поставить пользователя перед необходимостью иметь лицензию на MS Office. А вот этого мне и не хотелось бы. То же самое можно сказать и о SQL-серверах. Все приличные SQL-серверы стоят немалых денег. Может быть я ошибаюсь в отношении Paradox и BDE, но эта связка, мне кажется, не требует дополнительных затрат. Если ошибаюсь, поправьте, пожалуйста!
samos вне форума  
 
Непрочитано 07.10.2010, 14:12
#20
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от samos Посмотреть сообщение
Вопрос в том, что не вижу альтернативы Paradox-у, как единственной бесплатной базе данных. Использовать Access - это значит поставить пользователя перед необходимостью иметь лицензию на MS Office. А вот этого мне и не хотелось бы. То же самое можно сказать и о SQL-серверах. Все приличные SQL-серверы стоят немалых денег. Может быть я ошибаюсь в отношении Paradox и BDE, но эта связка, мне кажется, не требует дополнительных затрат. Если ошибаюсь, поправьте, пожалуйста!
На выбор:
  1. MS SQL Server Express Edition
  2. PostgreSQL
  3. My SQL
  4. Open Office - в нём есть некий аналог MS Access - приложение Base
Если к базе данных одновременно должны коннектиться более 10 человек - использовать MS Access не очень хорошее решение, об этом пишут в толстых книжках (со временем начнёт ощущаться существенное снижение скорости работы).
Имхо - лучше заюзать 1-й вариант, т.к. такие базы данных вы без проблем, при необходимости, всегда сможете перекинуть на более мощные платные версии.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вызов в среде AutoCAD приложения, написанного на Delphi и использующего базу данных



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Документация Проектировщику на Torrents DEM Разное 263 03.09.2024 12:25
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
В русской версии AutoCAD 2010 SP1 32-bit файл Acad.PGP содержит ошибки. hwd Баги и пожелания в Autodesk 21 21.04.2010 20:27
Информация по идентификационным кодам программ в сетевых лицензиях Autodesk KSI AutoCAD 1 14.09.2009 15:59