(德尔福XE使用)添加的按钮不会消失。在按钮OnClick处理程序是一个Sender.Free。然而(当列表行因为填充列表视图的数据集被更新而消失时),当按钮应该消失时,按钮仍然在列表视图中。我究竟做错了什么?德尔福的TListView当“免费”被称为
这里是我的代码,显示按钮的创建,以及的OnClick它要被释放:
(在另一方面,我知道它不是很好的做法,在其事件摧毁一个组件。处理程序是,什么是错在这里您能否提供另一种方法来删除的按钮)
procedure TfMain.actWaitListExecute(Sender: TObject);
var
li: TListItem;
s: string;
btRect: TRect;
p: PInteger;
begin
lstWaitList.Items.Clear;
lstWaitList.Clear;
with uqWaitList do
begin
if State = dsInactive then
Open
else
Refresh;
First;
while not EOF do
begin
li := lstWaitList.Items.Add;
s := MyDateFormat(FieldByName('VisitDate').AsString);
li.Caption := s;
New(p);
p^ := FieldByName('ROWID').AsInteger;
li.Data := p;
s := MyTimeFormat(FieldByName('InTime').AsString);
li.SubItems.Add(s);
li.SubItems.Add(FieldByName('FirstName').AsString + ' ' +
FieldByName('LastName').AsString);
// li.SubItems.Add(FieldByName('LastName').AsString);
with TButton.Create(lstWaitList) do
begin
Parent := lstWaitList;
btRect := li.DisplayRect(drBounds);
btRect.Left := btRect.Left + lstWaitList.Column[0].Width +
lstWaitList.Column[1].Width + lstWaitList.Column[2].Width;
btRect.Right := btRect.Left + lstWaitList.Column[3].Width;
BoundsRect := btRect;
Caption := 'Check Out';
OnClick := WaitingListCheckOutBtnClick;
end;
Next;
end;
end;
end;
procedure TfMain.lstWaitListDeletion(Sender: TObject; Item: TListItem);
begin
Dispose(Item.Data);
end;
procedure TfMain.WaitingListCheckOutBtnClick(Sender: TObject);
var
SelROWID, outtime: integer;
x: longword;
y: TPoint;
h, mm, s, ms: word;
begin
y := lstWaitList.ScreenToClient(Mouse.CursorPos);
// Label23.Caption := Format('%d %d', [y.X, y.y]);
x := (y.y shl 16) + y.X;
PostMessage(lstWaitList.Handle, WM_LBUTTONDOWN, 0, x);
PostMessage(lstWaitList.Handle, WM_LBUTTONUP, 0, x);
Application.ProcessMessages;
SelROWID := integer(lstWaitList.Selected.Data^);
// ShowMessage(IntToStr(SelROWID));
with TfCheckOut.Create(Application) do
begin
try
if ShowModal = mrOk then
begin
decodetime(teTimeOut.Time, h, mm, s, ms);
outtime := h * 100 + mm;
uqSetOutTime.ParamByName('ROWID').Value := SelROWID;
uqSetOutTime.ParamByName('OT').Value := outtime;
uqSetOutTime.Prepare;
uqSetOutTime.ExecSQL;
(TButton(Sender)).Visible := False;
(TButton(Sender)).Free;
actWaitListExecute(Self);
end;
finally
Free;
end;
end;
end;
图片:??
这就是你贴有大量的代码,其中大部分是无关紧要的。特别是因为你显然在寻找错误的东西。开始简化代码,直到找出问题或问题消失(如果问题消失,退一步,并发现实际问题)。举例来说,我只会先向TListView添加一个按钮,然后从OnClick处理程序中执行一个“ShowMessage”。 –
另外,为什么您首先将按钮添加到TListView?这听起来像是一个非常糟糕的主意,因为TListView本身不是用来“托管”其他控件;即使这还不够,你依靠TListView的实现细节来使你的按钮看起来不错。如果TListView在Windows8上具有更大的边距,或者头部更宽或更粗,会发生什么情况? –
你能告诉'PostMessage'(WM_LBUTTON [DOWN/UP])应该做什么吗?再次点击按钮? –