Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Объединить Grid & PopupMenu в одном компаненте [D7]


Layner ©   (2005-05-29 22:41:00) 

Вопрос 2, первый почему то закрыли. Возможно ли сделать компанент на основе грида, где уже был бы "вмонтирован" PopupMenu, и при добавлении колонок в гриде, в PopupMenu было столько же итемов, сколько колонок у грида.
Зачем: на этапе разработки очень много приходится делать действий, что бы сделать грид какой тебе надо, написать обработчик на PopupMenu в каждый итем, где выполняется процедура по опр. столбцу грида. Хотелось бы сделать свой компанент, и его потом использовать, для быстроты разработки приложений.


Layner   (2005-05-30 10:02:00) [1]

KilkennyCat ©   (30.05.05 09:52)
:) Сам знаю, а код тот же самый, ShowMessageFmt выдает только "Выключили.."


KilkennyCat   (2005-05-30 09:52:00) [2]

ужасть.

FChecked_ := not FChecked_;
If FChecked_ then ShowMessageFmt('Включили Checked %d', [FRow]) else ShowMessageFmt('Выключили Checked %d', [FRow]);


Layner   (2005-05-30 09:35:00) [3]

Пока все на StringGrid тренируюсь,

unit SuperCoolPopupMenu;

interface

uses
SysUtils, Classes, Menus, Grids, Dialogs;

type
TSuperCoolPopupMenuItem = class(TMenuItem)
private
  FRow: Integer;
  FChecked_: Boolean;
public
  property Row: Integer read FRow;
  property Checked_: Boolean write FChecked_;   //Показывает, вкл. или выкл Checked
  procedure Click; override;
end;

TSuperCoolPopupMenu = class(TPopupMenu)
private
  procedure MenuItemClick(Sender: TObject);
protected
  procedure DoPopup(Sender: TObject); override;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TSuperCoolPopupMenu]);
end;

{ TSuperCoolPopupMenu }

procedure TSuperCoolPopupMenu.DoPopup(Sender: TObject);
var
I, a : Integer;
Item : TSuperCoolPopupMenuItem;
begin
a:=(PopupComponent as TStringGrid).ColCount;

Items.Clear;
for I := 0 to a - 1 do
begin
  Item := TSuperCoolPopupMenuItem.Create(Self);
  Item.OnClick := MenuItemClick;
  Item.AutoCheck:=True;
  Item.Checked:=True;
  Item.FChecked_:=True;
  Item.FRow := I;
  Item.Caption := (PopupComponent as TStringGrid).Name+'/'+(PopupComponent as TStringGrid).Cells[i, 0];
  Items.Add(Item);
end;
inherited;

end;

procedure TSuperCoolPopupMenu.MenuItemClick(Sender: TObject);
begin

end;

procedure TSuperCoolPopupMenuItem.Click;
begin
 If FChecked_=True
  then
   begin
    FChecked_:=False;
    ShowMessageFmt('Выключили Checked %d', [FRow]);
   end
  else
   begin
    FChecked_:=True;
    ShowMessageFmt('Включили Checked %d', [FRow]);
   end;
inherited;
end;

end.


Код дорабатываю под свои нужды, хочу отработать Checked у Item, по умолчанию он включен, хотелось бы его по клику выключать, для это ввел переменную FChecked_: Boolean;, чтобы ее отслеживать, да вот что то не меняется она, в TSuperCoolPopupMenuItem.Click;подскажите плз, как можно обработать Checked?


Layner   (2005-05-30 08:19:00) [4]

GuAV ©   (30.05.05 00:12)
Вау, вообще супер что мне нужно! Благодарю, огромное спасибо. Сейчас перепишу все под свой DBGrid!


Defunct   (2005-05-30 04:06:00) [5]

у StringGrid есть свойство PopupMenu...


GuAV   (2005-05-30 00:12:00) [6]

Зарегить, кинуть на форму, назначить нужному гриду.

unit SuperCoolPopupMenu;

interface

uses
 SysUtils, Classes, Menus, Grids, Dialogs;

type
 TSuperCoolPopupMenuItem = class(TMenuItem)
 private
   FRow: Integer;
 public
   property Row: Integer read FRow;
   procedure Click; override;
 end;

 TSuperCoolPopupMenu = class(TPopupMenu)
 private
   procedure MenuItemClick(Sender: TObject);
 protected
   procedure DoPopup(Sender: TObject); override;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('Samples', [TSuperCoolPopupMenu]);
end;

{ TSuperCoolPopupMenu }

procedure TSuperCoolPopupMenu.DoPopup(Sender: TObject);
var I: Integer; S: TStrings; Item: TSuperCoolPopupMenuItem;
begin
 with (PopupComponent as TStringGrid) do
   with ScreenToClient(PopupPoint) do
     S := Cols[MouseCoord(X, Y).X];
 Items.Clear;
 for I := 0 to S.Count - 1 do
 begin
   Item := TSuperCoolPopupMenuItem.Create(Self);
   Item.OnClick := MenuItemClick;
   Item.FRow := I;
   Item.Caption := S[I];
   Items.Add(Item);
 end;
 inherited;
end;

procedure TSuperCoolPopupMenu.MenuItemClick(Sender: TObject);
begin
end;

procedure TSuperCoolPopupMenuItem.Click;
begin
 ShowMessageFmt('Click at %d', [FRow]);
 inherited;
end;

end.


KilkennyCat   (2005-05-29 23:30:00) [7]

Возможно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо