1

With the code below I can create a button inside a listview item but when I click on the button it causes an error, any ideas to solve it, apparently it could be because I am not able to add a relative to the button.

procedure TForm1.btAddClick(Sender: TObject);
var
  item : TListItemText;
  AItem:  TListViewItem;
begin
  AItem := ListView1.Items.AddItem;

end;

procedure TForm1.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem);
begin
  if AItem.Objects.FindObject('MyButtonCustom') = nil then
  begin
    Create_BT(AItem);
  end;
end;

procedure TForm1.Create_BT(const AItem: TListViewItem);
var
  LItem: TListItemTextButton;
begin
  LItem                       := TListItemTextButton.Create(nil);
  AItem.BeginUpdate;

  LItem.Name                  := 'MyButtonCustom';
  LItem.Text                  := 'MyButtonCustom';

  LItem.Height                := 20;
  LItem.Width                 := 200;
  LItem.PlaceOffset.X         := 0;
  LItem.PlaceOffset.X         := 0;

  LItem.Align                 := TListItemAlign.Center;
  LItem.VertAlign             := TListItemAlign.Center;

  LItem.TextAlign             := TTextAlign.Center;
  LItem.TextVertAlign         := TTextAlign.Center;

  AItem.EndUpdate;

  AItem.Objects.Add(LItem);
end;

This is the error that I receive (copied from comments by @tobya)

LItem := TListItemTextButton.Create(nil)

When clicking on the button that was created, the following errors appear:


raised exception class $C0000005 with message 'access violation at 0x00a85323: read of address 0x00000000.' Access violation at address 00A85323 in module 'Project1.exe' (offset 575323). Read of address 00000000. LItem := TListItemTextButton.Create(AItem); 

closing the form causes the errors:

Project Project.exe raised exception class EInvalidPointer with message 'Invalid point operation'. Exception EInvalidPointer in module Project1.exe at 000085CD Invalid pointer operation.
6
  • 1
    Each control needs both an owner and a parent. I'm not sure what AItem.Objects.Add() does, but I suspect that it might add a parent but not an owner. Have you tried LItem:=TListItemTextButton.Create(AItem)? Commented Mar 9 at 3:48
  • yes, thanks for commenting. when I do it like this Item := TListItemText Button.Create(AItem); when closing the application it causes memory errors memoryleaks Commented Mar 9 at 11:24
  • You say you get an error, but what IS the error you get? Commented Mar 9 at 11:57
  • How can I explain it to you, memory leak error, I added the command ReportMemoryLeaksOnShutdown := DebugHook <> 0; in the project's .dpr file and it reports a very large memory error. Project Project1.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'. Commented Mar 9 at 13:30
  • @maugustomoreno You can copy the error message and paste it into your post (or to a comment). Commented Mar 9 at 17:56

1 Answer 1

0

Well, I slightly changed your code for testing and this works (D12.2)

procedure TForm1.Button1Click(Sender: TObject);
var aItem : TListViewItem;
begin
  ListView1.BeginUpdate;
  aItem := ListView1.Items.Add;
  aItem.Text := 'hello '+ListView1.Items.Count.tostring;
  ListView1.EndUpdate;
end;

procedure TForm1.ListView1UpdateObjects(const Sender: TObject;
  const AItem: TListViewItem);
procedure Create_BT(const AItem: TListViewItem);
var
  LItem: TListItemTextButton;
begin
  LItem                       := TListItemTextButton.Create(nil);
//  AItem.BeginUpdate;

  LItem.Name                  := 'MyButtonCustom';
  LItem.Text                  := 'MyButtonCustom';

  LItem.Height                := 20;
  LItem.Width                 := 200;
  LItem.PlaceOffset.X         := 0;
  LItem.PlaceOffset.X         := 0;

  LItem.Align                 := TListItemAlign.Center;
  LItem.VertAlign             := TListItemAlign.Center;

  LItem.TextAlign             := TTextAlign.Center;
  LItem.TextVertAlign         := TTextAlign.Center;

//  AItem.EndUpdate;

  AItem.Objects.Add(LItem);

end;
begin
  if AItem.Objects.FindObject('MyButtonCustom') = nil then
  begin
    Create_BT(AItem);
  end;
end;

Following my comment and using a dynamic appearance it's easy enter image description here

procedure TForm1.Button1Click(Sender: TObject);
var aItem : TListViewItem;
begin
  ListView1.BeginUpdate;
  aItem := ListView1.Items.Add;
  var aLabel:=aItem.Objects.FindObjectT<TListItemText>('Text1'); // case sensitive !!
  if assigned(alabel) then TListItemText(aLabel).text := 'hello '+ListView1.Items.Count.tostring;
  ListView1.EndUpdate;
end;

procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex: Integer;
  const LocalClickPos: TPointF; const ItemObject: TListItemDrawable);
begin
Showmessage(ItemObject.Name);
end;
Sign up to request clarification or add additional context in comments.

4 Comments

Thank you very much for responding, but the error persists. Try clicking on the 'MyButtonCustom' button that was created and an error will be generated. This error apparently refers to the 'MyButtonCustom' object that is not associated with any parent.
Ah, sorry, I only use your code to check the UI, and don't check the "when I click on the button it causes an error", because I don't saw, in your code, any OnClick event. On another hand you don't mention if your listview the appearance you used nor if Listview is in EditMode ! For this kind of design, I , usually, use TDynamicAppearance .
Thanks again, but the error persists. What I'm trying to do is create an object in execution mode and attach its creation to the "Item" of the Listview, for example: var rec : TRectangle; rec := TRectangle.Create(Form1); rec.Parent := Form1;
First, I think you need to use DynamicAppearance Then I think you need to add it to the ItemAppearanceObjects.ItemObjects.Collection But a listview can only have one item style so I don't undesrtand your goal. ListBox should be a better choice I think

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.