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

Вниз

Работа с сообщением 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.039 c
1-1220736884
Дмитрий Белькевич
2008-09-07 01:34
2009.10.25
Размещение файлов в Висте


15-1251469925
Suspended
2009-08-28 18:32
2009.10.25
Про мошенничество


15-1251525036
TUser
2009-08-29 09:50
2009.10.25
Умный хостинг?


15-1251149186
KilkennyCat
2009-08-25 01:26
2009.10.25
Что может быть причиной удаления файлов на XFS


3-1228665526
Guest
2008-12-07 18:58
2009.10.25
DBGrid по образу и подобию инспектора объектов.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский