Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Несохраняемое свойство


Автор: Akella 18.9.2006, 12:50
Есть компонента TDataBase. У неё есть свойство connected типа boolean.
В процессе проектирования это свойство устанавливается в True.
Так вот, если перед компиляцией не установить connected в false, то на другом компьютере программа не запускется по следующей причине:
- во время создания компоненты TDataBase она "ищет" сам файл базы данных, вот во время проектирования база "лежала" по одному пути, на другом компьютере (где будет работать прога) база может лежать по другому пути, а по сему TDataBase не находит сам файл БД, а Connecned ведь установлено в True - в итоге вываливается исключение и программа закрывается.
Короче, нужно гарантированно установить свойство Connected в False или перед компиляцией или при создании самой компоненты TpFIBDatabase.
В TDataModule.OnCreate не получиться, т.к. OnCreate формы наступает после создания всех компонент.

Испольую TpFIBDatabase.

Автор: sergejzr 18.9.2006, 12:54

Автор: Snowy 18.9.2006, 13:08
Перевожу: В дизайнтайме нужно, чтобы свойство Connected было установлено в true.
А при компиляции в exe эта пропертя должна быть в False.
То есть Connected в дизайнтайм - true, в рантайм - false.
Проблема в том, что состояние сохраняется в dfm файл и срабатывает автоматом после выполнения конструктора.
Соответственно выход - сделать так, чтобы пропертя в dfm не сохранялась.
Пробовали сабклассить, устанавливая у проперти stored False - не получилось.
Может у кого есть ещё идеи?

Автор: Akella 18.9.2006, 13:13
Цитата(sergejzr @  18.9.2006,  12:54 Найти цитируемый пост)
Какое - какое свойство?

я имел ввиду, чито свойство не долно сохранять никакое другой значание, кроме False

Добавлено @ 13:15 
я уже залез в исходники, нарушив золотое правило
и установил значение в конструкторе, ща буду тестировать

Код
constructor TpFIBDatabase.Create(AOwner: TComponent);
begin
   inherited Create(AOwner);


   Connected := false;


   FRewriteAlias:=True;
   FCacheSchemaOptions:=TCacheSchemaOptions.Create;
   FAliasName:='';
   vTimer :=nil;
end;


