2017-05-24 4 views
0

J'ai obtenu un code de List all physical printers using WMI query in Inno Setup et je veux ajouter les résultats à une zone de liste. J'ai essayé de le faire avant de le demander, mais je ne peux pas tout ajouter. Ceci est un mon code:Comment ajouter des éléments à une zone de liste dans Inno Setup?

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; 

ensuite sur une page personnalisée faire ceci:

ListBoxPrinters.Items.Add(AllPrinters); 

enter image description here

Répondre

1

Vous ajoutez les éléments (imprimantes) à la zone de liste de la même manière, le code d'origine les ajoute au journal: dans la boucle!

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; 

Bien sûr, vous devez créer la page personnalisée avec le ListBoxPrinters avant itérer les imprimantes.


Si vous ne pouvez pas exécuter la requête après avoir créé la page pour une raison quelconque, vous pouvez stocker une liste d'imprimantes dans 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; 

Et une fois que vous avez la liste prête, vous suffit de copier la liste sur la boîte:

ListBoxPrinters.Items.Assign(Printers); 
1

Vous écrasez toujours avec la prochaine AllPrinters := Printer.Name; la valeur précédente!

simple, construire la chaîne AllPrinters comme ça

.... 
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; 

et

ListBoxPrinters.Items.Text := AllPrinters;