![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Объединить 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]Возможно.