Сами себе сложности создаете. Стринг в umd расположен как нужно (адрес кратен 4).
На кой вам еще где-то стринги ? А сами данные в стринге выровнять сложно ? И причем тут стринг вообще. Забудьте. Нет стринга, есть буфер с нужного адреса
Код:
fb my
var_input
k : real;
i : int;
b : byte;
x : byte; //неявная
.......
end;
----
;
----
var
p : pointer to my;
k : real;
i : int;
b : byte;
m : my;
----
p := adr(строка_прям_в_umd);
p^(i:=i,k:=k,b:=b); //упаковали&положили
m := p^; //куда-то переложили все
j := p^.j; //взяли часть
..
Общий случай (где могут гулять адреса)
var
k : real;
i : int;
b : byte;
m : my;
----
m(i:=i,k:=k,b:=b); //упаковали
sysmemcpy(..., adr(m),sizeof(m)); //переложили хоть куда
sysmemcpy(adr(m),adr(...),sizeof(m)); //переложили хоть откуда
j := m.j; //взяли часть
Заставьте машину думать по максимуму. А вам - только структуру/фб грамотно описать - и все