2013-04-29 2 views
-1

Для начала, давайте принимать заверенную:Как обрабатывать ошибки инициализации компонентов без проектирования?

Вы создать новый проект приложения VCL в Delphi и поставить TIBDataBase и введите путь и имя файла базы данных с расширением .IB ок?

Теперь, если вы просто поместить example.ib и оставить путь позади, при выполнении приложения без Delphi, он будет открыть базу данных, как правило, если .EXE находится в том же пути, что и .IB, но если вы запустите приложение из Delphi, это вызовет ошибку, потому что не может найти файл базы данных, потому что Delphi изменяет рабочий каталог.

Иногда вы хотите оставить Active свойства этого компонента, установленного в True во время разработки, и их набор для False и изменить его во время запуска приложения, когда вы доставить к вашему клиенту. Все это, потому что он может захотеть установить другой путь, и ваше приложение должно найти подходящее место в базе данных, прежде чем открыть его.

Проблема возникает, когда вы уже доставили клиенту и по-прежнему вносили изменения в код. Затем вам нужно развертывать не реже одного раза в день, и когда-нибудь вы просто забудете вернуть это свойство в False, и когда клиент получает обновление и пытается его запустить, он/она получает ошибку не найденной базы данных.

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

+0

* Соответствующий * ответ заключается в том, чтобы перед установкой установить значение «Актив» на false. Если этого недостаточно, то, возможно, создайте события, которые вызывают сообщение, напоминающее вам об отключении его? –

+0

Я имею в виду, это как просить, как распознать вашу программу, когда вы допустили ошибку, и исправить ее для вас. Я ошибаюсь? Совет. Не упоминайте ничего в своем вопросе о вашем конкретном сценарии базы данных. Держите его простым и точным, об улавливании исключений из элементов управления во время создания формы. –

+0

Такие вещи, как 'function IsDebuggerPresent: boolean; stdcall external 'kernel32.dll'; 'являются инструментами для нас, разработчиков, для работы с этим сценарием, который я только что объяснил. Проекты, которые мы делаем или исправляем, пока пользователь все еще работает, очень распространены.Забыть выключить некоторые из наших инструментов не редко (и это не грех) и может нанести ущерб пользователю, например, он/она получает заказы клиентов в McDonalds. Считаете ли вы это, прежде чем судить о моем вопросе? – PSyLoCKe

ответ

2

Я не думаю, что вы найдете общее решение для предотвращения исключений времени выполнения из настроек времени разработки без изменения компонента или получения потомства.

Для TIBDatabase, установите объект AllowStreamedConnected в False. Это останавливает TIBDataBase от автоматического подключения к базе данных во время выполнения, когда Connected составляет True во время разработки. TIBQuery с использованием этого TIBDatabase не открывается, даже если он установлен. Активен во время разработки.

Некоторые другие компоненты подключения к базе данных имеют схожие свойства.

2

Что касается вопроса базы данных только: если я вас правильно понимаю, что мое решение требует, чтобы написать обработчик события для события «BeforeConnect», как показано ниже:

procedure TDM.SQLConnection1BeforeConnect(Sender: TObject); 
var 
dir: string; 

begin 
with TRegIniFile.create (regpath) do // I keep my database locations in the registry 
    begin       // but you can use any method of getting the location 
    dir:= ReadString ('firebird', progname, ''); 
    free 
    end; 

with sqlconnection1 do 
    begin 
    close; 
    params.values['database']:= dir; 
    loginprompt:= false; 
    end; 
end; 

Таким образом, вы можете иметь одно место, хранящееся в вашей базе данных для локального использования, но имеющее разные местоположения для разных пользователей.

Смежные вопросы