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

Вниз

WM_COPY WinApi   Найти похожие ветки 

 
Sw   (2009-07-10 10:26) [0]

Добрый день! Мне нужно отменить в TCombobox операции копирования и вставки. Применяю вот такой код:
var OldWinProc:TFNWndProc;
function NewWindowProc(hWnd: HWND; msg: UINT; wParam: WPARAM;lParam:LPARAM): LRESULT; stdcall;
begin
 if (MSG=WM_COPY) or (MSG=WM_Paste) then exit;
 result:=CallWindowProc(OldWinProc,hWnd,Msg,wParam,lParam);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 OldWinProc:=TFNWndProc(SetWindowLong(ComboBox1.Handle,GWL_WNDPROC,
 longint(@NewWindowProc)));
end;


Для Edit работает, а для ComboBox не срабатывает (стиль НЕ =  CBS_DROPDOWNLIST)

Помогите, пожалуйста, разобраться.


 
clickmaker ©   (2009-07-10 11:47) [1]

> для ComboBox не срабатывает

потому что сообщение посылается не самому списку, а дочернему окну класса Edit
CB_GETCOMBOBOXINFO или FindWindowEx


 
Sw   (2009-07-13 06:39) [2]

Спасибочки, понимаю, что  TCombobox сложный компонент, а вот какой функцией подступиться к его Edit"у не знала. Работает!

hEdit:=FindWindowEx(CmbBox1.Handle, 0, "Edit", nil);


 
Sw   (2009-07-13 09:47) [3]

Подскажите, пожалуйста, как можно сделать тоже самое (т.е. отменить операции копирования и вставки) для всех ComboBox"coв на форме?


 
clickmaker ©   (2009-07-13 11:09) [4]

> для всех ComboBox"coв

for i := 0 to ControlCount-1 do begin
 if (Controls[i] is TComboBox) then
   ...


 
Sw   (2009-07-13 11:20) [5]

к сожалению не получается
я делаю так:

 for i := 0 to (PnlOsn1.ControlCount - 1) do
   if (PnlOsn1.Controls[i] is TComboBox) then
    begin
      hEdit:=FindWindowEx((PnlOsn1.Controls[i] as TComboBox).Handle,0,"Edit",nil);
      OldWndProcCmbBox:=TFNWndProc(SetWindowLong(hEdit,GWL_WNDPROC,longint(@NewWndProc CmbBox)));
    end;


последний комбобокс работает, а в предыдущие невозможно курсор установить


 
clickmaker ©   (2009-07-13 12:09) [6]

не уверен, но возможно из-за того, что OldWndProcCmbBox в итоге остается только для последнего комбобокса


 
Sw   (2009-07-14 06:39) [7]

может есть какие-нибудь соображения :-(


 
{RASkov} ©   (2009-07-14 09:24) [8]

> [7] Sw   (14.07.09 06:39)

Запоминать каждого комбобокса WinProc а затем вызывать в новой для каждого свою старую
var OldWndArrs: array of TWndProc;
в начале программы посчитать комбики и установить длину OldWndArrs.
Затем пробежаться по самим эти комбикам запомниы ихи OldWndArrs[i]:=TWinControl(Componens[k]).WinProc;
Ну и подправить NewWindowProc, где у каждого комбика вызывать свою старую OldWndArrs[i]

Как-то так.... наверное...



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

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

Наверх




Память: 0.48 MB
Время: 0.015 c
3-1227078955
pavel_guzhanov
2008-11-19 10:15
2009.09.13
как проверить, входит ли значение в набор данных?


2-1247507570
AlexDan
2009-07-13 21:52
2009.09.13
странички PageControl..


4-1217319477
Nucer
2008-07-29 12:17
2009.09.13
Достать текст из TStringGrid чужого окна


15-1247493335
Цукор5
2009-07-13 17:55
2009.09.13
Win2003 + запуск программы


15-1247783524
Aston
2009-07-17 02:32
2009.09.13
что обозначает DWORD*