Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.25;
Скачать: CL | DM;

Вниз

Работа с сообщением wm_LButtonDblClk объект класса TShellListView   Найти похожие ветки 

 
Student ©   (2009-08-29 21:12) [0]

Здравствуйте всемогущие All.
Столкнулся с задачей: "Навигация по каталогам и файлам". Выбрал компонент ShellListView. Сделал составной класс, вот код:

unit Unit2;

interface
uses
// system units
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Dialogs,
ExtCtrls, StdCtrls, IniFiles, Buttons,
// additional units
ShellCtrls;

type
 TArchiveReports = class(TObject)
 private
   pnlMain : TPanel;
   lvListView : TShellListView;
   procedure MesDblClick (var MyMessage : TWMMouse); message wm_LButtonDblClk;
 public
   constructor Create;
 end;

var
 ArchiveReports : TArchiveReports;
implementation

uses
 unit1;

constructor TArchiveReports.Create;
begin
 inherited Create;
 pnlMain := TPanel.Create(Form1);
 with pnlMain do
 begin
   Align := alTop;
   Height := 250;
   BevelWidth := 1;
   Font.Name := "Courier New";
   Font.Size := 12;
   Font.Style := [fsBold];
   Parent := Form1;
   Show;
 end;
 lvListView := TShellListView.Create(pnlMain);
 with lvListView do
 begin
   Width := pnlMain.Width div 2;
   Height := pnlMain.Height;
   Sorted := True;
   ReadOnly := False;
   HideSelection := False;
   TabOrder := 1;
   Parent := pnlMain;
   Color := clGray;
 end;
end;

procedure TArchiveReports.MesDblClick (var MyMessage : TWMMouse);
begin
 ShowMessage ("Хэллоу ворлд");
end;
end.

Я, конечно, писал
   lvListView.OnDblClick := MesDblClick;, но меня не устраивает данный обработчик, т.к. он после DblClick вызывает какае то другое сообщение, которое открывает файл. Т.е. мне как бы "перекрыть" надо это сообщение(которое DblClick). Спасибо


 
Student ©   (2009-08-29 21:23) [1]

Это сообщение в этом коде даже не вызывается....


 
KilkennyCat ©   (2009-08-30 08:33) [2]


> в этом коде даже не вызывается....

вызовется, если его получит TArchiveReports.

> Я, конечно, писал
>    lvListView.OnDblClick := MesDblClick;

если ты это писал, то зачем ловить мессагу?

Вообщем, и там и там наполовину :)

Создай наследника, да перекрой.


 
Student ©   (2009-08-30 12:23) [3]

Здравствуйте снова.
А я щас только что посмотрел код DblClick базового класса
procedure TCustomShellListView.DblClick;
begin
 if FAutoNavigate and (Selected <> nil) then
   with Folders[Selected.Index] do
     if IsFolder then
       SetPathFromID(AbsoluteID)
     else
       ShellExecute(Handle, nil, PChar(PathName), nil,
         PChar(ExtractFilePath(PathName)), 0);

 inherited DblClick;
end;

В этом коде мне как раз мешает ShellExecute. Может убрать вообще блок else и компилировать? Так не делается ведь?
Пс. Всё равно ни как не могу понять, как сообщение перекрыть :-(


 
KilkennyCat ©   (2009-08-30 13:13) [4]


> Может убрать вообще блок else и компилировать? Так не делается
> ведь?

портить генофонд чревато. могут несобраться прочие комопненты, использующие данное.

> как сообщение перекрыть

override


 
KilkennyCat ©   (2009-08-30 13:19) [5]

http://rsdn.ru/article/Delphi/Delphi_7_03.xml


 
Юрий Зотов ©   (2009-08-30 13:45) [6]

> Student ©   (29.08.09 21:12)  

А чего же Вы хотите от TShellListView? Он же не зря Shell
называется - вот и ведет себя подобно Проводнику.

На закладке Win 3.1 есть компоненты TDriveComboBox, TDirectoryListBox и TFileListBox. C их помощью навигация по дискам, каталогам и файлам делается за минуту.


 
Student ©   (2009-08-30 13:58) [7]

Юрий Зотов ©   (30.08.09 13:45) [6]
>А чего же Вы хотите от TShellListView? Он же не зря Shell
>называется - вот и ведет себя подобно Проводнику.

Вообщем какая задумка тут...Мне необходимо сделать навигацию по каталогу(там обычные текстовые файлы, типа отчётность :-) ). И нужно чтобы по DblClick этот текстовый файл открывался в моём поле Memo.

