I'm trying to extend my tsimple_html component so it can read from a 
tstringlist property instead of a URL (which in many [at least of my] 
programs could severely reduce overhead).
So I basically just added a tstringlist property exactly as I have always done 
it before (and I compared code with my other components, I cannot find the 
difference).
But in this one, the moment you click the property editor for the tstringlist, 
it throws an access violation - not a good sign.

Any chance somebody knows what I am doing wrong here ? (code attached)

A.J.
-- 
"there's nothing as inspirational for a hacker as a cat obscuring a bug 
by sitting in front of the monitor" - Boudewijn Rempt
A.J. Venter
Chief Software Architect
OpenLab International
www.getopenlab.com
www.silentcoder.co.za
+27 82 726 5103
Unit simple_html;
{A simple file based html viewer component based on ippro with image viewing 
added}

{$mode objfpc}{$H+}

interface

uses
LResources,Classes, SysUtils, Forms, Controls, Graphics,IPHtml,lazjpeg,util,simple_downloader
,fileUtil,dialogs,extCtrls;
   
   
Type

  TParseEvent = procedure(Sender: TObject;TempFileName:String) of object;
  
  THTML = class(TIpHtml)
  public
    property OnGetImageX;
  end;

  TSimpleHtml = Class(TComponent)
                    private
                    FTDIR : String;
                    FURL : String;
                    FHTML : THTML;
                    FLines : TStringlist;
                    FPanel : TipHTMLPanel;
                    FParseMe: TParseEvent;
                    FDownLoader : TSimple_Downloader;
                    Function FetchURL(URL:String):String;
                    destructor destroy;
                    procedure setHTMLSTrings(const Avalue: TStringlist);
                    Public 
                      constructor Create(AOwner: TComponent);
                      procedure showHTML;
                      Procedure HTMLGetImageX(Sender: TIpHtmlNode; Const URL: String; Var Picture: TPicture);
                    published
                      property URL : String read FURL write FURL;
                      property HTMLSTrings : TStringlist read FLines write setHTMLSTrings;
                      property TempDir : String read FTDir write FTDir;
                      property Panel: TipHTMLPanel read FPanel write Fpanel;
                      property OnCanParse: TParseEvent read FParseMe write FParseMe;
                      property DownLoader : TSimple_Downloader read FDownLoader Write FDownloader;
                    End;

procedure Register;
Implementation
procedure Register;
begin
  RegisterComponents('OLPack',[TSimpleHTML]);
end;

Procedure TSimpleHTML.SetHTMLSTrings(const Avalue: TStringList);
Begin
If AValue <> Nil then
  FLines.Assign(AValue);
end;

Function TSimpleHTML.FetchURL(URL:String):String;
Var
  SDIR,Ext: STring;
Begin
If pos('://',URL) = 0 then
 FetchURL := URL
else begin
  FileUTil.ForceDirectory(FTDIR);
  SDIR := '';
  Ext := UpperCase(ExtractFileExt(URL));
  If (Ext = '.JPG') or
  (Ext = '.PNG') or
  (Ext = '.GIF') or
  (Ext = '.XPM') then
        SDIR := FTDIR+pathDelim+ExtractFileName(URL) else
  If (length(ExtractFileName(URL)) = 0) or (Length(EXT)=0)  then
        SDIR := FTDIR+pathdelim+'index.html' else
  If pos('.html',ExtractFileName(URL)) = 0 then
        SDIR := FTDIR+pathdelim+ExtractFileName(URL)+'.html' else
        SDIR := FTDIR+pathdelim+ExtractFileName(URL);
        SDIR := SingleSlashes(SDIR);
  DownLoader.URL := URL;
  Downloader.Download;
  DownLoader.Output.SaveToFile(SDIR);
  if ((ExtractFileExt(SDIR) = '.html') or (ExtractFileExt(SDIR) = '.htm'))
     And (Assigned(FParseMe)) then
         FParseMe(Self,SDIR);
  FetchURL := SDIR;
end;
end;

Procedure TSimpleHTML.HTMLGetImageX(Sender:TIpHtmlNode; Const URL: String; Var Picture: TPicture);
Var
   PicCreated: boolean;
   IMGFile:String;
Begin
Try
  IF (FileExists(FTDIR+PathDelim+ExtractFileName(URL))) then
  IMGFile := FTDIR+PathDelim+ExtractFileName(URL) else
  if (pos('://',URL) <> 0) then
  IMGFile := FetchURL(URL) else
  IMGFILE := URL;
  If FileExists(IMGFIle) Then
Begin
   PicCreated := False;
   If Picture=Nil Then
   Begin
    Picture := TPicture.Create;
    PicCreated := True;
   End;
  Picture.LoadFromFile(IMGFile);
End;
Except
  If PicCreated Then
     Picture.Free;
     Picture := Nil;
End;
End;
                                    
Constructor TSimpleHTML.Create(AOwner: TComponent);
Begin
  FLines := TStringlist.create;
  inherited create(AOwner);
End;

Procedure TSimpleHTML.ShowHTML;
Var Path : String;
    HTMLStream: TMemoryStream;
    I :Integer;
Begin
if length(FTDir) = 0 then
   FTDir := SysUtils.GetTempFileName;
If Length(FURL) <> 0 then
begin
Path := FetchURL(FURL);
HTMLStream := TMemoryStream.Create;
HTMLStream.LoadFromFile(Path);
end else
begin
For I := 0 to FLines.Count - 1 do
      HTMLStream.WriteAnsiString(FLines[I]);
end;
FHTML := THTML.Create;
FHTML.OnGetImageX := @HTMLGetImageX;
FHTML.LoadFromStream(HTMLStream);
   HTMLStream.Free;
Panel.SetHTML(FHtml);
End;



destructor TSimpleHTML.destroy;
Begin
  FLines.Free;
  inherited destroy;
End;

initialization
{$I simple_html.lrs}

End.

Reply via email to