Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1247207187
Sw
2009-07-10 10:26
2009.09.13
WM_COPY WinApi


4-1216825292
Still Swamp
2008-07-23 19:01
2009.09.13
LogonUser


4-1215512670
AlexKung
2008-07-08 14:24
2009.09.13
MAPI: висяк при обрыве соединения


1-1214753592
Real
2008-06-29 19:33
2009.09.13
Нормальный ListBox или Grid


15-1247742042
Claus
2009-07-16 15:00
2009.09.13
Модераторам. Слегка изменить интерфейс





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