Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];

Вниз

Правая кнопка мыши   Найти похожие ветки 

 
borg   (2003-09-12 08:04) [0]

Как узнать по какому из компонентов был сделан правый клик.


 
il_   (2003-09-12 08:52) [1]

вообще активный компонент определяется свойством Setfocus=true
но по моему внутри OnClick каждого компонента можно обработать кака из кнопок мыши нажата


 
borg   (2003-09-12 08:55) [2]

А если на форме 20 компонентов и всем обрабатывать OnClick?
Не красиво получается.


 
Zergling   (2003-09-12 09:02) [3]

C Delphi 6 кажися уже идет TApplicationEvents (хотя можно и без него). Ловии сообщение и хендл (если надо - Msg.hwnd) от кого прилетело сообщение
if Msg.message = WM_RBUTTONDOWN then ...

Но есть одно но, не все компоненты могут иметь хендл поэтому второй вариант через Sender и Tag компонентов


 
borg   (2003-09-12 09:13) [4]

>>Zergling ©
У меня используется Image у него нет св-ва setfocus. Можно былобы через него обработать.
>>if Msg.message = WM_RBUTTONDOWN then ...
Надо сделать правый клик по любому из рисунков и что бы он скопировал этот рисунок в заданную папку. А вот как определить по какому из рисунков был сделан правый клик.


 
pasha_676   (2003-09-12 09:23) [5]


> Надо сделать правый клик по любому из рисунков и что бы
> он скопировал этот рисунок в заданную папку. А вот как определить
> по какому из рисунков был сделан правый клик.

Ответ уже был:

> второй вариант через Sender и Tag компонентов


 
Adil   (2003-09-12 09:28) [6]

>Ответ уже был:

> второй вариант через Sender и Tag компонентов

Sender в этом случае является правый клик мышки а не имадж. ятак пробывал:
procedure TForm2.N2Click(Sender: TObject);
var sors:byte; imag:timage;
begin
sors:=(TComponent(Sender).Tag); //Берётся TAG N2Click
imag:=FindComponent("image"+inttostr(sors)) as timage;


 
FoxBox   (2003-09-12 09:46) [7]

На самой форме есть события "OnMouseDown" А уж по координатам найти компонент, по которому клацнули крысом...


 
Zergling   (2003-09-12 09:50) [8]

Adil (12.09.03 09:28) [6]

sors:=(TComponent(Sender).Tag); //Берётся TAG N2Click
imag:=FindComponent("image"+inttostr(sors)) as timage;

Нужно следить за уникальностью имен
сделаем так:

if (Sender is TImage) then
case (Sender as TImage).Tag of
0: ...;
1: ...;
end;

FoxBox (12.09.03 09:46) [7]

Очень геморойно :)


 
афвуд   (2003-09-12 10:45) [9]

>На самой форме есть события "OnMouseDown"
>А уж по координатам найти компонент, по
>которому клацнули крысом.
Форма этот клик не отловит

Я писал прогу в CBuilder"e и делал так же как и Zergling © (12.09.03 09:50) [8] только брал TComponent вместо Timage и он отлавливал все клики на всех компонентах. А уж потом можно и по имени найти ведь у (Sender as TComponent) есть свойство Name!


 
pasha_676   (2003-09-12 11:21) [10]


> только брал TComponent вместо Timage и он отлавливал все
> клики на всех компонентах. А уж потом можно и по имени найти
> ведь у (Sender as TComponent) есть свойство Name!


Найти можно и по тагу.
Нужды в вещах нахождения имени компонента и его типа абсолютно нет.
Ибо создаем имадж, таг, и имажду присваиваем обработчик нажатия клавиши (он пишется только для имаджей). Т.о. автоматом только по клику на имаджи мы окажемся в этом обработчике. А по тагу определим - какой именно имадж. Все очень и очень просто. Имхо.


 
афвуд   (2003-09-12 11:32) [11]

Очень просто, но ведь у нас есть FindComponent у формы. Он как раз ищет компонент по имени. И так ещё проще.


 
pasha_676   (2003-09-12 11:43) [12]


> Очень просто, но ведь у нас есть FindComponent у формы.
> Он как раз ищет компонент по имени. И так ещё проще.

Если ты описываешь свою прогу, то да. Если согласно сабжа - то FindComponent там просто не нужен. Зачем что то искать выяснять какое то имя формы, когда можно сделать все через TComponent(Sender). Смысла нет.


 
borg   (2003-09-12 11:44) [13]

Всё что вы понаписали я пробовал ни чего не получается. Как определить на какой рисунок нажали правой кнопкой мышки.


 
афвуд   (2003-09-12 11:55) [14]

А как именно ты сделал?


 
BOA_KAA   (2003-09-12 11:55) [15]

