Консультация № 136601
13.05.2008, 09:27
0.00 руб.
0 3 3
Уважаемые эксперты!

У меня такая проблема: программа написана на Delphi 7, формат базы данных MS Access. Создаю установочный диск с помощью пакета InstallShieldExpress, переношу программу на другой компьютер, запускаю её и выходит сообщение, что не найден мой файл Acceess (Он у меня находится на компьютере, где я создавала программу в папке «Мои документы»). Перенесла на другой ПК в эту же папку («Мои документы») этот файл (MS Access), но сообщение всё равно выходит. При попытке закрыть это сообщение программа всё-таки запускается, но в ней нет никаких данных. Пробовала создавать файл запуска в других программах инсталляции, но результат всё тот же. Подскажите, пожалуйста в чём моя ошибка?
Заранее благодарю – Людмила.

Обсуждение

Неизвестный
13.05.2008, 09:36
общий
это ответ
Здравствуйте, Паршина Людмила Леонидовна!
Я предпологаю все дело в пути к файлу, попробуйте создать в папке с программой одну папочку куда и положите свой файл, и потом измените путь к файлу БД. Лучше всего использовать относительные пути, к примеру воспользоваться функцией ExtractFilePatch(ApplikationExeName)+‘\db\databasename.mdb‘
Удачи
Неизвестный
13.05.2008, 09:37
общий
это ответ
Здравствуйте, Паршина Людмила Леонидовна!
Проблема в том, что папка "Мои документы" в системе Windows XP, физически расположена в личном каталоге пользователя, то есть, если имя пользователя на разных компьютерах не совпадает, то маршрут к папке "Мои документы" будет разным. Рекомендую расположить файл с базой данных например в папку "Program Files". Так же Вы можете воспользоваться процедурой определения месторасположения программы, и в коде программы задавать маршрут расположения базы данных. Примеры в приложении.

Приложение:
//////////////////////////////////////////////////////////////////////////////////// ФУНКЦИЯ: PrgDir//// НАЗНАЧЕНИЕ: Возвращает путь директории из которой была запущена программа.//Function PrgDir(): String;var szFileName : array[0..255] of char; FilePut: String[255]; szModuleName : array[0..19] of char; iSize : integer; J: integer; //Счетчикbegin StrPCopy(szModuleName, ‘NameOfModule‘); iSize := GetModuleFileName(GetModuleHandle(szModuleName),szFileName, SizeOf(szFileName)); if iSize > 0 then begin FilePut := StrPas(szFileName); FilePut := ExtractFilePath(StrPas(szFileName)); //Проверим функцию... PrgDir := FilePut; end else begin MessageDlg(‘Ошибка при определении директории, из которой запущена программа!‘,mtError,[mbOK],0); end;end;....TryADOConnection.ConnectionString := ‘Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source=‘+PrgDir+‘Main.mdb ;‘; ADOConnection.Connected := True; Fuel_Stat.Active := True; Fuel_Types.Active := True; Fuel_Stantions.Active := True; Except End;
Неизвестный
13.05.2008, 10:13
общий
это ответ
Здравствуйте, Паршина Людмила Леонидовна!
Проблема в том, как вы создаёте подключение в ADOConnection:
1. В инсперторе объктов
ADOConnection.Connected = false
ADOConnection.ConnectionString = ‘‘
хотя во время проектирования, для удобства, эти свойства могут быть установлены, но когда компилируете релиз, сбросьте эти свойства, как указано выше.
2. См. приложение.

Т.о. если программа не найдёт файл БД Access в папке с программой, то сначала в OpenDialog будет предложено найти этот *.mdb-файл, а если найти не удалось, то программа просто не запустится.

Приложение:
var DM: TDM; // data module, создаётся раньше главной формы. Порядок создания форм задаётся в Project->Options->Forms->Auto-create forms: 1-DM, 2-frmMainconst SDBName = ‘Logging.mdb‘; SDBPass = ‘123‘;resourcestring SNoDatabaseSelected = ‘Не выбрана база данных‘; SInvalidAccessDatabase = ‘Неверная база данных‘;function TDM.CheckIfAccessDB(ADBPathName: string): boolean;var UnTypedFile: file of Byte; Buffer: array[0..19] of Byte; NumRecsRead: Integer; I: Integer; MyString: string;begin AssignFile(UnTypedFile, ADBPathName); try Reset(UnTypedFile); BlockRead(UnTypedFile, Buffer, High(Buffer), NumRecsRead); finally CloseFile(UnTypedFile); end; for I := 1 to High(Buffer) - 1 do MyString := MyString + Trim(Chr(Ord(Buffer[I]))); Result := AnsiSameText(MyString, ‘StandardJetDB‘); if not Result then MessageDlg(SInvalidAccessDatabase, mtError, [mbOK], 0);end;procedure TDM.DataModuleCreate(Sender: TObject);begin with TfrmSplash.Create(nil) do // форма сплеш-скрин, где написано что-то типа "Открытие базы данных... Пожалуйста ждите..." try Show; Application.ProcessMessages; // дадим форме перерисоваться ValidateAccessDB; finally Close; Free; end;end;procedure TDM.ValidateAccessDB;var DBPath: string;begin// ADOConnection.Close; if FileExists(ExtractFileDir(Application.ExeName) + ‘\‘ + SDBName) then DBPath := ExtractFileDir(Application.ExeName) + ‘\‘ + SDBName else if DM.OpenDialog1.Execute then DBPath := DM.OpenDialog1.FileName; if (Trim(DBPath) <> ‘‘) and CheckIfAccessDB(DBPath) then begin ADOConnection.Close; // ADO Connection String to the MS-ACCESS DB ADOConnection.ConnectionString := Format(‘Provider=Microsoft.Jet.OLEDB.4.0;‘ + ‘Data Source=%s;‘ + ‘Persist Security Info=False;‘ + ‘Jet OLEDB:Database Password=%s‘, [DBPath, SDBPass]);// ADOConnection.GetTableNames(frmMain.ListBox1.Items, False); ADOConnection.Open; // открытие созданного подключения// открытие таблиц tblTools.Open; tblTelemetryType.Open; tblToolsType.Open; tblToolMngrCmnds.Open; tblPowerSource.Open; tblCommutation.Open; tblElectrCircuit.Open; tblChannels.Open; tblChanMngrCmnds.Open; tblUnits.Open; tblMetrology.Open; tblPhysUnits.Open; tblChanType.Open; end else Application.Terminate;end;
Форма ответа