Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Delphi

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
ooo



Зарегистрирован: 17.08.2006
Сообщения: 24

СообщениеДобавлено: Чт Ноя 16 2006 16:00    Заголовок сообщения: Delphi Ответить с цитатой

Доброе время суток!
Есть программулина работающая с БД.
Подскажите, как на дельфях проверить запущенно ли это приложение и если запущено, то второю копию открыть с доступом к БД - ReadOnly?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
grf



Зарегистрирован: 05.04.2005
Сообщения: 1242
Откуда: Москва

СообщениеДобавлено: Чт Ноя 16 2006 17:31    Заголовок сообщения: Ответить с цитатой

Используй в проге API функцию FindWindow
Wink
_________________
Errare humanum est
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ooo



Зарегистрирован: 17.08.2006
Сообщения: 24

СообщениеДобавлено: Чт Ноя 16 2006 17:39    Заголовок сообщения: Delphi Ответить с цитатой

А примером моно показать... а то я далеко не программер в этом деле. Confused
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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 Которая размещает на передний план окно, заданное в параметрах этой функции, т.о. Вы сможете передвинуть на передний план уже запущенный вариант программы, вместо запуска второго экземляра.

Какие еще есть способы, более правильные ?

Wink
_________________
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 Ответить с цитатой

Спасибо ребятки .. .выручили,
и можно в догонку исчо один вопрос? Wink
Вот есть папка с файлами БД, скажем нужно по нажатию кнопки создать директорию равную текущей дате и скопировать туда все файлики из папки dbf в папку скажем 20.11.2006 /если седни такая дата/.
Накорябал тут кое чего ... папка создается но файлы не копируются ... то пишут что заняты другим пользователем, то исчо что то ... не помню ...
Млин как вылечиться? Киньте плиз примерчик Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Пн Ноя 20 2006 17:37    Заголовок сообщения: Ответить с цитатой

Скорее всего, тобой же эти файлы и заняты. Если комп ругается, что не может копировать, потому что что-то кем-то занято, значит, файлы защищены от чтения. Такие штуки возникают, когда проге, работающей с файлами, может понадобиться содержимое этого файла оперативно изменить. Так что, скорее всего, это твоя же программа открыла файлы, а закрыть - не закрыла. Перед копированием необходимо закрыть эти файлы, отключить соединение с БД и тогда уже копировать.
Так же в Делфях полно функций, процедур и методов, копирующих файлы. Возможно, некоторые из них закручены так хитро, что в результате Виндоуз выдает тебе такой мессаг. Испольуй CopyFile(), выполнив все инструкции выше, и будет тебе счастье!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ooo



Зарегистрирован: 17.08.2006
Сообщения: 24

СообщениеДобавлено: Вт Ноя 21 2006 10:33    Заголовок сообщения: Delphi Ответить с цитатой

Дык вроде как переводил active в фалс ... и т.д. ничего не изменялось.
закрывал файл в ручную... ничего
посоветуйте ... чтонить, могет примером Crying or Very sad
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ooo



Зарегистрирован: 17.08.2006
Сообщения: 24

СообщениеДобавлено: Вт Ноя 21 2006 10:33    Заголовок сообщения: Delphi Ответить с цитатой

Дык вроде как переводил active в фалс ... и т.д. ничего не изменялось.
закрывал файл в ручную... ничего
посоветуйте ... чтонить, могет примером Crying or Very sad
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;


Возможно, немного громоздко, но должно работать (причем, быстрее).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...