Главная страница
    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.049 c
2-1250691718
DimDim
2009-08-19 18:21
2009.10.25
Сохранение в ini


2-1251099283
abhtr
2009-08-24 11:34
2009.10.25
CreateProcess


11-1207080572
Lotos
2008-04-02 00:09
2009.10.25
Заполнение данных в mdvXLGrid


2-1251155492
sanx
2009-08-25 03:11
2009.10.25
Реализация списка в многопоточном приложении


2-1251091182
Interesting
2009-08-24 09:19
2009.10.25
Как возвести число в степень?





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