我自己开发了一个类似combobox那样的控件,其中下拉选项是用form+listbox实现的

shixueli 2008-07-27 10:47:14
但是碰到一个问题就是显示下拉选项时,父窗口就变灰了,怎么能让下拉框正常显示父窗口又不会变灰呢?
...全文
135 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbyy1133 2009-01-16
  • 打赏
  • 举报
回复
支持
shixueli 2008-07-30
  • 打赏
  • 举报
回复
谢谢,研究一下先。
etomahawk 2008-07-28
  • 打赏
  • 举报
回复
show窗体的时候,让它SW_SHOWNOACTIVATE显示。

ShowWindow(form1.handle, SW_SHOWNOACTIVATE);
auuauu 2008-07-28
  • 打赏
  • 举报
回复
不要用form,这个肯定是不合适的,

你可以参考一下RAIZE的相关控件的源码,如果你想省点事情,你可以看一下
RAIZE控件包里面的TRzPopupPanel这个类,
完全满足你的要求,使用的方法如下:
procedure TRzDateTimeEdit.DisplayCalendar;
var
PopupPanel: TRzPopupPanel;
Calendar: TRzCalendar;
F: TCustomForm;
SaveAutoSelect: Boolean;
DT: TDateTime;
RangeCheck: Integer;
begin
SaveAutoSelect := AutoSelect;
AutoSelect := False;
try
F := GetParentForm( Self );
if F <> nil then
begin
PopupPanel := TRzPopupPanel.Create( Self );
try
Calendar := TRzCalendar.Create( PopupPanel );
Calendar.Parent := PopupPanel;

(*
// This is the kind of code that needs to be added to change the
// size of the calendar. Of course, would need to be more flexible.
Calendar.AutoSize := False;
Calendar.Width := 200;
Calendar.Height := 300;
*)

PopupPanel.Parent := F;
PopupPanel.Font.Name := Font.Name;
PopupPanel.Font.Color := Font.Color;

Calendar.IsPopup := True;
Calendar.ThemeAware := UseThemes;
Calendar.Color := Color;
Calendar.ButtonColor := FPopupButtonColor;
Calendar.ButtonFontColor := FPopupButtonFontColor;
Calendar.Elements := FCalendarElements;
Calendar.FirstDayOfWeek := FFirstDayOfWeek;
Calendar.CaptionClearBtn := FCaptionClearBtn;
Calendar.CaptionTodayBtn := FCaptionTodayBtn;

Calendar.OnGetBoldDays := FOnGetBoldDays;
Calendar.OnGetDayFormat := FOnGetDayFormat;
Calendar.OnGetWeekNumber := FOnGetWeekNumber;
Calendar.OnViewDateChange := FOnViewDateChange;
Calendar.Handle;

Calendar.MinDate := FMinDate;
Calendar.MaxDate := FMaxDate;

DT := GetDate;
if DT = 0 then
begin
Calendar.Date := SysUtils.Date;
end
else
begin
RangeCheck := DateInRange( DT );
if RangeCheck > 0 then
Calendar.Date := FMaxDate
else if RangeCheck < 0 then
Calendar.Date := FMinDate
else
Calendar.Date := DT;
end;

if FFrameVisible and not UseThemes and ( FFrameStyle = fsFlat ) or ( FFrameStyle = fsFlatBold ) then
begin
Calendar.BorderOuter := fsFlat;
Calendar.FlatColor := FFrameColor;
end;
Calendar.Visible := True;
Calendar.CalendarColors := FCalendarColors;
Calendar.OnClick := PopupPanel.Close;

// Setting FValidating to True before popping up calendar prevents the
// exceptions during reformatting if the current date is out of range
// when the focus is changed to the popup calendar.
FValidating := True;
try
if PopupPanel.Popup( Self ) then
begin
FDatePicked := True;
if Calendar.ClearClicked then
Clear
else
SetDate( Calendar.Date );
FDatePicked := False;
end;
finally
FValidating := False;
end;
finally
PopupPanel.Free;
end;
end;
finally
AutoSelect := SaveAutoSelect;
end;
end; {= TRzDateTimeEdit.DisplayCalendar =}
kugoo_2006 2008-07-28
  • 打赏
  • 举报
回复
你想实现什么功能
shixueli 2008-07-28
  • 打赏
  • 举报
回复
使用ShowWindow(form1.handle, SW_SHOWNOACTIVATE);后,显示出来的下拉列表一片白,列表中的值都没画出来。而且点击了一下之后,父窗体还是会失去焦点而变灰啊。

找一个类似的控件也很麻烦啊,我自己写的就剩下这个问题了。
mygodsos 2008-07-28
  • 打赏
  • 举报
回复
控件的编写不是像楼主这样的,要先找一个合适的祖先类继承,再具体实现。
你找两个控件堆在一块,从显示界面看似一个控件的方法是错误的。
kugoo_2006 2008-07-28
  • 打赏
  • 举报
回复
选好继承类先
kampan 2008-07-28
  • 打赏
  • 举报
回复
楼主在练习
jin20000 2008-07-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mygodsos 的回复:]
控件的编写不是像楼主这样的,要先找一个合适的祖先类继承,再具体实现。
你找两个控件堆在一块,从显示界面看似一个控件的方法是错误的。
[/Quote]

写控件还是要找到最适合的祖先才是写起来轻松又好用
dh9450 2008-07-28
  • 打赏
  • 举报
回复
呵呵 那就不要用form
直接用 LISTBOX
不过话说回来 你有空做这费里不讨好的事
不如去找找适合你的3方组件

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