Форум: "Основная";
Текущий архив: 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