Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2011, 19:48   #1
phphel
Форумчанин
 
Аватар для phphel
 
Регистрация: 12.07.2010
Сообщений: 249
По умолчанию Динамически создаваниемое меню и checked

Есть код, который создает PopUpMenu динамически.

Код:
procedure TForm1.FPopupMenuPopup(Sender: TObject);
Var TX,TY,TZ :Integer;
     FMenuItem:TMenuItem;
     Pos      :TPoint;

 Begin
  GetCursorPos(Pos);
  Tx:=Pos.X;
  Ty:=Pos.Y;

  FPopupMenu:= TPopupMenu.Create(Self);
  FPopupMenu.AutoPopup:=False;
  FPopupMenu.Tag:= 0;
  For TZ:=1 To 23 Do
   Begin
    FMenuItem := TMenuItem.Create(Self);
    With FMenuItem Do
     begin
      Tag     := TZ;
      OnClick := FPopupMenuClick;
      Caption := IntToStr(TZ);
      Hint    := 'HINT '+IntToStr(TZ);
     End;
    FPopupMenu.Items.Add(FMenuItem)
   End;

  FPopupMenu.Popup(TX,TY);
  Application.ProcessMessages;
  If FPopupMenu.Tag<>0 Then
   Begin
    Form1.Caption:=FPopUpMenu.Items[FPopupMenu.Tag-1].Hint;
   End;


 FPopupMenu.Free;
 FPopupMenu:= nil;
end;

procedure TForm1.FPopupMenuClick(Sender: TObject);
begin
  with Sender as TMenuItem do ShowMessage(Caption);
end;
Как сделать, что бы при нажатии на определенный итем, он выделялся (checked = true)

Пробовал так:
Код:
procedure TForm1.FPopupMenuClick(Sender: TObject);
begin
  with Sender as TMenuItem do
  begin
  Items[tag].Checked:=True;
 end;
end;
Но не получается
Moonquake
phphel вне форума Ответить с цитированием
Старый 04.04.2011, 20:11   #2
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Включите нужному менюитему AutoCheck.
eduard93 вне форума Ответить с цитированием
Старый 04.04.2011, 20:13   #3
phphel
Форумчанин
 
Аватар для phphel
 
Регистрация: 12.07.2010
Сообщений: 249
По умолчанию

Items[tag].AutoCheck:=true; Так что ли?
Все равно - menu index out of range.
Moonquake
phphel вне форума Ответить с цитированием
Старый 04.04.2011, 20:39   #4
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Вот тут:
Код:
FMenuItem := TMenuItem.Create(Self);
    With FMenuItem Do
     begin
       AutoCheck:=true;
eduard93 вне форума Ответить с цитированием
Старый 04.04.2011, 20:49   #5
phphel
Форумчанин
 
Аватар для phphel
 
Регистрация: 12.07.2010
Сообщений: 249
По умолчанию

Не помогло
Moonquake
phphel вне форума Ответить с цитированием
Старый 04.04.2011, 20:50   #6
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Код в студию.
eduard93 вне форума Ответить с цитированием
Старый 05.04.2011, 06:52   #7
phphel
Форумчанин
 
Аватар для phphel
 
Регистрация: 12.07.2010
Сообщений: 249
По умолчанию

Код в первом сообщении
Moonquake
phphel вне форума Ответить с цитированием
Старый 05.04.2011, 07:08   #8
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

У вас при каждом вызове PopupMenu пересоздается, поэтому тут авточеки не помогут, нужно:
1) завести переменную, в которой будет находится информация о последнем чекнутом итеме, и при создании меню, смотреть эту переменную и там же чекать соответствующий итем;
2) создавать меню в другом месте (не при вызове).

для 1го пункта добавил строковую переменную и запоминаю в нее имя итема (можно и номер запоминать, если памяти на строки жалко):
Код:
var
  lastchecked:string;
procedure TForm1.FPopupMenuClick(Sender: TObject);
begin
  with Sender as TMenuItem do lastchecked:=Name;
end;

procedure TForm1.FPopupMenuPopup(Sender: TObject);
Var TX,TY,TZ :Integer;
     FMenuItem:TMenuItem;
     Pos      :TPoint;
 Begin
  GetCursorPos(Pos);
  Tx:=Pos.X;
  Ty:=Pos.Y;

  FPopupMenu:= TPopupMenu.Create(Self);
  FPopupMenu.AutoPopup:=False;
  FPopupMenu.Tag:= 0;
  For TZ:=1 To 23 Do
   Begin
    FMenuItem := TMenuItem.Create(Self);
    With FMenuItem Do
     begin
      Tag     := TZ;
      OnClick := FPopupMenuClick;
      Caption := IntToStr(TZ);
      Name := 'name'+IntToStr(TZ);
      if Name = lastchecked then Checked:=true;
      Hint    := 'HINT '+IntToStr(TZ);
     End;
    FPopupMenu.Items.Add(FMenuItem)
   End;

  FPopupMenu.Popup(TX,TY);
  Application.ProcessMessages;
  If FPopupMenu.Tag<>0 Then
   Begin
    Form1.Caption:=FPopUpMenu.Items[FPopupMenu.Tag-1].Hint;
   End;
 FPopupMenu.Free;
 FPopupMenu:= nil;
end;
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.

Последний раз редактировалось Sparkman; 05.04.2011 в 07:23.
Sparkman вне форума Ответить с цитированием
Старый 05.04.2011, 08:47   #9
phphel
Форумчанин
 
Аватар для phphel
 
Регистрация: 12.07.2010
Сообщений: 249
По умолчанию

Sparkman, огромное спасибо, есть добрые люди тут
Moonquake
phphel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ranged checked error agarum Общие вопросы Delphi 6 19.09.2010 23:34
динамически заполнить меню и создать процедуры flashsparky Общие вопросы Delphi 10 08.07.2010 14:32
CheckListBox checked iz zarosa marisham0612 Общие вопросы Delphi 1 18.12.2009 00:56
Как создать главное меню динамически Djonik Общие вопросы Delphi 3 17.02.2009 17:41
[VC#] DataGridView - DataGridViewCheckBoxColumn - Checked MuForum Общие вопросы .NET 0 07.06.2008 00:57