[Lazarus] Dynamic Form Components - SynEdit Help Please...

Martin Collins mailinglists at collins-email.co.uk
Mon Oct 3 23:17:05 CEST 2016


I apologise for emailing but need a little bit of help please.

Creating form components dynamically is a new area of pascal programming 
for me and I have become stuck. My application is supposed to be an 
editor that can open multiple files for editing. I have a page control 
and when opening a new file I add a page and place a synedit on the page 
on it's own, into which the file is loaded. The loading works fine - I 
create a stringlist, loadfromfile, then SetObjectProp(Component, 
PropInfo['Lines'], StringList). StringList.Free works without error.

However, when I try to save the file the following code works, insomuch 
the file is saved to disk, but the application crashes when trying to 
free the stringlist (HTMLFile.Free) with the error 'Project raised 
exception class 'External: SIGSEGV' At address 4201C3'. If I don't free 
the stringlist, the application does not crash but I'm left with a 
memory leak as indicated in my heap.trc file.

I have a feeling that HTMLFile is not actually a stringlist, I'm just 
forcing it to be one here - HTMLFile := TStringList(GetObjectProp(Comp, 
PropInfo, TStrings)); If that's the case, how can I get and/or save the 
text from the dynamically created synedit. This has been puzzling me for 
days now!!!!

Many thanks for your help.

Martin Collins

Using Lazarus 1.6, FPC 3.0.0, Linux x86_64 gtk2

####

procedure TMainForm.SaveSynEdit(ThisPage: Integer);
var
   HTMLFile: TStringList;
   Filename: String;
   Comp : TComponent;
   PropInfo: PPropInfo;
begin
   FileSaveDialog.Title:= 'Save File...';
   FileSaveDialog.DefaultExt := 'html'; //default extension
   FileSaveDialog.Filter := 'HTML source file|*.html';
   Filename:= FileList[ThisPage];
   FileSaveDialog.FileName:= Filename + '.html';
   If FileSaveDialog.Execute then
   begin
     HTMLFile:= TStringList.Create;
     Comp := PageControlEditor.ActivePage.Controls[0];
     If Comp is TWinControl then
     begin
       If IsPublishedProp(Comp, 'Lines') then
       begin
         PropInfo := GetPropInfo(Comp, 'Lines', [tkClass]);
         HTMLFile := TStringList(GetObjectProp(Comp, PropInfo, TStrings));
         Filename:= FileSaveDialog.FileName;
         HTMLFile.SaveToFile(Filename);
         HTMLFile.Free;
         FileList[ThisPage]:= Filename;
         PageControlEditor.ActivePage.Caption:= ExtractFileName(Filename);
         PageControlEditor.ActivePage.Font.Style:= [];
         PageControlEditor.ActivePage.Font.Color:= clDefault;
       end;
     end;
   end;
end;



More information about the Lazarus mailing list