Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PopupMenu открывается под формой  
V
    Опции темы
Wan22
Дата 31.8.2012, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 28.12.2010

Репутация: нет
Всего: нет



На форме стоит таймер. Из за него PopupMenu почему то открывается под формой. как прописать, чтобы при открытии 
PopupMenu таймер остановился, а при закрытии продолжил свое дело?
 
PM MAIL   Вверх
northener
Дата 1.9.2012, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(Wan22 @  31.8.2012,  21:05 Найти цитируемый пост)
На форме стоит таймер. Из за него PopupMenu почему то открывается под формой.

Лучше всё-таки разобраться из-за чего конкретно всплывающее меню оказывается под формой.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Wan22
Дата 1.9.2012, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 28.12.2010

Репутация: нет
Всего: нет



northener, это было бы конечно лучше, но не смог. А сюда выложить весь код, бы помогли, так он у меня уже слишком большой. 
 Поэтому и решил попробовать просто останавливая таймер.  Еще у меня из за этого включенного таймера и форма2 проваливалась под форму 1. так я для устранения этого написал так
Код

procedure TForm2.FormActivate(Sender: TObject);
begin
Form1.tmr5.enabled:=False;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   Form1.tmr5.enabled:=true;
end;

вроде работает. Как все-таки с Popup Menu  проделать? 
 
PM MAIL   Вверх
northener
Дата 2.9.2012, 02:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(Wan22 @  1.9.2012,  14:35 Найти цитируемый пост)
northener, это было бы конечно лучше, но не смог. А сюда выложить весь код, бы помогли, так он у меня уже слишком большой. 

Неужели процедура таймера столь большая?


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Wan22
Дата 2.9.2012, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 28.12.2010

Репутация: нет
Всего: нет



Цитата(northener @  2.9.2012,  02:20 Найти цитируемый пост)
Неужели процедура таймера столь большая? 

 Ну как то так   smile  Проблема - если Таймер2 =True , то всплывающее меню проваливается под форму
Код

procedure TForm1.tmr1Timer(Sender: TObject);
 // вспомогательная функция, преобразующая МАС адрес к
 // "нормальному" виду определяем специальный тип, чтобы
 // можно было передать в функцию массив
type
 TMAC=array [0..7] of Byte;
 // в качестве первого значения массив, второе значение,
 // размер данных в массиве
function GetMAC(Value: TMAC; Length: DWORD): string;
var
 i: integer;
begin
 if Length=0
 then Result:='00-00-00-00-00-00'
 else
  begin
   Result:='';
   for i:=0 to Length-2 do
    Result:=Result+IntToHex(Value[i],2)+'-';
    Result:=Result+IntToHex(Value[Length-1],2);
   end;
end;

var
 FLibHandle: THandle;
 Table: TMibIfTable;
 i, Size: integer;
 s,trafnormin,trafnormout: string;
begin

 Tmr1.Enabled:=false; // приостанавливаем на всякий случай таймер
 Lst1.Items.BeginUpdate;

  Lst1.Items.Clear; // очищаем список
 FLibHandle:=LoadLibrary('IPHLPAPI.DLL'); // загружаем библиотеку
 if FLibHandle=0
 then Exit;
 @GetIfTable:=GetProcAddress(FLibHandle, 'GetIfTable');
 if not Assigned(GetIfTable)
 then
  begin
   FreeLibrary(FLibHandle);
   Close;
  end;
 //
 Size:=SizeOf(Table);
 if GetIfTable(@Table,@Size,false)=0
 then
    for i:=0  to Table.dwNumEntries-1 do // кол-во сетевых карт
   begin
    with Lst1.Items do
     begin // выводим результаты
      if string(GetMAC(TMAC(Table.Table[i].bPhysAddr),Table.Table[i].dwPhysAddrLen))<>'00-00-00-00-00-00' // сравнение MAC адресов

      then
       begin
        Add('Description: '+string(Table.Table[i].bDescr)); // наименование интерфейса
        Add('MAC-adress: '+string(GetMAC(TMAC(Table.Table[i].bPhysAddr),Table.Table[i].dwPhysAddrLen))); // МАС адрес
  cbb1.Items.Add(string(GetMAC(TMAC(Table.Table[i].bPhysAddr),Table.Table[i].dwPhysAddrLen)));
        // перевод к нормальным единицам "Входящего" трафика
        trafbitin:=Table.Table[i].dwInOctets; // всего принято байт
        trafnormin:=BytesToFriendlyString(trafbitin);
        // перевод к нормальным единицам "Исходящего" трафика
        trafbitout:=Table.Table[i].dwOutOctets; // всего отправлено байт
        trafnormout:=BytesToFriendlyString(trafbitout);
        /////////////////////////////////////
        Add('In: '+BytesToFriendlyString(trafbitin)); // всего принято байт
        Add('Out: '+BytesToFriendlyString(trafbitout)); // всего отправлено байт

        Add('-------------------------------------------------'); //
       end;
     end;
   end;

 EnumInterfaces(s);
 Lst1.Items.Add(s);
 Lst1.Items.EndUpdate;
 FreeLibrary(FLibHandle);
 Windows.SetFocus(0);
