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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2013, 17:17   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию В цикле добавить пункты в меню и узнать, какой из них был нажат

Здравствуйте. Давно ищу такую тему.
вот код VCL:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure MenuClick(sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    mnu : TPopupMenu;
    mi : TMenuItem;
    { Private declarations }
  public
    { Public declarations }
  end;

const
  MyTag = 666;

var
  Form1: TForm1;
  fn : string;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  t : string;
  i : Integer;
  f : TextFile;
begin
  fn := 'c:\txt.txt';
  AssignFile(f,fn);
  Rewrite(f);
  for i:=0 to 19 do
    Writeln(f,'Item '+inttostr(i+1));
  CloseFile(f);
  mnu := TPopupMenu.Create(nil);
  AssignFile(f,fn);
  Reset(f);
  while not eof(f) do
    begin
      Readln(f,t);
      mi := TMenuItem.Create(nil);
      mi.Caption := t;
      mi.Tag := MyTag;
      mi.OnClick := MenuClick;
      mnu.Items.Add(mi);
    end;
  CloseFile(f);
//  mnu.Popup(Left,top);
end;

procedure tform1.MenuClick(sender: TObject);
var
  t : string;
  tag : Integer;
begin
  tag := (sender as TMenuItem).Tag;
  if tag=mytag then
  begin
    t := (sender as TMenuItem).Caption;
    ShowMessage(t);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  mnu.Free;
  DeleteFile(fn);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  p : TPoint;
begin
  if Button = mbright then
  if GetCursorPos(p) then
  mnu.Popup(p.X,p.Y);
end;

end.
Действия:
1) Создаём текстовый файл и пишем туда список из N строчек.
2) Создаем TPopupMenu;
3) Читаем тот же текстовый файл и в цикле создаем TMenuItem и вешаем на каждый обработчик щелчка.
4) В обработчике определяем, какой пункт был нажат.

А как написать такое на WinAPI? С апишными меню работать умею, но как быть с циклом? Возможно ли вообще сделать такое на WinAPI?
BLACK_RAIN вне форума Ответить с цитированием
Старый 29.03.2013, 18:28   #2
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Возможно ли вообще сделать такое на WinAPI?
Твой VCL как раз таки и использует WinAPI функции, так что возможно.
hvz- вне форума Ответить с цитированием
Старый 29.03.2013, 18:34   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от hvz- Посмотреть сообщение
Твой VCL как раз таки и использует WinAPI функции, так что возможно.
но как это делается?
BLACK_RAIN вне форума Ответить с цитированием
Старый 29.03.2013, 21:03   #4
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
но как это делается?
Если есть исходники этой библиотеки - можешь посмотреть как. Или полистай пару функций, относящихся по теме, и к тебе придёт "озарение"
hvz- вне форума Ответить с цитированием
Старый 30.03.2013, 11:39   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от hvz- Посмотреть сообщение
Если есть исходники этой библиотеки - можешь посмотреть как. Или полистай пару функций, относящихся по теме, и к тебе придёт "озарение"
ну нормально
по сути, это означает, что я должен перелопатить несколько тысяч строчек кода в файле Menus.pas и вникнуть в принципы работы VCL.
Вы понимаете, какую задачу передо мной ставите? мне для этого пива не хватит
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.03.2013, 12:03   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
это означает, что я должен перелопатить
Ты хочешь чтоб другие за тебя лопатили?
Цитата:
А как написать такое на WinAPI?
Зачем?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2013, 15:46   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ты хочешь чтоб другие за тебя лопатили?
Я хочу получить нормальный ответ на нормальный вопрос, а не троллинг типа "я знаю, но не скажу!".
Цитата:
Сообщение от Stilet Посмотреть сообщение
Зачем?
а вы зачем спрашиваете?
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.03.2013, 16:04   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а вы зачем спрашиваете?
Понятно. Больше отвлекать не буду.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2013, 16:09   #9
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Понятно. Больше отвлекать не буду.
с логикой не поспоришь.
BLACK_RAIN вне форума Ответить с цитированием
Старый 31.03.2013, 14:31   #10
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

блин! а про сообщение WM_MENUCOMMAND сразу нельзя было сказать??? Я сегодня каким-то образом совершенно случайно на него наткнулся.
конечно, проще было бы изучать исходники VCL

Последний раз редактировалось BLACK_RAIN; 31.03.2013 в 16:09.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неактивные пункты меню в Qt creator Alendorff Qt и кроссплатформенное программирование С/С++ 5 19.03.2013 16:36
Лишние пункты меню HellMercenariess Общие вопросы Delphi 3 20.09.2012 17:11
Русифицировать пункты меню печати artemavd Общие вопросы Delphi 10 26.03.2010 08:49
Удалиь пункты в контекстном меню Altera Свободное общение 0 06.08.2009 09:21
Пункты меню Run... Roof Общие вопросы Delphi 1 25.08.2008 14:45