iphtmlpanel+TIPFileDataProvider bug

Rund um die LCL und andere Komponenten
Antworten
Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

iphtmlpanel+TIPFileDataProvider bug

Beitrag von Leberecht »

ich möchte in meinem programm eine html-hilfe integrieren, ohne nutzung eines externen webbrowsers.
es handelt sich dabei um statische html-seiten ohne schnickschnack(kein css, javascript...) die als einzige besonderheit anker und links enthalten.
dazu habe ich die htmlhelp_ipro -demo von lazarus angeschaut und für mich umgesetzt. das hat funktioniert, allerdings bin ich jetzt durch verwenden
der heaptrc-unit bei der fehlersuche darauf gestossen, das es generell bei der verwendung des TIPFileDataProviders beim beenden des programms einen
sigsev-fehler gibt. im iphtml-modul fürt im destruktur die zeile "FDataProvider.DoLeave(FHtml);" dazu. das ganze passiert auch in der von
lazarus mitgelieferten demo, ist also kein programmierfehler von mir. ich hab das jetzt soweit eingekreist, das einfach schon das platzieren der
TIPFileDataProvider -komponente und das zuweisen dieser im iphtmlpanel zu dem fehler führt wenn das panel eine .html-datei anzeigt. das
ist für mich keine lösung, deshalb wollte ich das zuweisen der .html-dateien zum iphtmlpanel manuell durchführen. leider geht das ohne die
TIPFileDataProvider-komponente nicht, ein
IpHtmlPanel.OpenURL('z:\index.html');
schlägt fehl, mit der meldung das kein filedataprovider definiert sei. wozu brauche ich den, ich habe ihm doch alle infos gegeben die er braucht?
gibts irgenteine möglichkeit mit der IpHtmlPanel-komponente allein zu arbeiten(ohne filedataprovider, helperdatabase...)?
ich habe zwar eine möglichkeit gefunden, eine html-datei direkt in das panel zu laden -mit
IpHtmlPanel.SetHtmlFromStr(string mit datei als inhalt);
und dazu braucht er keine weiteren komponenten, allerdings weiss ich nicht, wie ich die klicks auf die html-links erkennen/auswerten soll.
kennt sich zufällig jemand mit der materie aus?

p.s. würde zur not auch eine externe komponente nehmen, die müsste aber zweifelsfrei freeware sein und einfach im umgang. die her mal vorgeschlagene trichview-komponente 0.5.2
ist mir irgentwie zu sperrig/zu komplex zu bedienen.
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: iphtmlpanel+TIPFileDataProvider bug

Beitrag von Maik81ftl »

Eine Frage erst mal vorweg. auf welcher plattform arbeisst du und welche FPC hast du?

Was macht das tool eigendlich wenn du eine HTML reinlädst und einen Darinbefinlichen link Aufrufst.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

Re: iphtmlpanel+TIPFileDataProvider bug

Beitrag von Leberecht »

ich arbeite unter win7 64bit mit lazarus 0.9.30 32bit (fpc 2.4.2).

Was macht das tool eigendlich wenn du eine HTML reinlädst und einen Darinbefinlichen link Aufrufst.

wie gesagt, ich habe es aktuell wie in der demo gemacht/nachgebildet, also eine custom THelpViewer -klasse angelegt und
dazu eine htmlhelpdatabase, ipdatafileprovider+iphtmlpanel. ich kann dann auf links klicken und er navigiert dann auch richtig.
aber wenn ich das ausschliesslich über ein iphtmlpanel machen will, dann weiss ich nicht wie.
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: iphtmlpanel+TIPFileDataProvider bug

Beitrag von pluto »

Ich hatte auch mit dem TIPFileDataProviders Ärger. Ich bin das einfach umgangen. In dem ich den Code geändert habe:

Code: Alles auswählen

{$IFDEF IP_LAZARUS}
procedure TIpHtml.ParseStyleSheet(Parent: TIpHtmlNode; HRef: String);
var
  StyleStream: TStream;
begin
  //debugln(['TIpHtml.ParseStyleSheet ',href,' ',Parent is TIpHtmlNodeHEAD,' ',DbgSName(FDataProvider)]);
  StyleStream:=nil;
  if Parent is TIpHtmlNodeHEAD then begin
//    if FDataProvider<>nil then begin
      //Href := FDataProvider.BuildURL(FCurURL, HRef);
    StyleStream:=TFileStream.Create(href,fmOpenRead);
//      StyleStream := FDataProvider.DoGetStream(HRef);
  //  end;
  end else
  if Parent is TIpHtmlNodeSTYLE then
    StyleStream := TStringStream.Create(Href);
 
  if StyleStream<>nil then
    with TCSSReader.Create(StyleStream, FCSS) do begin
      ParseCSS;
      Free;
      StyleStream.Free;
    end;
end;
{$ENDIF}


Und hier noch mal ein weiteren Code:

Code: Alles auswählen

procedure HTMLStringToHtmlPanel(const HTMLString:String; var HTMLPanel:TIpHtmlPanel);
var
  html:TIpHtml;
  ms:TMemoryStream;
  StrList:TStringList;
