Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Вниз

Создание формы по 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.042 c
1-1121356710
Kreyl
2005-07-14 19:58
2005.07.31
Чайницкий вопрос :-) Нужно создать новую пустую форму...


1-1121088441
yurikon
2005-07-11 17:27
2005.07.31
Программа не хочет закрываться


14-1120799849
Aldor
2005-07-08 09:17
2005.07.31
Можно ли восстановить функцию по ее коэффициентам Фурье?


1-1121156861
granni
2005-07-12 12:27
2005.07.31
Завершение работы DLL


5-1091283097
xZero
2004-07-31 18:11
2005.07.31
Компонент





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский