Code: Alles auswählen
Arg wargs[10];
XtSetArg(wargs[0], XtNwidth, 320);
XtSetArg(wargs[1], XtNlabel, "Click = Quit");
XtSetArg(wargs[2], XtNbwert_mit_bol, false);
XtSetValues(command, wargs, 3);
Code: Alles auswählen
typedef char *String;
typedef intptr_t XtIntPtr; // intptr_t ist ein "long" (64Bit Integer)
typedef XtIntPtr XtArgVal;
...
typedef struct {
String name;
XtArgVal value;
} Arg, *ArgList;
...
#define XtSetArg(arg, n, d) ((void)( (arg).name = (n), (arg).value = (XtArgVal)(d) ))
In Pascal habe ich folgende Lösung gemacht, welche auch funktioniert. Ich habe XtSetArg(...) einfach mit allen bis jetzt bekannten typen überladen.
Code: Alles auswählen
TArg = record
Name: TString;
case byte of
0: (valueP: PChar);
1: (valueI: LongInt);
2: (valueB: Boolean);
end;
...
procedure XtSetArg(var arg: TArg; n: TXtString; pc: PChar); overload; inline;
procedure XtSetArg(var arg: TArg; n: TXtString; p: Pointer); overload; inline;
procedure XtSetArg(var arg: TArg; n: TXtString; int: PtrInt); overload; inline;
procedure XtSetArg(var arg: TArg; n: TXtString; bol: TBoolean); overload; inline;
...
procedure XtSetArg(var arg: TArg; n: TXtString; pc: PChar);
begin
arg.Name := n;
arg.valueP := pc;
end;
...
procedure XtSetArg(var arg: TArg; n: TXtString; bol: TBoolean);
begin
arg.Name := n;
arg.valueB := bol;
end;