Переделывать под твои нужды мне лень. Смотри элементарный пример, который я делал когда-то. Фишка для просмотра рисунков.
Есть там пример, как отловить OnClick на куче Image"ев, которые помещены на ScrollBox.

unit MainU;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, JPEG, Masks, Menus, DirU, StdCtrls;

type
TImages = array of TImage;
TfmMain = class(TForm)
plMain: TPanel;
sbDraft: TScrollBox;
imgMain: TImage;
pmMain: TPopupMenu;
pmChange: TMenuItem;
pmReturn: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
imgArr: TImages;
FileList: TStringList;
Count: Integer;
Path: String;
procedure ImageClick(Sender: TObject);
procedure FindFiles(StartFolder, Mask: String; List: TStrings;
ScanSubFolders: Boolean = True);
procedure SetImages;
procedure DrawImage(Num: Integer);
procedure ClearImage;
end;

var
fmMain: TfmMain;

implementation

{$R *.dfm}

const imgSize = 80; // длина и ширина рисунка

procedure TfmMain.FindFiles(StartFolder, Mask: String; List: TStrings;
ScanSubFolders: Boolean = True);
var
SearchRec: TSearchRec;
FindResult: Integer;
begin
Application.ProcessMessages;
List.BeginUpdate;
try
{$IFDEF MSWINDOWS}
StartFolder:=IncludeTrailingBackslash(StartFolder);
{$ENDIF}
FindResult:=FindFirst(StartFolder+"*.*", faAnyFile, SearchRec);
try
while FindResult = 0 do
with SearchRec do
begin
if (Attr and faDirectory) <> 0 then
begin
if (ScanSubFolders = True) and (Name <> ".") and (Name <> "..") then
FindFiles(StartFolder+Name, Mask, List, ScanSubFolders);
end
else
begin
if MatchesMask(Name, Mask) then
List.Add(StartFolder+Name);
end;
FindResult:=FindNext(SearchRec);
end;
finally
FindClose(SearchRec);
end;
finally
List.EndUpdate;
end;
Application.ProcessMessages;
end;

procedure TfmMain.DrawImage(Num: Integer);
var
jpg: TJPEGImage;
mf: TMetafile;
begin
if ExtractFileExt(FileList.Strings[Num]) = ".jpg" then
begin
jpg:=TJPEGImage.Create;
jpg.LoadFromFile(FileList.Strings[Num]);
// Ели рисунок небольшой, то стречить его не будем
if (jpg.Width < plMain.Width) and (jpg.Height < plMain.Height) then
imgMain.Stretch:=False
else
imgMain.Stretch:=True;
// Запоминаем текущий номер рисунка
imgMain.Tag:=Num;
imgMain.Picture.Assign(jpg);
jpg.Free;
Caption:="ImageView - "+ExtractFileName(FileList.Strings[Num]);
end
else
begin
mf:=TMetafile.Create;
//imgMain.Picture.LoadFromFile(FileList.Strings[Num]);
mf.LoadFromFile(FileList.Strings[Num]);
// Ели рисунок небольшой, то стречить его не будем
if (mf.Width < plMain.Width) and (mf.Height < plMain.Height) then
imgMain.Stretch:=False
else
imgMain.Stretch:=True;
// Запоминаем текущий номер рисунка
imgMain.Tag:=Num;
imgMain.Picture.Assign(mf);
mf.Free;
Caption:="ImageView - "+ExtractFileName(FileList.Strings[Num]);
end;
end;

procedure TfmMain.ClearImage;
begin
imgMain.Canvas.Brush.Color:=imgMain.Parent.Brush.Color;
imgMain.Canvas.Pen.Color:=imgMain.Parent.Brush.Color;
imgMain.Canvas.FillRect(imgMain.ClientRect);
end;

procedure TfmMain.ImageClick(Sender: TObject);
begin
DrawImage((Sender as TImage).Tag);
end;

procedure TfmMain.FormCreate(Sender: TObject);
begin
fmMain.WindowState:=wsMaximized;
Screen.Cursor:=crHourGlass;
// Хранилище для имен файлов
FileList:=TStringList.Create;
// Путь к .exe для поиска
Path:=ExtractFilePath(Application.ExeName);
// Ищем файлы
FindFiles(Path, "*.jpg", FileList, True);
FindFiles(Path, "*.wmf", FileList, True);
FindFiles(Path, "*.emf", FileList, True);
// Число файлов
Count:=FileList.Count;
// Прорисовываем
SetImages;
if Count > 0 then DrawImage(0);
Screen.Cursor:=crDefault;
end;

procedure TfmMain.FormDestroy(Sender: TObject);
var
i: Integer;
begin
FileList.Free;
for i:=0 to Count-1 do imgArr[i].Free;
imgArr:=nil;
end;

