Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > PopupMenu открывается под формой


Автор: Wan22 31.8.2012, 21:05
На форме стоит таймер. Из за него PopupMenu почему то открывается под формой. как прописать, чтобы при открытии 
PopupMenu таймер остановился, а при закрытии продолжил свое дело?
 

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

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

Автор: Wan22 1.9.2012, 14:35
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  проделать? 
 

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

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

Автор: Wan22 2.9.2012, 10:11
Цитата(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 будут скрываться под формой.

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)