Ik liep deze week tegen een probleempje aan. Ik moest een aanpassing doen aan een oud programma dat met Delphi 1 of 2 was gemaakt. Ik wilde dit overhalen naar mijn huidige Delphi versie (dat is 5, sorry) maar dat lukte niet helemaal. Er werd namelijk een eigengemaakt component gebruikt, TCheckListBox. Deze was afgeleid van TCustomGrid en botste dus nogal met de TCheckListBox die nu in de VCL zit.
Nu had ik de unit met die checklistbox nog, dus heb ik de class hernoemd naar TAntiekeCheckListBox (voorbeeldnaam) en de source van het form aangepast. Het probleem was echter dat de dfm natuurlijk ook angepast moest worden, maar de dfm van Delphi 2 is binair opgeslagen. Ik kon 'm niet openen in Delphi, want dan zou het object 'verdwijnen' of omgezet worden naar een VCL TCheckListBox, met verlies van properties etc..
Nu dacht ik eerst aan de functie ObjectBinaryToText waarmee een binaire stream (die je krijgt met TWriter.WriteComponent) om kan worden gezet naar object tekst (zoals je ziet als je een dfm bekijkt). Toen ik dat echter probeerde bleek het toch niet te werken. Gelukkig wees mijn geniale collega me op de functie ObjectResourceToText en inderdaad, die was het. Een binaire DFM bevat eerst een header en daarna de object tekst. ObjectResourceToText leest eerst die header uit en roept dan ObjectBinaryToText aan. De volgende functie opent een binaire DFM, converteert deze naar tekst en geeft het resultaat terug als string. Op deze manier heb ik mijn antieke DFM toch weten te fixen.
Code:
function ReadBinaryDFMAsText(const FileName: string): string;
var
src: TFileStream;
tgt: TStringStream;
begin
tgt := TStringStream.Create('');
try
src := TFileStream.Create(FileName, fmOpenRead);
ObjectResourceToText(src, tgt);
Result := tgt.DataString;
finally
tgt.Free;
src.Free;
end;
end;
Bookmarks