procedure TfmMain.SetImages;
var
i, Left: Integer;
jpg: TJPEGImage;
begin
if Count < 1 then
begin
ShowMessage("I did not locate any image");
Exit;
end;
// Длина массива рисунков
SetLength(imgArr, Count);
jpg:=TJPEGImage.Create;
try
// Создаем Image"ы
for i:=0 to Count-1 do
begin
imgArr[i]:=TImage.Create(sbDraft);
imgArr[i].Parent:=sbDraft;
imgArr[i].Name:="Image"+IntToStr(i);
imgArr[i].Tag:=i; // по Tag будем узнавать в какой кликнули
imgArr[i].Cursor:=crHandPoint;
imgArr[i].Stretch:=True;
imgArr[i].Proportional:=True;
imgArr[i].Center:=True;
imgArr[i].ShowHint:=True;
imgArr[i].Hint:=FileList.Strings[i];
Left:=i*imgSize+(i+1)*10; // отступ от предыдущего рисунка
imgArr[i].SetBounds(Left, 10, imgSize, imgSize);
try
if ExtractFileExt(FileList.Strings[i]) = ".jpg" then
begin
jpg.LoadFromFile(FileList.Strings[i]);
imgArr[i].Picture.Assign(jpg);
end
else
begin
imgArr[i].Picture.LoadFromFile(FileList.Strings[i]);
end;
except
Continue;
end;
imgArr[i].OnClick:=ImageClick;
imgArr[i].PopupMenu:=pmMain;
end;
finally
jpg.Free;
end;
end;

procedure TfmMain.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
if imgMain.Tag = 0 then Exit;
DrawImage(imgMain.Tag-1);
end;

procedure TfmMain.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
if imgMain.Tag = Count-1 then Exit;
DrawImage(imgMain.Tag+1);
end;

procedure TfmMain.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_LEFT:
begin
if imgMain.Tag = 0 then Exit;
DrawImage(imgMain.Tag-1);
end;
VK_DOWN:
begin
if imgMain.Tag = 0 then Exit;
DrawImage(imgMain.Tag-1);
end;
VK_UP:
begin
if imgMain.Tag = Count-1 then Exit;
DrawImage(imgMain.Tag+1);
end;
VK_RIGHT:
begin
if imgMain.Tag = Count-1 then Exit;
DrawImage(imgMain.Tag+1);
end;
VK_ESCAPE: Close;
end;
end;

end.


 
BOA_KAA   (2003-09-12 11:57) [16]

Удалено модератором


 
BOA_KAA   (2003-09-12 11:58) [17]

Странно... А почему 2 раза?


 
Плохиш_   (2003-09-12 12:00) [18]

>borg

onMouseDown, onMouseUp

2borg (12.09.03 08:55) [2]
Не понял, что некрасивого в одном методе?


 
Zergling   (2003-09-12 12:00) [19]

borg (12.09.03 11:44) [13]

Код пожалуйста.

афвуд © (12.09.03 11:32) [11]

Повторусь еще раз, по имени - нужно следить за созданием уникальности имени (Find ... он и работатет скорей всего медлеенее, через Tag быстрее и надежнее).


 
borg   (2003-09-12 12:07) [20]

Может я не понятно написал. Нажимаем правой кнопкой по имаджу вызывается попап меню и там функции открыть , скопировать и т. д. поэтому посылает событие нажатия не имадж а N1Click, необходимо выяснить по какому именно рисунку был правый клик.


 
Zergling   (2003-09-12 12:17) [21]

>> вызывается попап меню и там функции открыть

А сразу про него чего не упомянул? %-(


 
borg   (2003-09-12 12:18) [22]

Да что то зациклился правая кнопка, правая кнопка


 
Zergling   (2003-09-12 12:29) [23]

Предлагаю такой вариант (наскоряк - бошка пока не соображает - помеха C2H5OH)

var
TmpObj: TObject;

В Image1.OnMouseUp или Image1.OnMouseDown
TmpObj := Sender;

В PopupMenu1.OnClick

if (TmpObj is TImage) then
case (TmpObj as TImage).Tag of
0: ...;
1: ...;
end;

Следовательно у всех TImage свои уникальные Tag


 
borg   (2003-09-12 12:31) [24]

>>Zergling ©
большое спасибо вроде всё работает.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.012 c
6-82363
clim
2003-07-23 00:20
2003.09.25
connect function


1-82293
Zeratul
2003-09-14 23:01
2003.09.25
Подсветка синтаксиса в TRichEdit.


1-82238
drakulita
2003-09-11 17:31
2003.09.25
Премещение файла


1-82311
Дубинин Алексей
2003-09-13 22:41
2003.09.25
Ошибка в программе


4-82533
miwa
2003-07-25 11:56
2003.09.25
Как можно (если можно) использовать вывод функции Win32Check





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский