Как прокомментировал Кен, ваша проблема заключается в том, что вместо поиска редактора списка значений вы находите свою форму и затем настраиваете ее тип в редакторе списка значений, отсюда и AV.
Во-первых, вы передаете 'TForm' как 'lpClassName' в FindWindow
. Предполагая, что 'TForm' является именем класса вашей формы, он, конечно, найдет форму, а не дочернее окно в ней. Во-вторых, вы не можете использовать FindWindow
, чтобы найти дочернее окно, посмотреть его документацию, оно ищет окна верхнего уровня.
Если вы проверили возврат FindControl
, код, вызывающий AV, никогда не запустится:
if (Control <> nil) and (Control is TValueListEditor) then
Вы можете использовать FindWindowEx
для поиска в дочерних окнах, если вы не знаете дескриптор своей формы, сначала найдите его, как вы уже сделали:
FormHandle := FindWindow('TForm',PChar('(' + ExtractFileExt(Form1.Edit1.Text) + ')'));
if FormHandle <> 0 then
begin
Control := FindControl(FindWindowEx(FormHandle, 0, 'TValueListEditor', nil));
или, что еще лучше, сначала проверьте возврат FindWindowEx
, чтобы избежать передачи от 0 до FindControl
:
ValueListEditorHandle := FindWindowEx(FormHandle, 0, 'TValueListEditor', nil);
if Win32Check(ValueListEditorHandle <> 0) then
begin
Control := FindControl(ValueListEditorHandle);
if Assigned(Control) then
begin
...