Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
ooo
Зарегистрирован: 17.08.2006 Сообщения: 24
|
Добавлено: Чт Ноя 16 2006 16:00 Заголовок сообщения: Delphi |
|
|
Доброе время суток!
Есть программулина работающая с БД.
Подскажите, как на дельфях проверить запущенно ли это приложение и если запущено, то второю копию открыть с доступом к БД - ReadOnly? |
|
Вернуться к началу |
|
|
grf
Зарегистрирован: 05.04.2005 Сообщения: 1242 Откуда: Москва
|
Добавлено: Чт Ноя 16 2006 17:31 Заголовок сообщения: |
|
|
Используй в проге API функцию FindWindow
_________________ Errare humanum est |
|
Вернуться к началу |
|
|
ooo
Зарегистрирован: 17.08.2006 Сообщения: 24
|
Добавлено: Чт Ноя 16 2006 17:39 Заголовок сообщения: Delphi |
|
|
А примером моно показать... а то я далеко не программер в этом деле. |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Чт Ноя 16 2006 20:34 Заголовок сообщения: |
|
|
Первое, что должна выполнить прога при запуске - это вызвать функцию FindWindow [uses Windows], где аргументами будут соответственно nil и заголовок главного окна формы. Если копия твоей программы была запущена ранее и форма уже открыта, функция вернет ее дескриптор. В противном случае, результатом будет nil. Таким обазом можно узнать, какой доступ осуществить к БД.
Вообще, это не самый правильный способ (в смысле, использовать эту функцию). Но если ты не собираешся сертифицировать свое творение в MS, то сойдет.
Последний раз редактировалось: Mytilus Galloprovincialis (Пн Ноя 20 2006 02:24), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
grf
Зарегистрирован: 05.04.2005 Сообщения: 1242 Откуда: Москва
|
Добавлено: Пт Ноя 17 2006 14:57 Заголовок сообщения: |
|
|
Код: |
uses Forms, Windows, // обязательный модуль
uAppl in 'uAppl.pas' {Form1};
..... // все что должно здесь быть еще :-)
begin
//Если окно уже открыто, то завершить приложение
if FindWindow('TForm1','Form1')<>0 then Application.Terminate;
Application.Createform(TForm1,Form1);
Application.Run;
end.
|
Другой Вариант использовать функцию SetForegoundWindow Которая размещает на передний план окно, заданное в параметрах этой функции, т.о. Вы сможете передвинуть на передний план уже запущенный вариант программы, вместо запуска второго экземляра.
Какие еще есть способы, более правильные ?
_________________ Errare humanum est |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пн Ноя 20 2006 02:21 Заголовок сообщения: |
|
|
Если надо, чтобы совсем правильно, то делается это через ADO-соединение. Запущеная программа пытается подключиться к первому экземпляру и посылает запрос. Если получает отклик, значит до нее уже экземпляр был запущен.
Но! Такая мутота оправдана только в трех случаях. Первое: приложение будет проходить сертификацию Майкрософт. Второе: экземпляры необходимо отлавливать не только на собственном компе, но и по всей сети. Третье (и более реальное): необходимость передачи каких-либо данных от одного экземпляра другому; например, первый может запросить параметры ключей командной строки второго. (Так, к примеру, поступает Word, получая от второй копии имя открываемого файла.)
Если же программный код не будет выставляться на суд дока-разработчиков, FindWindow - наверное, оптимальное решение. |
|
Вернуться к началу |
|
|
ooo
Зарегистрирован: 17.08.2006 Сообщения: 24
|
Добавлено: Пн Ноя 20 2006 08:53 Заголовок сообщения: Delphi |
|
|
Спасибо ребятки .. .выручили,
и можно в догонку исчо один вопрос?
Вот есть папка с файлами БД, скажем нужно по нажатию кнопки создать директорию равную текущей дате и скопировать туда все файлики из папки dbf в папку скажем 20.11.2006 /если седни такая дата/.
Накорябал тут кое чего ... папка создается но файлы не копируются ... то пишут что заняты другим пользователем, то исчо что то ... не помню ...
Млин как вылечиться? Киньте плиз примерчик |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пн Ноя 20 2006 17:37 Заголовок сообщения: |
|
|
Скорее всего, тобой же эти файлы и заняты. Если комп ругается, что не может копировать, потому что что-то кем-то занято, значит, файлы защищены от чтения. Такие штуки возникают, когда проге, работающей с файлами, может понадобиться содержимое этого файла оперативно изменить. Так что, скорее всего, это твоя же программа открыла файлы, а закрыть - не закрыла. Перед копированием необходимо закрыть эти файлы, отключить соединение с БД и тогда уже копировать.
Так же в Делфях полно функций, процедур и методов, копирующих файлы. Возможно, некоторые из них закручены так хитро, что в результате Виндоуз выдает тебе такой мессаг. Испольуй CopyFile(), выполнив все инструкции выше, и будет тебе счастье! |
|
Вернуться к началу |
|
|
ooo
Зарегистрирован: 17.08.2006 Сообщения: 24
|
Добавлено: Вт Ноя 21 2006 10:33 Заголовок сообщения: Delphi |
|
|
Дык вроде как переводил active в фалс ... и т.д. ничего не изменялось.
закрывал файл в ручную... ничего
посоветуйте ... чтонить, могет примером |
|
Вернуться к началу |
|
|
ooo
Зарегистрирован: 17.08.2006 Сообщения: 24
|
Добавлено: Вт Ноя 21 2006 10:33 Заголовок сообщения: Delphi |
|
|
Дык вроде как переводил active в фалс ... и т.д. ничего не изменялось.
закрывал файл в ручную... ничего
посоветуйте ... чтонить, могет примером
CopyFile и и спользовал ... |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Вт Ноя 21 2006 23:13 Заголовок сообщения: |
|
|
Во-первых, свойство Active рекомендуется использовать только для чтения, а для подключения/отключения юзай методы Open и Close. Во-вторых, если это не поможет, значит, файлы блокируются не твоей программой, а драйвером подключения к БД. В таком случае, вижу два варианта: либо (если это возможно) использовать другой драйвер (другой тип подключения), либо создавать файл программно, считывая данные с оригинала.
Хотя, надо поковыряться и все же понять, че это он не дает доступ. |
|
Вернуться к началу |
|
|
ooo
Зарегистрирован: 17.08.2006 Сообщения: 24
|
Добавлено: Ср Ноя 22 2006 08:17 Заголовок сообщения: Delphi |
|
|
Чего токак не делал...никак нехотела.
Но при таком варианте заработало!!!
DD:=DateToStr(Date);
DDf:=DD+'\one.dbf';
Mkdir(DD);
AssignFile(F, 'dbf\one.dbf')
tblOne.Active:=false;
tblOne.Active:=true;
tblOne.Refresh;
CloseFile(F);
CopyFile('dbf\one.dbf',PChar(DDf),true);
Помоему глупо, но работает...
Но при этом выдается, "Warning", --> Unsafe type PChar
Чем же ПЧар ему так не доверителен?
и как этого моно избежать? |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Чт Ноя 23 2006 03:48 Заголовок сообщения: |
|
|
PChar DDf;
DDf := PChar(DD + '\one.dbf');
...
CopyFile('dbf\one.dbf', DDf, true);
Дело в том, что второй аргумент функции CopyFile() - ссылка. И Delphi предупреждет, что раз это ссылка, то функция, возможно, захочет изменить в ней значение. Поэтому надо использовать переменную, а не результат выполнения PChar(что_то_там). |
|
Вернуться к началу |
|
|
ooo
Зарегистрирован: 17.08.2006 Сообщения: 24
|
Добавлено: Чт Ноя 23 2006 09:29 Заголовок сообщения: Delphi |
|
|
Не заработала в таком виде!!!
Я юзаю Делфи-7, могет в этом фича? |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пт Ноя 24 2006 12:54 Заголовок сообщения: |
|
|
Ну, хрен знает. Попробуй потоком:
Код: |
var fsNew, fsTemplate: TFileStream;
...
fsNew = TFileStream.Create('[путь к создаваемому файлу]', fmCreate);
try
fsTemplate = TFileStream.Create('[путь к копируемому файлу]', fmOpenRead);
try
fsTemplate.Seek(0, soFromBeginning);
fsNew.CopyFrom(fsTemplate, 0);
finally
fsTemplate.Free;
end;
finally
fsNew.Free;
end;
|
Возможно, немного громоздко, но должно работать (причем, быстрее). |
|
Вернуться к началу |
|
|
|