Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 387

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Поставлена передо мной задача по созданию небольшой базы данных на компьютере коллеги по работе. Загвоздка в чем: писать я ее буду дома, а работать она должна у него. Перерыл все имеющиеся талмуды дома, толком никакой информации нет, кроме как намеков на некие инсталяционные пакеты и т.д.
Вот несколько вопросов, от которых напрямую зависит структура программы:
1. Как перенести программу на другой компьютер, если все ссылки на файлы внутри программы собьются?
2. Какие именно файлы нужно переносить? Только .ехе и файлы таблиц или что-то еще?
3. Как исправлять ошибки и обновлять программный код? На ум приходит только использование dll-библиотек.
Если данный вопрос слишком глобален, может подскажете ссылку на хорошую статью в этом напрвлении? Спасибо.

Waserd Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Waserd (статус: Посетитель)
Вопрос отправлен: 10 ноября 2009, 19:02
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Waserd!
Если использовать BDE, то да, проблем для начинающего может быть много. Но достаточно перейти на ADO+Access, как проблемы решаются сами собой. Вам надо будет MS Access, что бы удобно редактировать базу, а вот человеку с той стороны нужна просто чистая XP или старше, всё остальное уже есть. Вторая проблема - это прописать относительные пути, а не прямые.
Итого человеку будет нужна собственно сама программа (exe файл) и mdb файл. ну и может быть какие то сопутствующие файлы (файлы конфигураций, ресурсы, мало чего там придумаете)
Для мелких проектов - удобно. И отличия от учебников минимальны - заменяем TTable на TADOTable и тому подобное.

Как второй вариант - можно использовать SQLite. Ему нужна только его dll и больше никаких настроек - Знакомство с SQLite.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 10 ноября 2009, 19:14

Ответ #2. Отвечает эксперт: МиГрАф

Здравствуйте, Waserd!
В Delphy я поступаю так. В директории ./data/ сохраняю все таблицы БД. Пути к таблицам прописываю ./data. В MainForm добавляю:
implementation
uses DataModule;
{$R *.DFM}
{&I 'usa.btl'}
{&I 'blw32.dll'}
{&I 'charset.cvb'}
{&I 'idapi32.dll'}
{&I 'idpdx32.dll'}
{&I 'idr20009.dll'}
{&I 'bantam.dll'}
В DataModule - описана структура и таблицы базы данных и все процедуры работы с ней (личные). Файлы подключаемых библиотек должны быть в директории загружаемого файла Main.exe. Все это (Main.exe, директорию Data и файлы подключаемых библиотек) копируем на другую машину и все работает. Проверено на Windows 95...Vista.
Если будут вопросы, рад помочь.

Ответ отправил: МиГрАф (статус: 1-ый класс)
Время отправки: 10 ноября 2009, 22:10

Ответ #3. Отвечает эксперт: Fantom

Здравствуйте, Waserd!
ИСпользуй Smart Instal для установки программы на другой комп. Чтобы прописать свою базу можно использовать ini файлы - в смарте есть опция такая или через собственные ключи реестра. А можно проще (я обычно так и делаю)- код внизу. кстати есть статейка как создать свой инсталер на дельфи, т.е в твоей программе пишешь сразу и програму и инсталлер. Ноя что то её не понял тяжеловатая. но все равно выкладываю. :))

