Search code examples
inno-setupwmi-querypascalscript

Correct way to add items to a list box in Inno Setup?


I got a code from List all physical printers using WMI query in Inno Setup and I want to add the results to a list box. I have tried to do it before asking, but I just can't add all items. This is an my code:

var
  Query, AllPrinters: string;
  WbemLocator, WbemServices, WbemObjectSet: Variant;
  Printer: Variant;
  I: Integer;
begin
  WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  WbemServices := WbemLocator.ConnectServer('.', 'root\CIMV2');
  Query := 'SELECT Name FROM Win32_Printer';
  WbemObjectSet := WbemServices.ExecQuery(Query);
  if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
  begin
    for I := 0 to WbemObjectSet.Count - 1 do
    begin
      Printer := WbemObjectSet.ItemIndex(I);
      if not VarIsNull(Printer) then
      begin
        Log(Printer.Name);
        AllPrinters := Printer.Name;
      end;
    end;
  end;
end;

Then on a custom page do this:

ListBoxPrinters.Items.Add(AllPrinters);

enter image description here


Solution

  • You add the items (printers) to the list box the same way, the original code adds them to the log: in the loop!

    for I := 0 to WbemObjectSet.Count - 1 do
    begin
      Printer := WbemObjectSet.ItemIndex(I);
      if not VarIsNull(Printer) then
      begin
        ListBoxPrinters.Items.Add(Printer.Name);
      end;
    end;
    

    Of course, you have to create the custom page with the ListBoxPrinters before iterating the printers.


    If you cannot run the query after creating the page for whatever reason, you can store a printer list into TStringList.

    var
      Printers: TStringList;
    
    Printers := TStringList.Create;
    
    for I := 0 to WbemObjectSet.Count - 1 do
    begin
      Printer := WbemObjectSet.ItemIndex(I);
      if not VarIsNull(Printer) then
      begin
        Printers.Add(Printer.Name);
      end;
    end;
    

    And once you have the list box ready, you just copy the list over to the box:

    ListBoxPrinters.Items.Assign(Printers);