begin
  StrList:=TStringList.Create;
  StrList.Text:=HTMLString;
 
  ms:=TMemoryStream.Create;
  StrList.SaveToStream(ms);
  ms.Position:=0; // Von entscheidender Bedeutung, sonst geht es nicht(Vielleicht ein BUG in der LCL bzw. von  TStream bzw. von TStringList.
 
  html:=TIpHtml.Create;
  html.LoadFromStream(ms);
  HTMLPanel.SetHtml(html);
  ms.Free; StrList.Free;
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  str:String;
  StrList:TStringList;
  i:integer;
begin
  StrList:=TStringList.Create;
  for i:=0 to SynMemo1.Lines.Count-1 do begin
    str:=str+SynMemo1.Lines[i]+#13;
  end;
  HTMLStringToHtmlPanel(str,IpHtmlPanel1);
end;

Nun brauchst du kein DataProvider mehr. Ich hoffe du kannst damit etwas Anfangen. Ich weiß auch nicht warum der DataProvider Eingeführt wurde. Der Lädt eigentlich nur die Datei.
MFG
Michael Springwald

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: iphtmlpanel+TIPFileDataProvider bug

Beitrag von Maik81ftl »

2ter code ist auch mein Favo. da ich allerdings noch Nie mit DataProvider gearbeitet hab, ist die diese losung für dein Problem zugegeben Neu.

ergo wieder was gelehrnt :D
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: iphtmlpanel+TIPFileDataProvider bug

Beitrag von pluto »

ist die diese losung für dein Problem zugegeben Neu.

Für mich nicht. Mir ist das aufgefallen, als ich Externe CSS Dateien einbinden wollte. Da habe ich mal den Weg zurückverfolgt und bin dann auf diese Lösung gekommen.
MFG
Michael Springwald

Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

Re: iphtmlpanel+TIPFileDataProvider bug

Beitrag von Leberecht »

danke für den code. hab die prozedur in meiner iphtml.pas wie in code 1 angepasst, aber es kommt immernoch der sigsev fehler.
ich brauch auch trotzdem noch den ipfileprovider. das sagt er mir auch, wenn ich versuche im programm die html-dateien ohne aufzurufen.
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

Re: iphtmlpanel+TIPFileDataProvider bug

Beitrag von Leberecht »

habe jetzt den 2. code genommen und in mein programm modifiziert eingebaut(er lädt jetzt direkt die html-datei von platte), so das ich jetzt ausschliesslich ein IpHTMLPanel habe und nichts weiter(keine htmlhelperdatabase, keinen fileprovider und auch keine custom klassen wie aus der demo) auf meinem formular habe.

das ganze geht soweit, allerdings habe ich noch 2 probleme.

1: wenn in einer geladenen html-datei auf einen link geklickt wurde, kann ich mit "IpHtmlPanel.HotURL;" die url des links mitsamt anker rauskriegen. dann lade ich die neue datei ins panel -das geht auch.
nur: mit welchem befehl kann ich im html-panel zu einem bestimmten anker springen?

2. ich habe keine vor-zurück funktionalität im html-panel mehr. wenn ich eine neue datei reinlade ist die alte weg und "IpHtmlPanel.GoBack;" geht nicht mehr. was ist da der beste weg?
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: iphtmlpanel+TIPFileDataProvider bug

Beitrag von pluto »

Zu eins: Das habe ich bisher noch nicht gemacht. Aber schau dir das HTML Panel mal genau an. Es gibt dafür bestimmt eine Möglichkeit.
Ich habe eben beim Rüberfliegen über den Code nichts gesehen.Aber du kannst direkt auf die Daten der Struktur zugreifen.
Gemacht habe ich sowas aber auch noch nicht. Jedenfalls nicht von Außen nur von "innen".

Zu zwei: Ich denke du musst dir selbst eine Liste anlegen. Wo du drin Navigieren Kannst.
(Ich sehe gerade es gibt "URLStack". Jedoch nur unter protected). URLStack wird intern von GoBack und GoForward verwendet.
MFG
Michael Springwald

Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

Re: iphtmlpanel+TIPFileDataProvider bug

Beitrag von Leberecht »

habs hingekriegt! es funktioniert alles wie es soll. die historie nachzubilden war zwar ein bisschen haarig aber jetzt gehts. eine komplette offline html-hilfe mit nur einer iphtml-komponente.
übrigens, der befehl um im iphtmlpanel zu einem lokalen anker zu springen lautet:

IpHtmlPanel.MakeAnchorVisible(Ankername);

der ankername ist ohne führende raute.
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

Re: iphtmlpanel+TIPFileDataProvider bug

Beitrag von Leberecht »

gibts eigentlich eine möglichkeit die scrollgeschwindigkeit des ipthmlpanels zu erhöhen? das ist bei mir unterträglich langsam, mir kommt
es so vor als scrolle er pixelweise.
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: iphtmlpanel+TIPFileDataProvider bug

Beitrag von pluto »

Ich glaube nicht. Mit Vielen Daten habe ich es auch noch nicht probiert. Das HTML Panel ist nun mal nicht die beste Lösung, aber die Einzigste im Moment.

Der Code ist sehr Komplex geschrieben. Das alles in einem verlangsamt alles.

Tipp: Die Daten in kleine HTML Dateien aufteilen.
MFG
Michael Springwald

Antworten