Приложение:
  1.  
  2. procedure TForm1.FormActivate(Sender: TObject);
  3. begin
  4. with Session do
  5. begin
  6. ConfigMode := cmSession;
  7. try
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17. ExtractFilePath(ParamStr(0))+'DATA',
  18. 'PARADOX');
  19.  
  20. finally
  21. ConfigMode := cmAll;
  22. end;
  23. end;
  24. end;
  25.  
  26.  
  27.  
  28.  
  29. unit Main;
  30.  
  31. interface
  32.  
  33. uses
  34. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  35. StdCtrls, ComCtrls, FileCtrl, ExtCtrls, DdeMan, LZEXPAND, ShellApi;
  36.  
  37. type
  38. TFMain = class(TForm)
  39. EP: TEdit;
  40. PBar: TProgressBar;
  41. Label1: TLabel;
  42. Label2: TLabel;
  43. Image1: TImage;
  44. Label3: TLabel;
  45. Label5: TLabel;
  46. Label6: TLabel;
  47. CBR: TCheckBox;
  48. LEnd: TLabel;
  49. procedure BOkClick(Sender: TObject);
  50. procedure BExitClick(Sender: TObject);
  51. procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  52. procedure FormCreate(Sender: TObject);
  53. procedure EndCl(Sender: TObject);
  54.  
  55. private
  56. { Private declarations }
  57. public
  58. { Public declarations }
  59. procedure Decomp;
  60. end;
  61.  
  62. var
  63. FMain: TFMain;
  64.  
  65.  
  66.  
  67. Command, Params, WorkDir : String;
  68. implementation
  69.  
  70. {$R *.DFM}
  71.  
  72. procedure TFMain.Decomp;
  73. var
  74. FIStruct, FOStruct : TOFStruct;
  75. HandleFOpen, HandleFWrite : Integer;
  76. success : LongInt;
  77. begin
  78. StringFOName:=ToK+StringFOName;
  79.  
  80. HandleFOpen := LZOpenFile(@StringFIName[1], FIStruct, OF_READ or OF_PROMPT);
  81. if HandleFOpen < 0 then
  82.  
  83. [mbOk], 0);
  84. // Open the Output File that is Uncompressed!
  85. HandleFWrite := LZOpenFile(@StringFOName[1], FOStruct, OF_CREATE);
  86. if HandleFWrite < 0 then
  87.  
  88.  
  89. success := LZCopy(HandleFOpen, HandleFWrite);
  90. if success < 0 then
  91.  
  92.  
  93. LZClose(HandleFOpen);
  94. LZClose(HandleFWrite);
  95.  
  96. end;
  97.  
  98. procedure TFMain.BOkClick(Sender: TObject);
  99. begin
  100.  
  101. if DirectoryExists(Tok)=false then
  102. begin
  103. ForceDirectories(ToK);
  104. ForceDirectories(ToK+'Graphics');
  105. ForceDirectories(ToK+'Help');
  106. ForceDirectories(ToK+'Music');
  107. ForceDirectories(ToK+'Levels');
  108. end;
  109. EP.Hide;
  110. Label3.Hide;
  111. CBR.Hide;
  112. PBar.Show;
  113. StringFIName:='ws01.dat'+#0;StringFOName:='WinSoco.exe'+#0;Decomp;
  114. StringFIName:='ws02.dat'+#0;StringFOName:='Graphicsgraphic1.bmp'+#0;Decomp;
  115. StringFIName:='ws03.dat'+#0;StringFOName:='Graphicsgraphic2.bmp'+#0;Decomp;
  116. StringFIName:='ws04.dat'+#0;StringFOName:='Graphicsgraphic3.bmp'+#0;Decomp;
  117. StringFIName:='ws05.dat'+#0;StringFOName:='Helpwinsoco.hlp'+#0;Decomp;
  118. StringFIName:='ws06.dat'+#0;StringFOName:='Musicbox.wav'+#0;Decomp;
  119. StringFIName:='ws07.dat'+#0;StringFOName:='Musicdone.wav'+#0;Decomp;
  120. StringFIName:='ws08.dat'+#0;StringFOName:='Musicrespect.mid'+#0;Decomp;
  121. StringFIName:='ws09.dat'+#0;StringFOName:='Musicsong1.mid'+#0;Decomp;
  122. StringFIName:='ws23.dat'+#0;StringFOName:='Musicsong2.mid'+#0;Decomp;
  123. StringFIName:='ws24.dat'+#0;StringFOName:='Musicstep.wav'+#0;Decomp;
  124. StringFIName:='ws10.dat'+#0;StringFOName:='LevelsSt10.lev'+#0;Decomp;
  125. StringFIName:='ws11.dat'+#0;StringFOName:='LevelsSt1.lev'+#0;Decomp;
  126. StringFIName:='ws12.dat'+#0;StringFOName:='LevelsSt2.lev'+#0;Decomp;
  127. StringFIName:='ws13.dat'+#0;StringFOName:='LevelsSt3.lev'+#0;Decomp;
  128. StringFIName:='ws14.dat'+#0;StringFOName:='LevelsSt4.lev'+#0;Decomp;
  129. StringFIName:='ws15.dat'+#0;StringFOName:='LevelsSt5.lev'+#0;Decomp;
  130. StringFIName:='ws16.dat'+#0;StringFOName:='LevelsSt6.lev'+#0;Decomp;
  131. StringFIName:='ws17.dat'+#0;StringFOName:='LevelsSt7.lev'+#0;Decomp;
  132. StringFIName:='ws18.dat'+#0;StringFOName:='LevelsSt8.lev'+#0;Decomp;
  133. StringFIName:='ws19.dat'+#0;StringFOName:='LevelsSt9.lev'+#0;Decomp;
  134. StringFIName:='ws20.dat'+#0;StringFOName:='LevelsSt11.lev'+#0;Decomp;
  135. StringFIName:='ws21.dat'+#0;StringFOName:='LevelsSt12.lev'+#0;Decomp;
  136. StringFIName:='ws22.dat'+#0;StringFOName:='LevelsSt13.lev'+#0;Decomp;
  137. StringFIName:='ws25.dat'+#0;StringFOName:='ReadMe.txt'+#0;Decomp;
  138. //-------------------------
  139. Command:= 'notepad.exe';
  140. WorkDir:= 'C:windows';
  141. Params:=ToK+'ReadMe.txt';
  142. ShellExecute( Handle,'open',@Command[1],@Params[1],@WorkDir[1],SW_SHOWNORMAL);
  143. CBR.Visible:=true;
  144. LEnd.Visible:=true;
  145.  
  146. Label1.Visible:=false;
  147. Label2.Visible:=false;
  148. Label3.Visible:=false;
  149. EP.Visible:=false;
  150. PBar.Visible:=false;
  151.  
  152. end;
  153.  
  154. procedure TFMain.BExitClick(Sender: TObject);
  155. begin
  156. Close;
  157. end;
  158.  
  159. procedure TFMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  160. begin
  161. if SEnd=false then
  162. begin;
  163.  
  164.  
  165. CanClose:=true
  166. else CanClose:=false;
  167. end;
  168. end;
  169.  
  170. procedure TFMain.FormCreate(Sender: TObject);
  171. begin
  172. SEnd:=false;
  173. end;
  174.  
  175. procedure TFMain.EndCl(Sender: TObject);
  176. begin
  177. if CBR.Checked=true then
  178. begin
  179. chdir(ToK);
  180. command:= 'winsoco.exe';
  181. WorkDir:=ToK;
  182. Params:='';
  183. ShellExecute( Handle,'open',@Command[1],@Params[1],@WorkDir[1],SW_SHOWNORMAL);
  184. end;
  185.  
  186. SEnd:=true;
  187. Close;
  188. end;
  189.  
  190. end.
  191.  
  192.  


