Форум: "Начинающим";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c