Добавлено @ 13:18 
есть ещё вариант использовать псевдонимы, так сказать, т.е. есть свойство Alias типа String;
А у FireBird есть файл алиасов. На одном компе у Alias`a с именем "Kvx" один путь, на другом - другой путь, но это запасной вариант уже, так сказать, т.к. некоторые TDatabase не имею алиасов, как у ADO, например.

Автор: Snowy 18.9.2006, 13:22
Akella, так не получится.
Проперти подгружаются из dfm уже после отработки конструктора.

Автор: Elfebet 18.9.2006, 13:37
а почему бы не создать модуль и конектится с базой при помощи сессии, типа такого
Код

 with Session do begin ConfigMode := cmSession;
  try
  AddStandardAlias('MyDataBase',ExtractFilePath(ParamStr(0))+'DB\','PARADOX');
   finally ConfigMode := cmAll;
  end;

ну если нет Алиаса, можно просто коннектится написав типа такого
Код

ADOQuery1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;'+
 'Data Source='+ExtractFilePath(ParamStr(0))+'db1.mdb;Persist Security Info=False';


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

Автор: Akella 18.9.2006, 13:41
Цитата(Elfebet @  18.9.2006,  13:37 Найти цитируемый пост)
а почему бы не создать модуль и конектится с базой при помощи сессии, типа такого

у вот у FIB+ нет сессии

Добавлено @ 13:43 
Цитата(Snowy @  18.9.2006,  13:22 Найти цитируемый пост)
Akella, так не получится.Проперти подгружаются из dfm уже после отработки конструктора.

ты прав,  smile  как всегда  smile

Добавлено @ 13:45 
Цитата(Snowy @  18.9.2006,  13:08 Найти цитируемый пост)
Перевожу: В дизайнтайме нужно, чтобы свойство Connected было установлено в true.А при компиляции в exe эта пропертя должна быть в False

может даже не при компиляции, а может даже непосредственно перед установкой значения свойства в True;
Хотя именно при/перед компиляцией было бы  даже лучше

Добавлено @ 13:48 
есть ещё свойство Befor Connect, попробую с ним " smile поиграаться"

Добавлено @ 13:48 
из исходников следут, что можно ещё в этом событии чего-то предприянять

Код

procedure TpFIBDatabase.Open;     
var
   DoConnect:boolean;
begin
  if Connected then Exit;
  DoConnect:=True;
  if Assigned(FBeforeConnect) then FBeforeConnect(Self,DBParams,DoConnect);
  if not DoConnect then    Exit;
  inherited Open;


Добавлено @ 13:52 
к сожалению наличие файла БД невозможно проверить простым путём, т.к. строка подключения
имеет вид "server:C:\Program\Data\Base.fdb"

Автор: sergejzr 18.9.2006, 13:53
Цитата(Snowy @  18.9.2006,  11:08 Найти цитируемый пост)
Может у кого есть ещё идеи? 


А если её сразу в конструкторе уже прописывать как disconnected и затем коннектить в зависимости от режима (который опросить можно несколькими вам известными способами)?

Автор: Akella 18.9.2006, 13:58
Придумал вот такое:
На форму кидаю ещё одну компоненту TpFIBDatabase. Вот у него всегда будет Connected в False, потому что во время дизайна нет надобности устанавливать Connected в True.

Добавлено @ 14:02 
вот сначал пытаюсь подключиться этой компонентой к базе, а потом уже и основной

Автор: Akella 18.9.2006, 14:20
Код

procedure TDM.dbApStorageBeforeConnect(Database: TFIBDatabase; LoginParams: TStrings; var DoConnect: Boolean);
begin

  dbTestConnected.ConnectParams := Database.ConnectParams;
  dbTestConnected.DBName        := Database.DBName;
  dbTestConnected.LibraryName   := Database.LibraryName;
  try
    dbTestConnected.Connected := true;
    DoConnect := dbTestConnected.TestConnected;
    dbTestConnected.Connected := false;
  except
    DoConnect := false
  end;

end;


прога уже запускается, уже легче, только при закрытии программы стало вываливаться исключение "Invalid Pointer Operation", будем рыть...

Автор: Akella 18.9.2006, 14:46
Код
procedure TDM.dbApStorageBeforeConnect(Database: TFIBDatabase; LoginParams: TStrings; var DoConnect: Boolean);
begin
  dbTestConnected.ConnectParams.UserName := Database.ConnectParams.UserName;
  dbTestConnected.ConnectParams.Password := Database.ConnectParams.Password;
  dbTestConnected.ConnectParams.CharSet := Database.ConnectParams.CharSet;
  dbTestConnected.DBName        := Database.DBName;
  dbTestConnected.LibraryName   := Database.LibraryName;
  try
    dbTestConnected.Connected := true;
    DoConnect := dbTestConnected.TestConnected;
    dbTestConnected.Connected := false;
  except
    DoConnect := false
  end;
end;

всё вроде нормально работает.

вот это пока не пробовал
Цитата(sergejzr @  18.9.2006,  13:53 Найти цитируемый пост)
А если её сразу в конструкторе уже прописывать как disconnected и затем коннектить в зависимости от режима (который опросить можно несколькими вам известными способами)?


Добавлено @ 14:53 
в constructor TFIBDatabase.Create(AOwner: TComponent);
нет connected

Добавлено @ 14:57 
такое нашёл
Код
  published
    property Connected: Boolean read GetConnected write SetConnected stored GetStoreConnected;

Автор: Akella 18.9.2006, 15:02
помоему я тут изобретаю велосипед

Цитата

ddoStoreConnected определяет, будет ли сохраняться состояние подключения при
компиляции приложения.


Добавлено @ 15:10 
всё, тема закрыта, вычитал в документации....  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)