Я кидал код этого DblClick в [3]. Дело в том что, вместе с моим выводом в Memo, вызывается ещё и блокнот, открывающий мой файл. Это как бы не нужно мне, лишняя часть.

Ну и в недалёком будущем(через пару десятков часов), уберу лишние методы из выпадающего меню компонента ShellListView( такие как удалить, переименовать, переместить), ведь с отчётами так нельзя поступать :-)))


 
Юрий Зотов ©   (2009-08-30 14:17) [8]

> Student ©   (30.08.09 13:58) [7]

Прекрасно. Но непонятно - так что же мешает использовать компоненты Win 3.1 и сделать всю программу за 10 минут, написав при этом ровно 1 строчку кода:
Memo1.Lines.LoadFromFile(FileListBox1.FileName)

Вместо того, чтобы второй день мучаться с Shell...


 
Student ©   (2009-08-30 14:33) [9]

Да ужжжж, незнал... Пасибо вам Юрий. Незнал про такой компонент. Готовое решение


 
KilkennyCat ©   (2009-08-30 14:41) [10]

но с перекрытием все равно разберись. ибо не всегда [8] возможно.


 
Student ©   (2009-08-30 14:44) [11]

Константин - ок, я читаю вашу ссылку  в [5]. Пасибо


 
Student ©   (2009-09-01 11:32) [12]

Вчера разобрался окончательно, всё ещё проще оказалось,вкраце код:
TTest = class(TShellListView)
published
 WmLButtonDown(var Msg: TWMMouse); message WM_LButtonDblClk;
end;

var
 Test: TTest;

procedure TTest.WmLButtonDown(var Msg: TWMMouse);
begin
...мой код
end;

Test := TTest.Create(frmMain);
with Test do
begin
...установки всякие
end;


 
Сергей М. ©   (2009-09-01 11:39) [13]


> Student ©   (01.09.09 11:32) [12]


> разобрался окончательно


"Окончательно" будет тогда, когда будет понимание, почему класс TTest

TTest = class(TObject)
..
procedure WmLButtonDown(var Msg: TWMMouse); message WM_LButtonDblClk;
..
end;

никогда не получит сообщение WM_LButtonDblClk, если для этого не предпринять специальные меры.


 
KilkennyCat ©   (2009-09-01 12:09) [14]

о которых выше упоминалось


 
Student ©   (2009-09-01 12:19) [15]

Да, точно, если не наследоваться от чего то, что не имеет хэндла или контрола - не работает сообщение, как и в проблеме[1].


 
Сергей М. ©   (2009-09-01 12:38) [16]


> Student ©   (01.09.09 12:19) [15]


Обработчик события Application.OnMessage получает управление самым первым, т.е. до того как сообщение будет передано на обработку тому, кому оно адресовано.

Для "переадресации" этого сообщения на обработку требуемому объекту в обработчике Application.OnMessage нужно проделать следующее:

if (Msg.hWnd = хэндл_некоего_оконного_контрола) and (Msg.Message = WM_интересующее_сообщение_этому_контролу) then
begin
 Требуемый_объект.Dispath(Msg.Message);
 Handled := True;
end;



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

Текущий архив: 2009.10.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
4-1219915857
sniknik
2008-08-28 13:30
2009.10.25
Как узнать кем стартуется сервис...


15-1251125704
boriskb
2009-08-24 18:55
2009.10.25
Это что?


2-1251440566
kiki
2009-08-28 10:22
2009.10.25
Как сделать рандом значения от -20 до +20?


2-1251196735
D1987
2009-08-25 14:38
2009.10.25
TListView


15-1251387244
uw
2009-08-27 19:34
2009.10.25
Большой XML