Ответ отправил: Fantom (статус: 2-ой класс)
Время отправки: 12 ноября 2009, 13:23


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 10 ноября 2009, 22:49; участников в обсуждении: 2.
VJe@n

VJe@n (статус: 1-ый класс), 10 ноября 2009, 22:43 [#1]:

1. Солидарен с Вадим К, в вашем случае нужно использовать легко переносимые базы: SQLite, FireBird, и т.п. Файлов в таком случае получается минимум: ексешник программы, dll-ка базы (sqlite.dll), и сама база (если нужны первоначальные данные). Использование BDE, Access, MySQL, повлечет за собой трудности в виде различий версий пакетов, и их установки на компьютере коллеги.
2. Что качается переносимости, достаточно запаковать нужные файлы в SFX-архив (ZIP, RAR, 7Z) и передать программу одним архивом.
3. Это уже по желанию, но не обязательно. Можно, конечно, разместить формы/отчеты по dll, но это усложнит поиск ошибок в коде и откладку.

У меня сегодня радость!
Я сегодня сделал гадость! :)

Вадим К

Вадим К (статус: Академик), 10 ноября 2009, 22:47 [#2]:

to VJe@n
по словом "переносимость" обычно понимают немного другое.
Галочка "подтверждения прочтения" - вселенское зло.
VJe@n

VJe@n (статус: 1-ый класс), 10 ноября 2009, 22:49 [#3]:

к словам можно не придираться ;) вроде и так понятно про что речь :)

У меня сегодня радость!
Я сегодня сделал гадость! :)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.02 сек.