Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Несохраняемое свойство 
V
    Опции темы
Akella
  Дата 18.9.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



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

Испольую TpFIBDatabase.
PM MAIL   Вверх
sergejzr
Дата 18.9.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360




Модератор: Сообщение скрыто.



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Snowy
Дата 18.9.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 2
Всего: 484



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


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(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, например.
PM MAIL   Вверх
Snowy
Дата 18.9.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 2
Всего: 484



Akella, так не получится.
Проперти подгружаются из dfm уже после отработки конструктора.
PM MAIL   Вверх
Elfebet
Дата 18.9.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: нет
Всего: 14



а почему бы не создать модуль и конектится с базой при помощи сессии, типа такого
Код

 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 


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Akella
Дата 18.9.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(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"
PM MAIL   Вверх
sergejzr
Дата 18.9.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



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


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


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Akella
Дата 18.9.2006, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



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

Добавлено @ 14:02 
вот сначал пытаюсь подключиться этой компонентой к базе, а потом уже и основной
PM MAIL   Вверх
Akella
Дата 18.9.2006, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Код

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", будем рыть...
PM MAIL   Вверх
Akella
Дата 18.9.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Код
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;

PM MAIL   Вверх
Akella
Дата 18.9.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



помоему я тут изобретаю велосипед

Цитата

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


Добавлено @ 15:10 
всё, тема закрыта, вычитал в документации....  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0847 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.