PopUp меню, получить адрес объекта

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
&-rey
Сообщения: 10
Зарегистрирован: 08 авг 2008, 13:41

Popup меню, привязано к нескольким объектам (копировать вставить) У каждого объекта есть своя функция копирования или вставки.
По логике я думал что если бы знать объект на котором произошел popup то можно внаглую выполнить функцию связанную с этим объектом.

Поиском в инете нашел вот это

Код: Выделить всё

Label := PopupString.PopupComponent.Name;
выводит имя объкта на котором всплыло меню, но имя в ansiString, т.е. это не указатель на обьект.
Порылся в этом классе PopupComponent но ничего не нарыл.

Прошу совета как поступить, может я хочу невозможного ?
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

property PopupComponent: TComponent read FPopupComponent write FPopupComponent

никакое не строка, самый что ни наесть компонентный компонент ;)
Его только осталось привести к нужному типу и вперёд! :)
Изображение
&-rey
Сообщения: 10
Зарегистрирован: 08 авг 2008, 13:41

точно... куда я смотрел. Что то вчера не хотело работать, а оказалось все так просто. Спасибо.
Но возникла новая преграда.
При формировании функции обработки события onKeyDown по которой у меня обработка Cntrl + C и Cntrl + V
её прототип выглядит как:

Код: Выделить всё

void __fastcall TMainForm::TStringGridKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
проблему создает TShiftState
он описан как

Код: Выделить всё

#pragma option push -b-
enum Classes__1 { ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble };
#pragma option pop
typedef Set<Classes__1, ssShift, ssDouble>  TShiftState;
но никак не могу подсунуть ему ssCtrl;
на попытку сделать так

Код: Выделить всё

TShiftState Shift = ssCtrl;

[BCC32 Error] Main.cpp(854): E2034 Cannot convert 'Classes__1' to 'TShiftState'
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

&quot писал(а):не могу подсунуть ему ssCtr
если речь про проверку нажатия, то в Дельфи делается так
[syntax='Delphi']
procedure TfrMain.StringGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if ssCtrl in Shift then DoSomething;
end;
[/syntax]
т.е. проверяется константа на принадлежность множеству
Изображение
&-rey
Сообщения: 10
Зарегистрирован: 08 авг 2008, 13:41

нет, вопрос не в проверке, а в том чтобы вызвать эту функцию по соттветствующему пункту меню popup.
соответственно ей нужно передать в качестве параметров нажатый Сntrl и 'C'
с 'C' все понятно, а вот с Cntrl проблема.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Если я правильно понял, то TShiftState - это тип, созданный (описанный) на основе шаблона Set:

typedef Set<Classes__1, ssShift, ssDouble> TShiftState;

Т.е. надо посмотреть, как реализован Set, в частности, какие есть у него конструкторы. И соответствующим уже образом создавать экземпляр TShiftState. Примерно так:

TShiftState Shift (....параметры конструктора....);
&-rey
Сообщения: 10
Зарегистрирован: 08 авг 2008, 13:41

Нашел :) Пол дня поиска увенчались успехом.

Код: Выделить всё

ptr->OnKeyDown(ptr, Key, TShiftState() << ssCtrl);
Так это выглядит на С++.

Спасибо за поддержку.
sasha3050
Сообщения: 26
Зарегистрирован: 04 окт 2008, 23:13

Пожалуйста помогите очень нужно!!!!!!!!!Написать программу на Paskal, которая вычисляет среднюю длину слов в файле, который содержит текст.В данном случае будет считатьтся любая строка символов, которая начинается и заканчивается одним с следующих елеметов: пробел, запятая, точка, начало строки и конец строки.В программе должна быть обозначена функция, которая получает в качестве аргумента поток ввода с файла.
Ответить