Gibt es eine Möglichkeit, Benutzern die Auswahl mehrerer Zellen in einer Tabellenbox zu ermöglichen, oder gibt es ein anderes Objekt, das ich stattdessen verwenden könnte? Zur Veranschaulichung: Ein Benutzer möchte die Pumpen-Tags von der linken Tabelle ab Zeile 2 in die rechte Tabelle (siehe Abbildung unten) verschieben. Wie kann er den zu kopierenden Zellbereich auswählen und anschließend einfügen?

Mehr anzeigen...
New Window( "Editing a data table",
Show Menu( 0 ), Show Toolbars( 0 ),
h list box(
Table Box(
String Col Edit Box( "PI Point", Repeat( { "" }, 5 ) || Transform Each({v},as list(transpose(1::15)),"Pump1-" || char(v)) ),
String Col Edit Box( "Friendly Name", Repeat( { "" }, 5 ) || Transform Each({v},as list(transpose(1::15)),"Name " || char(v)) )
),
spacer box(20,20),
Table Box(
String Col Edit Box( "PI Point", {"sinusoid"} || Repeat( { "" }, 14 ) || {"Valve1", "Valve2", "Valve3"} ),
String Col Edit Box( "Friendly Name", Repeat( { "" }, 15) || {"Inlet", "Outlet", "Recirc"} )
)
)
);
Das Skripten zum Kopieren und Einfügen der Werte sollte unkompliziert sein, aber der Benutzer muss angeben, woher die Daten stammen und wo sie eingefügt werden sollen.
Der tatsächliche Anwendungsfall
Ich möchte die Benutzeroberfläche des Had/OSISoft PI Tools -Add-ins verbessern, indem ich die Textfelder für Tags und Anzeigenamen durch eine Datentabelle ersetze, wie in einem GitHub-Issue diskutiert. Häufig haben Benutzer Tags in einer JMP-Tabelle oder einer Tabellenkalkulation gespeichert und möchten diese schnell in die Benutzeroberfläche des Add-ins kopieren. Das Kopieren der gesamten Tabelle ist zwar einfach, aber wenn eine Änderung erforderlich ist, möchten sie möglicherweise nur einen Teil der Liste ersetzen.
Beim Table Box-Objekt scheint es nicht möglich zu sein, mehrere Zellen auszuwählen. Gibt es hier eine andere Möglichkeit? Ich dachte mal, man könnte ein komplettes Datentabellenfenster in ein benutzerdefiniertes Fenster einbetten, aber vielleicht war das auch nur ein Traum.
Meine bisher beste Idee ist eine Art Mouseover-Logik, die Quadrate über die „ausgewählten“ Zellen zeichnet, aber ich möchte zunächst sehen, ob es eine einfachere Lösung gibt.
Der Befehl lautet: << neues Datenfeld:
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
new window("data box", dt << new data box)
Danke @hogi, das war's!
Ich finde, diese bieten ein ziemlich gutes Benutzererlebnis.

Code zum Reproduzieren:
Mehr anzeigen...
names default to here(1);
dt1 = New Table( "dt1", invisible,
Add Rows( 20 ),
New Column( "PI Point", Character, "Nominal", Set Values(
Repeat( { "" }, 5 ) || Transform Each({v},as list(transpose(1::15)),"Pump1-" || char(v))
) ),
New Column( "Friendly Name", Character, "Nominal", Set Values(
Repeat( { "" }, 5 ) || Transform Each({v},as list(transpose(1::15)),"Name " || char(v))
) )
);
dt2 = New Table( "dt1", invisible,
Add Rows( 20 ),
New Column( "PI Point", Character, "Nominal", Set Values(
{"sinusoid"} || Repeat( { "" }, 14 ) || {"Valve1", "Valve2", "Valve3"}
) ),
New Column( "Friendly Name", Character, "Nominal", Set Values(
Repeat( { "" }, 15) || {"Inlet", "Outlet", "Recirc"}
) )
);
new window("data box",
Show Menu( 0 ), Show Toolbars( 0 ),
h list box(
ntb1 = dt1 << New Data Box;
ntb1 << close side panels;
ntb1 << Set Row ID Width( 50 );
ntb1 << Set Width(200);
ntb1 << Set Height(450);
ntb1,
spacer box( Size( 20, 20 )),
ntb2 = dt2 << New Data Box;
ntb2 << close side panels;
ntb2 << Set Row ID Width( 50 );
ntb2 << Set Width(200);
ntb2 << Set Height(450);
ntb2
),
<< On close(
try( dt1 << Close Window );
try( dt2 << Close Window );
)
);
Ich arbeite noch an einigen Aspekten davon – zum Beispiel daran, wie man die Spaltenbreite innerhalb dieses Feldes ändert, nachdem die Tabelle gezeichnet wurde – aber das ist ein Thema für einen anderen Tag!