<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'aimerais que la fenêtre de sélection des couleurs JMP soit ouverte par script. La couleur sélectionnée par l'utilisateur doit être renvoyée (valeurs RVB).
Je voudrais donc ouvrir ces fenêtres par script:


Est-ce possible? Jusqu'à présent, je n'ai pas trouvé le moyen de le faire (avec JMP 12.1).
Alors j'ai pensé que vous pourriez utiliser une DLL Windows. Mon problème est que je n'ai aucune idée sur la façon d'utiliser les dlls ...
Avec le guide de script JMP, le manuel de référence de la syntaxe et les pages Internet mentionnées ci-dessous, j'ai créé le code suivant:
/*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();Ce code ne fonctionne pas, la fenêtre de sélection des couleurs ne s'affiche pas mais le résultat de l'appel de la fonction ColorPalette est toujours zéro.
Je pense qu'un problème est que je ne connais pas la valeur correcte pour 'lStructSize'. J'ai essayé chaque valeur de 1 à 10 000 sans aucun changement. Donc, évidemment, il y a plus d'erreurs dans mon code (comme je l'ai dit, je ne sais pas comment utiliser les dll).
Quelqu'un peut-il aider?
Voici quelques liens (peut-être utiles):
https://msdn.microsoft.com/en-us/library/ms646912%28v=vs.85%29.aspx
https://msdn.microsoft.com/en-us/library/ms646829%28v=vs.85%29.aspx#choosing_color
https://msdn.microsoft.com/de-de/library/windows/desktop/ms646830%28v=vs.85%29.aspx
Et voici du code VBA qui fonctionne sous MS Excel (code légèrement modifié trouvé sur Internet). J'ai essayé de le faire dans JMP de la même manière.
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
J'ai eu les mêmes exigences. Merci, votre exemple de code. Je l'ai révisé et passé le test dans JMP 12.
Voici mon script
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();
);
);