IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Откуда вызвано PopUpMenu было... (https://www.imho.ws/showthread.php?t=59555)

Dragon31337 23.05.2004 16:05

Откуда вызвано PopUpMenu было...
 
Есть два Edit'а. Есть одно popupmenu, которое прицеплено к ним обоим.
Допусти, там есть очистить.
Как узнать какой Edit то мне чистить
Sender - это сам элемент PopUpMenu, он MenuItem...

Как мне узнать от какого edita он был вызван? Что-то типа такого
procedure TForm1.N4Click(Sender: TObject);
begin
(((Sender as TMenuItem).NaMneKliknuli) as TEdit).clear;
end;
Ответьте, пожайлуста!!!

ivahaev 23.05.2004 17:12

А разве Sender - это не то, что тебе нужно? По нему никак не определить?

Dragon31337 23.05.2004 17:23

Sender - TItemMenu. Так как на нем я кликаю... Я кликаю на элементе меню.

Dragon31337 23.05.2004 17:27

________________
|_TEdit__________|__
|Очистить <-Элемент меню (MenuItem) По нему кликаю.
| | <-PopUpMenu
|____________|
Как мне определить, от какого TEdit "выпала" менюшка?

Dragon31337 23.05.2004 17:28

Млин, о пробелы чистит!!!!!!!!!!!

ivahaev 23.05.2004 17:36

Я думаю, что тогда следует смотреть по фокусу. Т.е. если ты кликаешь на Edit, то в нем сейчас фокус находится.

PS. Зря ты так - три сообщения для одной мысли вставил! :headshot:

Dragon31337 23.05.2004 21:52

Ya dumal, chto kak ran'sh bylo pripishet (dobavleno cherz n minut).

Dragon31337 23.05.2004 22:33

Попробовал, не получается. Focused тот edit, в котором стоит курсор, а я в это время могу вызвать popup на другом а дейсвтия буду происходить с тем, в котором курсор...
Народ, ну вы чего, ни разу не сталкивались?

ivahaev 24.05.2004 07:55

Только что делал - всё ок!

Код:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    PopupMenu1: TPopupMenu;
    Clear1: TMenuItem;
    procedure Clear1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Clear1Click(Sender: TObject);
begin
  if Edit1.Focused then
      ShowMessage('Edit1 ') else ShowMessage('Edit2 ');
end;

end.


Даже если правишь всё в одном Edit, а кликаешь правой в другом, то все нормально определяется!

Dragon31337 24.05.2004 11:31

Ну не знаю, как у тебя, я писал тоже самое, так:

if Edit1.Focused then
Edit1.Clear
else
Edit2.Clear

Потом пишу текст в обоих. Оставляю курсор в первом, менюшку правым кликом на лругом, выбираю очистить и чистится первый, а не второй.
Пока вышел так:

На них обоих сделал один обработчки попапа
procedure TForm1.EditContextPopup(Sender: TObject; MousePos: TPoint;
var Handled: Boolean);
begin
PopUper:=(Sender as TEdit) //Запоминаем, у кого выпало меню
end;

а потом в функции PopUper.Clear

Но это не красиво. Не может быть, чтобы так оно было криво.

ivahaev 24.05.2004 11:52

Хм... только что тоже проверил - всё Ок!
А ты на чем пишешь? Какой дельфи? Какая виндовс?

Dragon31337 24.05.2004 13:11

Delphi 5.0 (build 5.2)
Win XP Pro SP1 Corp. Edition + MUI.
моя бы воля, я бы в C builder'е писал, но такое задание...

someone312002 24.05.2004 14:13

Ну, если ты знаешь, что попапменю прицеплено к едитам, то кто тебе мешает попробовать Sender as tedit ??? потом уже и работать с его пропертями...
Хотя, я могу и ошибаться...

ivahaev 24.05.2004 14:40

Я это в седьмой дельфе делал. к пятой, к сожалению, доступа не имею.
Поробуй в семерке...

f00rd 24.05.2004 18:06

А можно и легче:
(PopupMenu1.PopupComponent as TEdit).Clear;

или на любой случай:
(((Sender as TMenuItem).GetParentMenu as TPopupMenu).PopupComponent as TEdit).Clear;

:)

Dragon31337 24.05.2004 19:22

to someone312002
Sender тут TMenuItem, он никак к TEdit не приведется, выскочит ошибка приведения типов.
to f00rd
Сейчас попробую, хотя подобные конструкции уже рождались, но так же быстро и умирали....

someone312002 24.05.2004 20:40

в таком случае, используй свойство PopUpComponent. Взято со страницы http://infoprogram.narod.ru/Delphi/4/23.htm

ivahaev 25.05.2004 10:03

Точно!
Цитата:

property PopupComponent: TComponent ;

показывает, который из них инициировал меню (на котором был щелчок правой кнопки мыши). Если меню вызвано из метода Popup, значение этого свойства не определено, и присвоить ему значение должен сам прог*раммист.

Dragon31337 26.05.2004 12:32

Спасибо, ребят. А как теперь награды ставить?
Теперь кому не влом, гляньте сюды:
http://www.imho.ws/showthread.php?p=520812

ivahaev 26.05.2004 13:17

Рады помочь (хотя бы постараться). А по второму вопросу ничего не могу сказать - с картинками мало работал...

someone312002 26.05.2004 13:44

Ответил тебе в тему по имиджу...
Заходи ещё, чем сможем - тем поможем :о)


Часовой пояс GMT +4, время: 07:51.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.