(德爾福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])應該做什麼嗎?再次點擊按鈕? –