사용자 정의 레코드를 사용하여 포인터 주위에 머리를 가져 와서 레코드 배열을 만든 다음 해당 레코드에 대한 포인터를 만들 수 없습니다. 구체적으로는 각 최상위 창에 대한 레코드를 만드는 것입니다 주어진 클래스 이름으로 처리합니다. 각 윈도우에 대해 하나 이상의 의미가 있습니다. EnumChildWindow
을 사용하여 하위 윈도우 핸들을 얻습니다. 각각의 레코드를 만들고 제목이있는 콤보 박스에 전달하고 레코드를 만들고 싶습니다. 해당 항목의 객체이므로 나중에 각 항목을 선택하여 액세스 할 수 있습니다.델파이 포인터, 배열, 핸들
내 문제는 포인터 처리 중입니다. 배열 레코드 중 하나를 추가하는 첫 번째 인스턴스에서 계속 액세스가 거부됩니다. 여기
휴식
Param[Form1.iEnumWin].MainHwnd:= aHwnd;
는 여기에 지금 사람들이 내가 뭘하려고 오전에 대한 더 나은 이해를 얻을 수 있습니다 사용하고있는 전체 코드입니다. 사람이 올바른 방향으로 (의도 웃기) 날 지점 수없는 경우
implementation
{$R *.dfm}
type
TMyEnumParam = record
sTitle: String;
MainHwnd: Hwnd;
InTxtHwnd: Hwnd;
OutTxtHwnd: Hwnd;
NickListHwnd: Hwnd;
end;
PMyEnumParam = ^TMyEnumParam;
type
ATMyEnumParam = Array[0..9] of PMyEnumParam;
PATMyEnumParam = ^ATMyEnumParam;
{ Get the window Title based on Hwnd }
function GetWindowTitle(HWND: HWND): string;
begin
SetLength(Result, 255);
SetLength(Result, GetWindowText(HWND, PChar(Result), 255));
end;
{ Get the Classname based on Hwnd }
function GetWindowClass(HWND: HWND): string;
begin
SetLength(Result, 255);
SetLength(Result, GetClassName(HWND, PChar(Result), 255));
end;
{ EnumChildWidows Callback Add to our records }
Function EnumChildProc(aHwnd: Hwnd; Param: PMyEnumParam): Boolean; stdcall;
begin
if ((GetDlgCtrlID(aHwnd) = 202) and (isWindowVisible(aHwnd) = True)) then
Param.InTxtHwnd:= aHwnd;
if ((GetDlgCtrlID(aHwnd) = 203) and (isWindowVisible(aHwnd) = True)) then
Param.OutTxtHwnd:= aHwnd;
if ((GetDlgCtrlID(aHwnd) = 1789) and (isWindowVisible(aHwnd) = True)) then
Param.NickListHwnd:= aHwnd;
Result:= True;
end;
{ EnumWindow fill our array of records for each window }
function EnumWindowsProc(aHwnd: HWND; Param: PATMyEnumParam): BOOL; stdcall;
begin
Result := True;
if GetWindowClass(aHwnd) = 'DlgGroupChat Window Class' then
begin
Param[Form1.iEnumWin].MainHwnd:= aHwnd;
Param[Form1.iEnumWin].sTitle:= GetWindowTitle(aHwnd);
EnumChildWindows(aHwnd, @EnumChildProc, LParam(@Param[Form1.iEnumWin]));
Form1.cbbRooms.AddItem(Param[Form1.iEnumWin].sTitle, TObject(Param[form1.iEnumWin]));
inc(Form1.iEnumWin);
end;
end;
{ On change display room Title for each item }
procedure TForm1.cbbRoomsChange(Sender: TObject);
var
i: Integer;
aHwnd: PMyEnumParam;
begin
i := cbbRooms.ItemIndex;
if cbbRooms.ItemIndex <> -1 then
begin
aHwnd:= PMyEnumParam(cbbRooms.Items.Objects[i]);
if aHwnd.MainHwnd > 0 then
begin
ShowMessage(aHwnd.sTitle);
end;
end;
end;
{ Call EnumWindows and fill our array records }
procedure TForm1.FormCreate(Sender: TObject);
var
arInfo: PATMyEnumParam;
begin
iEnumWin:= 0;
EnumWindows(@EnumWindowsProc, LParam(@arInfo));
end;
나는 감사하게 될 것이다.
뻔뻔한 플러그이지만 포인터가 없어지면 http://rvelthuis.de/articles/articles-pointers.html을 읽어보십시오. 데이빗은 이미 당신의 코드에 무엇이 잘못되었는지를 말했습니다. –