Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.31;
Скачать: CL | DM;

Вниз

Создание формы по hot key   Найти похожие ветки 

 
Viktop   (2005-07-13 11:33) [0]

Назначил горячую клавишу (F3), по нажатию на которую создаётся форма. Нажимаю F3 и форма создаётся, но если нажать ещё раз, то появится ещё одна форма. Как этого избежать
procedure TfmMain.WMHotkey(var msg: TWMHotkey);
var
 sbFormSearch: TfmSearch;
begin
 if (msg.hotkey = 1) then
 begin
   sbFormSearch := TfmSearch.Create(Application);
   try
     sbFormSearch.ShowModal;
   finally
     sbFormSearch.Free;
   end;
 end;
end;


Пробовал ставить условие if (msg.hotkey = 1) and (sbFormSearch=nil) then, но тогда форма вобще не создаётся.


 
Digitman ©   (2005-07-13 11:37) [1]

сделай sbFormSearch полем класса формы TfmMain

вместо
sbFormSearch.Free
пиши
FreeAndNil(sbFormSearch)


 
_dimka ©   (2005-07-13 11:38) [2]


> Назначил горячую клавишу (F3), по нажатию на которую создаётся
> форма. Нажимаю F3 и форма создаётся, но если нажать ещё
> раз, то появится ещё одна форма. Как этого избежать

ну например убрать

>    sbFormSearch := TfmSearch.Create(Application);
>    try
>      sbFormSearch.ShowModal;
>    finally
>      sbFormSearch.Free;
>    end;

а прсто поставить

sbFormSearch.ShowModal;


 
_dimka ©   (2005-07-13 11:40) [3]

ну например убрать

>    sbFormSearch := TfmSearch.Create(Application);
>    try
>      sbFormSearch.ShowModal;
>    finally
>      sbFormSearch.Free;
>    end;

и аоставить sbFormSearch.ShowModal;


 
_dimka ©   (2005-07-13 11:42) [4]

Извините первый клиент выдал 406 ошибку я думал что не отправилось :)


 
Viktop   (2005-07-13 12:10) [5]

to Digitman
Всё равно появляется (если нажимать F3 подряд, не закрывая появившегося окна)


 
Digitman ©   (2005-07-13 12:16) [6]


> Viktop   (13.07.05 12:10) [5]


приводи код


 
Viktop   (2005-07-13 12:35) [7]

В Futo-create form стоит fmMain, в Available - fmSearch.
Регистрирую Hot key
procedure TfmMain.FormCreate(Sender: TObject);
begin
 RegisterHotkey(Handle, 1, 0, VK_F3);
end;

привожу ещё раз код
private // в секции объявлений формы
 procedure WMHotkey( var msg: TWMHotkey ); message WM_HOTKEY;

procedure TfmMain.WMHotkey(var msg: TWMHotkey);
var
 sbFormSearch: TfmSearch;
begin
 if (msg.hotkey = 1) then
 begin
   sbFormSearch := TfmSearch.Creat e(Application);
   try
     sbFormSearch.ShowModal;
   finally
     FreeAndNil(sbFormSearch)
   end;
 end;
end;

Нажимаю F3, нажимаю F3 ещё раз (предыдущее окно поиска не закрываю) и появляется ещё одно окно поиска.
FreeAndNil(sbFormSearch) форма освободится только после закрытия предыдущей.
Есть временное решение:
procedure TfmMain.WMHotkey(var msg: TWMHotkey);
var
 sbFormSearch: TfmSearch;
begin
 if (msg.hotkey = 1) then
 begin
   sbFormSearch := TfmSearch.Create(Application);
   try
     UnRegisterHotkey(Handle, 1);
     sbFormSearch.ShowModal;
   finally
     sbFormSearch.Free;
     RegisterHotkey(Handle, 1, 0, VK_F3);
   end;
 end;
end;


 
Digitman ©   (2005-07-13 12:39) [8]

ну и где ты в этом коде выполнил рекомендации из [1] ?
они были тебе даны с учетом


> if (msg.hotkey = 1) and (sbFormSearch=nil)
> then


 
Kolan ©   (2005-07-13 12:44) [9]

А нельзя сделать переменную:
var
 IsHotKeyFormCreated: Boolean;
{...}

procedure TfmMain.WMHotkey(var msg: TWMHotkey);
var
sbFormSearch: TfmSearch;
begin
if (msg.hotkey = 1) then
begin
  if not IsHotKeyFormShown then
  begin
    sbFormSearch := TfmSearch.Create(Application);
    try
      sbFormSearch.ShowModal;
    finally
      sbFormSearch.Free;
    end;
  end;
end;
end;


