1

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

Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992

2 Answers2

2

You overwrite always with the next AllPrinters := Printer.Name; the previous value !

simple build the AllPrinters string like that

....
AllPrinters := '';
....
for I := 0 to WbemObjectSet.Count - 1 do
    begin
      Printer := WbemObjectSet.ItemIndex(I);
      if not VarIsNull(Printer) then
      begin
        Log(Printer.Name);
        AllPrinters := AllPrinters + Printer.Name + #13#10;
      end;
    end;
end;

and

ListBoxPrinters.Items.Text := AllPrinters;
moskito-x
  • 11,832
  • 5
  • 47
  • 60
2

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);
Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992