Решение, предоставленное Андреасом и Дэвидом, предполагает, что строки точно в одинаковом порядке как в ListBox, так и в StringList. Это хорошее предположение, так как вы не указываете иначе, но в случае, если это не так, вы можете использовать метод IndexOf
StringList, чтобы найти индекс строки (если отсортирован StringList, используйте Find
). Что-то вроде
var x, Idx: Integer;
for x := ListBox.Count - 1 downto 0 do begin
if ListBox.Selected[x] then begin
idx := StringList.IndexOf(ListBox.Items[x]);
if(idx <> -1)then StringList.Delete(idx);
end;
end;