а при закрытии:
IsHotKeyFormCreated := False;


 
Kolan ©   (2005-07-13 12:46) [10]

Внутри if then забыл вставить
IsHotKeyFormCreated := True;

и там где жирным выделено
IsHotKeyFormShown = IsHotKeyFormCreated


 
Viktop   (2005-07-13 13:02) [11]

to Digitman
тогда вобще не создаётся

to Kolan
Глобальная переменная на КРАЙНИЙ случай


 
HSolo ©   (2005-07-13 13:18) [12]

В WMHotkey ищите Вашу форму поиска в Screen.Forms; если не нашли - создавайте, а нашли - просто показывайте.


 
Viktop   (2005-07-13 13:22) [13]

Видно у меня руки кривые :(
Писал так:
function IsFormOpen(const FormName : string): Boolean;
var
  i: Integer;
begin
  Result := False;
  for i := Screen.FormCount - 1 DownTo 0 do
    if (Screen.Forms[i].Name = FormName) then
    begin
      Result := True;
      Break;
    end;
end;

безрезультатно. Может, что не то писал в FormName


 
Kolan ©   (2005-07-13 13:22) [14]


> HSolo ©   (13.07.05 13:18) [12]

Лучьше помойму глобальная переменная. Чем все формы перебирать.

Кстати Лучьше использовать GlobalAddAtom

А не просто
RegisterHotkey(Handle, 1, 0, VK_F3);


 
Viktop   (2005-07-13 13:26) [15]

Видно придётся прибегнуть к временному решению :((


 
HSolo ©   (2005-07-13 13:30) [16]

>Kolan ©   (13.07.05 13:22) [14]

>Лучьше помойму глобальная переменная. Чем все формы перебирать.

Их так много? Созданных в данный момент?


 
Viktop   (2005-07-13 13:38) [17]

Перебираются все формы на экране


 
Kolan ©   (2005-07-13 13:42) [18]


> HSolo ©   (13.07.05 13:30) [16]

Хто знает


 
HSolo ©   (2005-07-13 14:30) [19]

> Перебираются все формы на экране
Не все, и не на экране, а только СОЗДАННЫЕ Вашим приложением.


 
Digitman ©   (2005-07-13 15:08) [20]


> Viktop   (13.07.05 13:02) [11]
> тогда вобще не создаётся


раз не создается, значит не выполняется условие sbFormSearch=nil

ты сделал sbFormSearch полем класса формы или не сделал ?!


 
Viktop   (2005-07-13 16:53) [21]

Как сделать полем класса формы?
Вобщето я сделал с помощью [13], но можно попробовать и другой вариант


 
Digitman ©   (2005-07-13 16:57) [22]


> Как сделать полем класса формы?


ты не понимаешь различия между локальной переменной подпрограммы и полем класса ? ...


> Вобщето я сделал с помощью [13],


к оригинальной теме эта байда НЕ имеет никакого отношения


 
Viktop   (2005-07-13 17:04) [23]

Что такое локальная переменная я знаю, а как сделать полем класса - нет. Объясни вкратце


 
Digitman ©   (2005-07-13 17:07) [24]

type
TSomeClass = class(..)
..
FSomeField: TSomeType; //это и есть поле класса
..
end;


 
Viktop   (2005-07-13 17:10) [25]

Так вот как это называется :)


 
Digitman ©   (2005-07-13 17:12) [26]


> Viktop   (13.07.05 17:10) [25]


угу..

"Так вот ты какой, оказывается, дедушка Ленин !" (с)


 
Viktop   (2005-07-13 17:18) [27]

А памяти это больше отжирать не будет?


 
Digitman ©   (2005-07-13 17:26) [28]


> Viktop   (13.07.05 17:18) [27]


обязательно !!!
как только сделаешь полем класса, так сразу и никакой памяти на компьютере тебе не хватит)))

какое тебе нафих "отжирание", если ты не ориентируешься даже в БАЗОВЫХ понятиях ?!

бегом марш буквари штудировать !



Страницы: 1 вся ветка

Текущий архив: 2005.07.31;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.025 c
9-1113670911
Степан
2005-04-16 21:01
2005.07.31
Что такое Z-буфер, и для чего он нужен??


11-1103779933
DVK
2004-12-23 08:32
2005.07.31
Лишняя начальная строка в ListView


1-1121235835
silvestr
2005-07-13 10:23
2005.07.31
Как отменить ведыление Listwiew строк программно ?


1-1120922185
KyRo
2005-07-09 19:16
2005.07.31
Как убрать стандартную реакцию


14-1120935349
lookin
2005-07-09 22:55
2005.07.31
Еще вопрос - какая версия считается более старшей?