Форум: "Начинающим";
Текущий архив: 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]
> разобрался окончательно
"Окончательно" будет тогда, когда будет понимание, почему класс TTestTTest = class(TObject)
никогда не получит сообщение WM_LButtonDblClk, если для этого не предпринять специальные меры.
..
procedure WmLButtonDown(var Msg: TWMMouse); message WM_LButtonDblClk;
..
end;
← →
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