<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich möchte, dass das Fenster für die JMP-Farbauswahl per Skript geöffnet wird. Die vom Benutzer ausgewählte Farbe sollte zurückgegeben werden (RGB-Werte).
Ich möchte also diese Fenster per Skript öffnen:


Ist das möglich? Bisher habe ich keinen Weg gefunden (mit JMP 12.1).
Also dachte ich, Sie könnten eine Windows-DLL verwenden. Mein Problem ist, dass ich keine Ahnung habe, wie man DLLs benutzt ...
Mit dem JMP-Skripthandbuch und Syntaxreferenzbuch und den unten genannten Internetseiten habe ich den folgenden Code erstellt:
/*user32 = Load Dll( "User32" );user32 << DeclareFunction( "FindWindowA", Convention( STDCALL ), Alias( "FindWindow2" ), Arg( UInt32, input, "lpClassName" ), Arg( AnsiString( 200 ), input, "lpCaption" ), Returns( UIntPtr ));lpCaption = "Script - JMP";hWnd = user32 << FindWindow2( 0, lpCaption );user32 << UnloadDLL();*/dll = LoadDLL("C:\Windows\System32\comdlg32.dll");dll << Declare Function( "ChooseColorA", Convention(STDCALL), Alias("ColorPalette"), StructArg( Arg(UInt32, "lStructSize"), Arg(Int64, "hwndOwner"), Arg(Int64, "hInstance"), Arg(UInt32, update, "rgbResult"), Arg(AnsiString, "lpCustColors"), Arg(UInt32, "Flags"), Arg(Int64, "lCustData"), Arg(Int64, "lpfnHook"), Arg(AnsiString, "lpTemplateName"), update ), Returns(Int8));selected_color = 5;hwnd = 0;size = 36 ;result = dll << ColorPalette( size, // lStructSize hwnd, // hwndOwner 0, // hInstance selected_color, // rgbResult "", // lpCustColors 2, // flags; 2 = show all colors 0, // lCustData 0, // lpfnHook "" // lpTemplateName);show(result);dll << UnloadDLL();Dieser Code funktioniert nicht, das Farbauswahlfenster wird nicht angezeigt, aber das Ergebnis des Aufrufs der ColorPalette-Funktion ist immer Null.
Ich denke, ein Problem ist, dass ich nicht den richtigen Wert für 'lStructSize' kenne. Ich habe jeden Wert von 1 bis 10000 ohne Änderung ausprobiert. Es gibt also offensichtlich mehr Fehler in meinem Code (wie gesagt, ich habe keine Ahnung, wie man dlls verwendet).
Kann mir jemand helfen?
Hier sind einige (vielleicht hilfreiche) Links:
https://msdn.microsoft.com/de-de/library/ms646912%28v=vs.85%29.aspx
https://msdn.microsoft.com/de-de/library/ms646829%28v=vs.85%29.aspx#choosing_color
https://msdn.microsoft.com/de-de/library/windows/desktop/ms646830%28v=vs.85%29.aspx
Und hier ist ein VBA-Code, der in MS Excel funktioniert (etwas modifizierter Code, den ich im Internet gefunden habe). Ich habe es in JMP ähnlich versucht.
Option ExplicitPrivate Type CHOOSECOLOR lStructSize As Long hwndOwner As Long hInstance As Long rgbResult As Long lpCustColors As String flags As Long lCustData As Long lpfnHook As Long lpTemplateName As StringEnd TypePrivate Declare PtrSafe Function ChooseColorAPI Lib "comdlg32.dll" Alias _"ChooseColorA" (pChoosecolor As CHOOSECOLOR) As LongDim CustomColors() As ByteSub test() Form_Load Dim cc As CHOOSECOLOR Dim Custcolor(16) As Long Dim lReturn As Long cc.lStructSize = Len(cc) 'Debug.Print cc.lStructSize cc.hwndOwner = Application.Hwnd cc.hwndOwner = 0 cc.hInstance = 0 cc.lpCustColors = StrConv(CustomColors, vbUnicode) 'cc.flags = 0 cc.flags = 2 ' all colors 'cc.flags = CC_FULLOPEN lReturn = ChooseColorAPI(cc) If lReturn <> 0 Then Dim Farbe, Rot, Gruen, Blau As Long Farbe = cc.rgbResult Rot = Farbe Mod 256 Farbe = (Farbe - Rot) / 256 Gruen = Farbe Mod 256 Farbe = (Farbe - Gruen) / 256 Blau = Farbe Mod 256 MsgBox "Color: " & cc.rgbResult & vbNewLine & "Rot: " & Rot & vbNewLine & "Grün: " & Gruen & vbNewLine & "Blau: " & Blau CustomColors = StrConv(cc.lpCustColors, vbFromUnicode) Else MsgBox "User chose the Cancel Button" End IfEnd SubSub Form_Load() ReDim CustomColors(0 To 16 * 4 - 1) As Byte Dim i As Integer For i = LBound(CustomColors) To UBound(CustomColors) CustomColors(i) = 0 Next iEnd Sub
Ich hatte die gleichen Anforderungen. Danke, dein Beispielcode. Ich habe es überarbeitet und den Test in JMP 12 bestanden.
Hier ist mein Skript
ChooseColor = Function( {intColor, flags=3},
{Default Local},
If( Host is( Windows ),
dll = Load DLL("C:/Windows/System32/Comdlg32.dll", Quiet );
dll << Declare Function( "ChooseColorW", Convention(STDCALL), Alias("PickColor"),
StructArg(
Arg(Int64, "lStructSize"),
Arg(Int64, "hwndOwner"),
Arg(Int64, "hInstance"),
Arg(Int32, "rgbResult"),
Arg(AnsiString(64), "lpCustColors"),
Arg(Int64, "Flags"),
Arg(Int64, "lCustData"),
Arg(Int64, "lpfnHook"),
Arg(UnicodeString, "lpTemplateName"),
Update,
"CHOOSECOLOR"
),
Returns(Int32)
);
lStructSize = 72;
hwndOwner = 0;
lstRGB = As List( ( Matrix( Color To RGB(intColor) ) * 255 ) );
hexRGB = Concat(Substr(Hex(lstRGB[3], "integer"),7,2), Substr(Hex(lstRGB[2], "integer"),7,2), Substr(Hex(lstRGB[1], "integer"), 7,2));
rgbResult = Hex to Number( hexRGB );
lpCustColors = Repeat(Hex To Char( "FFFFFF00" ), 16);
lCustData = 0;
lpfnHook = 0;
intRc = dll << PickColor(lStructSize, 0, 0, rgbResult, lpCustColors, Flags,0,0,"");
If(intRC == 0,
Return(intColor)
,
hexRGB = Hex(rgbResult, "integer");
Return( RGB Color( Hex to Number(Substr(hexRGB,7,2)), Hex to Number(Substr(hexRGB,5,2)), Hex to Number(Substr(hexRGB,3,2) ) ) );
);
dll << Unload DLL();
);
);