[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Elemente einer Listbox schnell aktualisieren

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Elemente einer Listbox schnell aktualisieren

Martin Fischer
  
Beiträge gesamt: 12783

19. Sep 2012, 08:27
Beitrag # 1 von 4
Bewertung:
(2704 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

in Peter Kahrels ScriptUI for dummies (scriptui-1-12.pdf auf S. 35) findet sich ein hübsches Schnippsel zum fortlaufenden Filtern von Einträgen in einer Liste.
Code
var picked = type_ahead (["bat", "bear", "beaver", "bee", "cat", "cats_and_dogs", "dog", "maggot", "moose", "moth", "mouse"]); 

function type_ahead (array)
{
var w = new Window ("dialog", "Quick select");
var entry = w.add ("edittext", [0, 0, 150, 22]);
entry.active = true;
var list = w.add ("listbox", [0, 0, 150, 220], array, {scrolling: true});
list.selection = 0;
entry.onChanging = function ()
{
var temp = this.text;
list.removeAll ();
for (var i = 0; i < array.length; i++)
{
if (array[i].toLowerCase().indexOf (temp) == 0)
list.add ("item", array[i]);
}
if (list.items.length > 0)
list.selection = 0;
}
entry.onChange = function () {w.close (1)}
if (w.show () != 2)
return list.selection.text;
else
w.close ();
}


Mit dem Austausch der Zeile "if (array[i].toLowerCase().indexOf (temp) == 0)" gegen if (array[i].toLowerCase().match(temp) != null ) lässt sich der Filter auch auf 'Innenbereiche' der Listenbegriffe ausdehnen.

Nun arbeite ich mit einer Palette statt mit einem Dialog und benötige die Filterung der Liste über eine längere Zeit. Dabei stelle ich fest, dass mit der Zahl der Einträge in der Liste die Aktualisierungszeit gefühlt wie exponential ansteigt.
Zwar habe ich schon von onChanging auf onChange gewechselt, damit nicht fortlaufend, sondern erst nach Eigabe von Enter gefiltert wird. Aber bei Listen mit 150 und mehr Einträgen dauert das dann immer noch lange.

Interessanterweise ist nicht – wie ursprünglich vermutet – der Neuaufbau der Liste die Bremse, sondern das Löschen(!) der Listeneinträge mit dem simplen Befehl removeAll().

Momentan behelfe ich mir mit einem kompletten Neuaufbau der Palette (Sichern der Werte, Schließen der Palette und Neuzeichnen unter Verwendung der gesicherten Werte. Das geht deutlich schneller als das Löschen der Listeneinträge. Aber man sieht eben die Palette zwischen dem Schließen und dem Neuzeichnen blinken.


Weiß jemand einen Weg, wie man alternativ die Liste selbst (statt nur aller Listeneinträge) löschen könnte, um sie hinterher mit add() wieder neu aufzubauen?
X

Elemente einer Listbox schnell aktualisieren

mx
Beiträge gesamt: 161

19. Sep 2012, 10:48
Beitrag # 2 von 4
Beitrag ID: #501104
Bewertung:
(2657 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

da gibt es doch noch ein paar Möglichkeiten.

Abgesehen davon, dass es sicher elegantere Methoden gibt ein Array zu filtern, hab ich mal einen schnellen Versuch gemacht:

1.
Erst ein Array mit dem Ergebnis füllen und die Liste komplett auf einmal füllen.

2.
Erst die neue Liste zeichnen, dann die alte Liste löschen.


Code
	entry.onChanging = function ()  
{
var temp = this.text;
var tempArray = [];
for (var i = 0; i < array.length; i++)
{
if (array[i].toLowerCase().indexOf (temp) == 0)
tempArray[tempArray.length] = array[i];
}
if (tempArray.length > 0)
list.selection = 0;
tempList = w.add ("listbox", list.bounds, tempArray, {scrolling: true});
w.remove(list);
list = tempList;
}


Damit sieht es zumindest für mich bei bei ca. 1500 Einträgen noch recht flüssig aus.

Viele Grüße
Jo


als Antwort auf: [#501085]
(Dieser Beitrag wurde von mx am 19. Sep 2012, 10:58 geändert)

Elemente einer Listbox schnell aktualisieren

Martin Fischer
  
Beiträge gesamt: 12783

19. Sep 2012, 11:56
Beitrag # 3 von 4
Beitrag ID: #501125
Bewertung:
(2639 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jo,

wunderbar!
Das geht phantastisch schnell!

Ich glaube, insbesondere w.remove(list) ist das, wonach ich gesucht hatte.

Vielen Dank
Martin


als Antwort auf: [#501104]
(Dieser Beitrag wurde von Martin Fischer am 19. Sep 2012, 12:00 geändert)

Elemente einer Listbox schnell aktualisieren

Peter Kahrel
Beiträge gesamt: 182

19. Sep 2012, 18:03
Beitrag # 4 von 4
Beitrag ID: #501201
Bewertung:
(2592 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Jo,

Das ist ein sehr interessanter Lösung, danke vielemals. Es gibt nur einen kleinen Fehler: list.selection = 0 muss unbedingt am Ende der Funktion kommen. Wenn nicht, dann wird nichts im List ausgewählt, und return list.selection.text; verursacht dann einen Fehler.

Code
entry.onChanging = function ()   
{
var temp = this.text;
var tempArray = [];
for (var i = 0; i < array.length; i++)
{
if (array[i].toLowerCase().indexOf (temp) == 0)
tempArray[tempArray.length] = array[i];
}
if (tempArray.length > 0)
{
tempList = w.add ("listbox", list.bounds, tempArray, {scrolling: true});
w.remove(list);
list = tempList;
list.selection = 0;
}
}


Das is alles Grund um der 'Dummies guide' zu aktualisieren -- danke.

Peter


als Antwort auf: [#501104]
X