end;

procedure TForm1.tmr2Timer(Sender: TObject);
 type
 TMAC=array [0..7] of Byte;
function GetMAC(Value: TMAC; Length: DWORD): string;
var
 i: integer;
begin
 if Length=0
 then Result:='00-00-00-00-00-00'
 else
  begin
   Result:='';
   for i:=0 to Length-2 do
    Result:=Result+IntToHex(Value[i],2)+'-';
    Result:=Result+IntToHex(Value[Length-1],2);
   end;
end;

var
 FLibHandle :THandle;
 Table      :TMibIfTable;
 old,  kol, na, all, Size : Int64;
 s          :string;
 new2, new  :Int64;
 i: integer;
 //ActiveTraffic : TTraffic;
begin
 tmr2.Enabled:=false;
  btn4.Caption:= 'Обработка';
 btn4.Enabled:=False;
 FLibHandle:=LoadLibrary('IPHLPAPI.DLL');
 if FLibHandle=0
 then Exit;
 @GetIfTable:=GetProcAddress(FLibHandle, 'GetIfTable');
 if not Assigned(GetIfTable)
 then
  begin
   FreeLibrary(FLibHandle);
   Close;
  end;
 Size:=SizeOf(Table);
 if GetIfTable(@Table,@Size,false)=0
 then
  for i:=0 to Table.dwNumEntries-1 do
   begin
      if string(GetMAC(TMAC(Table.Table[i].bPhysAddr),
      Table.Table[i].dwPhysAddrLen))=(edt4.Text)
      then
       begin
        trafbitin:=0;
        trafbitin:=Table.Table[i].dwInOctets;
        trafbitout:=Table.Table[i].dwOutOctets;
         if trafbitin<trafbitold
         then
          begin
            kol:=strtoint(Edt5.Text);
            na:=strtoint('1');
            all:=kol+na;
            Edt5.Text:=inttostr(all);
          end;
          int64(all):=strtoint(Edt5.Text);
          if all>0 then
          begin
          int64(old):=4294967296;
          int64(new):=old*all;
          int64(new2):=new+trafbitin;
          Edt2.Text:=('In: '+BytesToFriendlyString(new2));
          Edt3.Text:= ('Out:'+BytesToFriendlyString(trafbitout));
          end
          else
          begin
       Edt2.Text:= ('In: '+BytesToFriendlyString(trafbitin));
       Edt3.Text:= ('Out:'+BytesToFriendlyString(trafbitout));
       end;
       trafbitold:=trafbitin;
       end;

 //EnumInterfaces(s);
   //FreeLibrary(FLibHandle);
 if Chk1.Checked=True then
 begin
 SetWindowPos(Form1.Handle, HWND_TOPMOST, 0, 0, 0, 0,
    SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
    end;
    ShowWindow(Application.Handle, sw_Hide);
    btn4.Caption:= 'Запустить';
    if chk1.Checked=True Then
    begin
 cbb1.Enabled:=False;
 Tmr2.Enabled:=true;
 btn4.Caption:= 'Остановить';
 end
 else
 begin
 cbb1.Enabled:=True;
 trafbitold:=0;
 end;
 if Tmr2.Enabled=false then
 btn4.Enabled:=True;
 end;
 end;



Вот тут исходник.  
Вначале всплывающее меню,( ну еще колорбокс добавил с таким же признаком) нормально отображается. Но если жмем кнопку Запустить, то и Popup Menu и ColorBox будут скрываться под формой.

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  3Инетрадио_с_трафиком.rar 318,33 Kb
PM MAIL   Вверх
northener
Дата 3.9.2012, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(Wan22 @  2.9.2012,  10:11 Найти цитируемый пост)
 SetWindowPos(Form1.Handle, HWND_TOPMOST,

Ну если в процедуре таймера Форму1 выдвигают на передний план, то я не понимаю в чём проблема? Вы ведь сами так хотели, разве нет?
Возможно стоит ещё раз продумать алгоритм программы.
Ну а если нужна "затычка" подобно 
Цитата(Wan22 @  1.9.2012,  14:35 Найти цитируемый пост)
 Поэтому и решил попробовать просто останавливая таймер.  Еще у меня из за этого включенного таймера и форма2 проваливалась под форму 1. так я для устранения этого написал так
, то останавливать таймер в данном варианте можно в событии TPopupMenu.OnPopup. А вот с запуском таймера, имхо, проблема. Если пользователь в всплывающем меню выбрал какой-то пункт, то всё пучком. А вот если не выбрал... Я лично не знаю как (когда) в этом случае запустить таймер.



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0989 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.