@hartmut
Hope this simple not complete explaination helps
Screen.Fonts
is purely a list of font names, it does not contain anything else.
to get any of the font data, you would have to load all the font data into a tfont variable; which is what you are doing, then when finished dealing with that font free it and start again, if you do not free it when you assign it a name the previous font data is there so its not updated.
obviously this will be slow, as you have found out.
what the later examples are doing is enumerating through the font list and filtering the search/matches, this does not require the full font data to be loaded, but uses a cached font list.
the lf: TLogFont; can have various filters applied to filter the result.:-
lfHeight, lfWidth, lfEscapement, lfOrientation, lfWeight, lfItalic, lfUnderline, lfStrikeOut, lfCharSet, lfOutPrecision, lfClipPrecision, lfQuality, lfPitchAndFamily, lfFaceName.