我正在使用Delphi 5,需要在运行时创建多个面板,然后在这些面板上再次创建按钮。我需要以这种方式进行,因为未来可能需要动态创建更多的面板/按钮组合。
我可以完成所有这些操作,但是我无法引用已创建的面板,因为我找不到访问面板组件名称的方法。在互联网上搜索后,我发现可以使用FindComponent通过名称查找面板组件,但我仍然不知道如何使用该名称,因为我不能使用字符串变量来引用它-例如,StringVar:= Panel.Name。我会得到类型不匹配的错误,TComponentName与String。
我在创建面板的同时创建了每个面板的按钮。简化后,代码如下:
我可以完成所有这些操作,但是我无法引用已创建的面板,因为我找不到访问面板组件名称的方法。在互联网上搜索后,我发现可以使用FindComponent通过名称查找面板组件,但我仍然不知道如何使用该名称,因为我不能使用字符串变量来引用它-例如,StringVar:= Panel.Name。我会得到类型不匹配的错误,TComponentName与String。
我在创建面板的同时创建了每个面板的按钮。简化后,代码如下:
With TypeQuery do begin // Create Panels
First;
While (not eof) do begin // create the actual panel
panelno := FieldByName('Product_type_id').AsInteger;
pnl := Tpanel.Create(Self);
pnl.name := FieldByName('PanelName').AsString;
pnl.color := clInactiveCaption;
pnl.parent := MainForm;
pnl.width := 365;
pnl.Height := 551;
pnl.left := 434
pnl.top := 122;
pnl.caption := '';
With ButtonQuery do begin
Close;
Parameters.parambyname('PanelID').Value := PanelNo;
Open;
First;
While (not eof) and (FieldByName('Product_type_id').AsInteger = PanelNo) do begin //put the buttons on it.
btnName := FieldByName('ButtonName').AsString;
BtnText := FieldByName('ButtonText').AsString;
BtnGroup := FieldByName('Product_Group_ID').AsString;
GrpColour := FieldByName('ButtonColour').AsString;
btn := TColorButton.Create(Self);
btn.Parent := pnl;
btn.Name := BtnName;
Btn.backcolor := HexToTColor(GrpColour);
btn.Font.Name := 'Arial Narrow';
btn.Font.Style := [fsBold];
btn.Font.Size := 10;
. . .
end;
. . .
end;
end;
我在几个论坛上(包括这个)看到过,没有直接按名称引用面板的方法。我尝试使用组件数组,但遇到同样的问题 - 我需要通过分配给它的组件名称来引用组件。
好吧,我不是高手程序员 - 多年来我一直使用Delphi创建简单的程序,但这个程序要复杂得多。我以前从未使用过运行时组件创建。
我能否使用FindComponent将面板设置为可见或不可见?如果可以,请根据上面所示,给我提供逐步进行的方法。
提前致谢...