Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как создать одиночную форму.

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Ghena



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kak sozdat' formu v CBuilder tak chto-by ona otkrylas' toljko odin raz(pri popytke otkryt' novuju formu , proga otkryla pedydushchuju)?

Всего записей: 151 | Зарегистр. 07-02-2002 | Отправлено: 17:53 23-02-2005
WebInc

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Во первых, смысл всего этого предприяти?
Во вторых, что значит предидущая?

Всего записей: 28 | Зарегистр. 14-02-2005 | Отправлено: 06:03 24-02-2005
Ghena



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WebInc
Smysl v tom chto-by ne bylo otkryta odna i ta zhe programma boljshe odnogo raza.
A po vtoromu voprosu : esli zapuskaju programu , no  ona uzhe otkryta ,to aktivirovalas'
(ili "pojavilas'" iz taskbar ) aktivnaja proga.

Всего записей: 151 | Зарегистр. 07-02-2002 | Отправлено: 14:58 24-02-2005
WebInc

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это означает что тебе надо что бы не запускалось более одно копии твоего приложения.
 
Соответственно есть вариант, во время запуска смотреть список процессов, если там уже есть твой то закрывать прогу.
 
По поводу литературы почитай Рихтера или справку по WinAPI

Всего записей: 28 | Зарегистр. 14-02-2005 | Отправлено: 04:12 25-02-2005
matt

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
не знаю точно как в сишнике, но в вб была какая-то функция которая определяла, запущена уже прога или нет.
 
Если облом искать есть более простой выход чем смотреть список процессов (но, правда, не такой красивый): когда запускаешь прогу создаешь временный файл, когда закрываешь - удаляешь. Тогда если при запуске проги файл существует, то другой экземпляр уже открыт.
Существенный недостаток метода - при нештатном закрытии проги файл остается и ни один экземпляр больше не запустится

Всего записей: 176 | Зарегистр. 28-11-2003 | Отправлено: 05:57 25-02-2005
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ghena
В VB есть App.PrevInstance
Для CBuilder вероятно
Цитата:
 
Q-23: Как сделать так, чтобы программу можно было запустить только в одном экземпляре?
Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate.
 
(AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning().

Взято отсюда _http://faq.delphiplus.org/html/fido7.ru.delphi_old.html

Всего записей: 3923 | Зарегистр. 31-03-2002 | Отправлено: 10:34 25-02-2005
Ghena



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp
Dlja Bildera eta functsija ne podhodit.

Всего записей: 151 | Зарегистр. 07-02-2002 | Отправлено: 16:36 25-02-2005
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ghena
Тогда или ищи в хелпе бильдера что-то подобное, или через процессы и API, как уже советовали.

Всего записей: 3923 | Зарегистр. 31-03-2002 | Отправлено: 22:18 25-02-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ghena
Чаще всего это реализуется с помошью мьютексов (CreateMutex - WinAPI). В сети полно информации и примеров этого на С++.

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 05:38 26-02-2005
Ghena



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Poprobuju s mjuteksom (slovo pervichnoe dlja menja)  
dneprcomp
V Help ja nichego ne nashel.

Всего записей: 151 | Зарегистр. 07-02-2002 | Отправлено: 13:31 02-03-2005
tomegadeth



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bool IsSingleInstance(char *MutexName)
{
    HANDLE hMutex = CreateMutex(NULL, FALSE, MutexName);
    if(!hMutex) {
       MessageBox(0, "Error! !Application failed to create mutex!", 0, 4096);
       return false;
    }
    else
       if(GetLastError() == ERROR_ALREADY_EXISTS)
       {
          MessageBox(0, "Программа уже запущенна!", "Ошибка!", 4096);
          return false; // If process already started then return false
       }
    return true;        // true if is single running instance
}
 
P.S. MutexName должен быть один и тот-же

Всего записей: 560 | Зарегистр. 22-11-2004 | Отправлено: 18:00 02-03-2005 | Исправлено: tomegadeth, 18:01 02-03-2005
Ghena



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tomegadeth
Spasibo , poprobuju

Всего записей: 151 | Зарегистр. 07-02-2002 | Отправлено: 15:22 03-03-2005
nazaret

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно попробовать через реестр ( класс TRegistry см. Help по этому классу) - при запуске писать 1 в параметр,
при выходе из программы - писать 0. Перед Application->Run  читать это значение - если равно 1 - Application->Terminate

Всего записей: 29 | Зарегистр. 31-07-2003 | Отправлено: 09:52 07-03-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
nazaret

Цитата:
Можно попробовать через реестр ( класс TRegistry см. Help по этому классу) - при запуске писать 1 в параметр,
при выходе из программы - писать 0. Перед Application->Run  читать это значение - если равно 1 - Application->Terminate  

А что ты будешь делать при аварийном завершении программы? Ручками лезть в реестр и сбрасывать флаг?

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 20:16 07-03-2005
zorrack



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мне кажется что нормальным подходом в данном случае будет поиск хендла окна.
Зачем поиск окна - чтобы его активизировать при попытке повторного запуска.
Мютекс позволит проверить, запущена ли уже программа, но не позволит ее активизировать (хотя , вроде бы этого и не просили)...

Всего записей: 244 | Зарегистр. 16-05-2003 | Отправлено: 22:01 07-03-2005
Ghena



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tomegadeth
CBuilder 4.0 Professional ne znaet mutex.

Всего записей: 151 | Зарегистр. 07-02-2002 | Отправлено: 11:14 09-03-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
CBuilder 4.0 Professional ne znaet mutex.  

Это же WInAPI, разве важно тут какая версия стройки?

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 12:41 09-03-2005
Ghena



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EZH
Proboval cherez WinAPI...
No tam net fuctija chto dal tomegadeth : CreateMutex(...)
Da i zorrack prav ...
 
 

Всего записей: 151 | Зарегистр. 07-02-2002 | Отправлено: 18:33 09-03-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
я пишу на Delphi. В своё время я решал эту проблему очень просто. Есть файл проекта (тот который dpr - это для делфи) я вставлял следующий код

Код:
 
var
  hwnd: THandle;
 
begin
  hwnd := FindWindow('TForm1', 'Form1');
  if hwnd = 0 then
  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end
  else
    SetForegroundWindow(hwnd)
end.
 

на Buildere это будет выглядит приблизительно так

Код:
 
{
  Handle hwnd = FindWindow('TForm1', 'Form1');
  if (hwnd == 0)
  {
   Application->Initialize;
   Application->CreateForm(TForm1, Form1);
  Application->Run;  
  }
else
   SetForegroundWindow(hwnd)  
}
 

 
мож я в синтаксисе немного ошибаюсь, но идея верная
файлу dpr в buildere кажеться соответствует bpr. Найди что-то подобное там и подкоректируй

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 19:24 09-03-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
OdesitVadim
И что будет если у тебя запущено два разных приложения, но оба имеющие класс главной формы TForm1 и имя Form1?

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 23:21 09-03-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как создать одиночную форму.


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru