(gelöst) Fehler bei IpHtmlPanel1

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
yodi
Beiträge: 22
Registriert: So 11. Jan 2015, 06:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: bei Göttingen
Kontaktdaten:

(gelöst) Fehler bei IpHtmlPanel1

Beitrag von yodi »

Moin,

Ich möchte eine zweite Formöffnen und eine HTML Datei anzeigen. Auf der zweiten Form hab ich ein IpHtmlPanel.
Die HTML-Datei liegt im gleichen Verzeichnis wie die EXE Datei.

Hier mein Code:

Code: Alles auswählen

 
procedure TForm1.MenuItem2Click(Sender: TObject);   // info
var
   verzeichnis: string;
begin
      Form2.Show;
      verzeichnis:=GetCurrentDir;
      Form2.IpHtmlPanel1.openURL(verzeichnis+'\info.html');
 
end;   
 


fehler1.png


Flotte Grüße
Zuletzt geändert von yodi am Sa 23. Jun 2018, 11:24, insgesamt 1-mal geändert.
--------

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Fehler bei IpHtmlPanel1

Beitrag von Mathias »

Versuche mal folgendes:

Code: Alles auswählen

verzeichnis:=ParamStr(0);


Sehe ich das richtig, da verwendest Linux ?
Unter Linux werden die Pfade mit / getrennt, nicht mit \ .
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

yodi
Beiträge: 22
Registriert: So 11. Jan 2015, 06:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: bei Göttingen
Kontaktdaten:

Re: Fehler bei IpHtmlPanel1

Beitrag von yodi »

Hi,

ParamStr(0) bringt nix.

Ich habe Ubuntu Linux und Lazarus läuft unter Wine weil ich ein Windows Programm haben möchte.

mfg Dirk
--------

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Fehler bei IpHtmlPanel1

Beitrag von Mathias »

Was kommt, bei

Code: Alles auswählen

ShowMessage(verzeichnis)
?
Würde der Pfad stimmen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Fehler bei IpHtmlPanel1

Beitrag von wp_xyz »

Alle einfachen Beispiele, die ich gesehen habe und die lokale HTML-Dateien in das IpHTMLPanel laden, verwenden einen der SetHTML...-Befehle. OpenURL sollte eigentlich auch funktionieren - tut's aber nicht, möglicherweise muss man dazu einen der mitgelieferten DataProvider verwenden und konfigurieren, darauf deutet auch die Fehlermeldung hin.

Der folgende Code funktioniert bei mir unter Windows:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  stream: TFilestream;
begin
  stream := TFileStream.Create('testfile.html', fmOpenRead);
  try
    Form2.IpHtmlPanel1.SetHtmlFromStream(stream);
  finally
    stream.Free;
  end;
  Form2.Show;
end;

Form.Show würde ich übrigens erst am Ende aufrufen, weil dadurch ein evtl. langsamer Bildaufbau keine störenden Effekte macht.

yodi
Beiträge: 22
Registriert: So 11. Jan 2015, 06:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: bei Göttingen
Kontaktdaten:

Re: Fehler bei IpHtmlPanel1

Beitrag von yodi »

Hi,

wp_xyz hat geschrieben:Der folgende Code funktioniert bei mir unter Windows:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  stream: TFilestream;
begin
  stream := TFileStream.Create('testfile.html', fmOpenRead);
  try
    Form2.IpHtmlPanel1.SetHtmlFromStream(stream);
  finally
    stream.Free;
  end;
  Form2.Show;
end;



Der Code hat bei mit funktioniert bis ich ein Bild in dem html-code eingefügt habe.
hier mein provisorischer html-Code:

Code: Alles auswählen

 
<html>
    Schlosser ist ein Programm mit dem schnell erechnet werden kann wieviel Stäbe in einem Rahmen passen.<br>
    Es wird berücksichtigt das so Wenig Stäbe wie möglich und der maximal Stababstand nicht überschritten wird.<br>
    <br>
        <img src="DL8AAX_reli.jpg" width="104" height="104" alt="dl8aax" > (c)  DL8AAX<br>
</html>
 


flotte Grüße
--------

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Fehler bei IpHtmlPanel1

Beitrag von wp_xyz »

Jetzt brauchst du doch einen DataProvider, denn der stellt das Event OnGetImage zur Verfügung. Im entsprechenden Event-Handler wird das Bild von der angegebenen URL in ein TPicture eingelesen:

Code: Alles auswählen

procedure TForm2.IpHtmlDataProvider1GetImage(Sender: TIpHtmlNode;
  const URL: string; var Picture: TPicture);
begin
  Picture := TPicture.Create;
  Picture.LoadFromFile(URL);
  // Picture wird vom IpHTMLPanel freigegeben --> hier nicht .Free aufrufen.
end

(Es fällt mir auf, dass man hier das TPicture explizit erzeugen muss, ohne es zerstören zu dürfen. Unschön, aber nicht zu ändern...)

Als Dataprovider nimmst du TIpHTMLDataProvider und verbindest ihn mit der Eigenschaft "DataProvider" des IpHTMLPanel. Der Rest kann bleiben.

yodi
Beiträge: 22
Registriert: So 11. Jan 2015, 06:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: bei Göttingen
Kontaktdaten:

Re: (gelöst) Fehler bei IpHtmlPanel1

Beitrag von yodi »

Hey Danke so funktioniert alles :)

Flotte Grüße Dirk
--------

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Fehler bei IpHtmlPanel1

Beitrag von m.fuchs »

wp_xyz hat geschrieben:

Code: Alles auswählen

procedure TForm2.IpHtmlDataProvider1GetImage(Sender: TIpHtmlNode; const URL: string; var Picture: TPicture);
begin
  Picture := TPicture.Create;
  Picture.LoadFromFile(URL);
  // Picture wird vom IpHTMLPanel freigegeben --> hier nicht .Free aufrufen.
end

(Es fällt mir auf, dass man hier das TPicture explizit erzeugen muss, ohne es zerstören zu dürfen. Unschön, aber nicht zu ändern...)

Ja, das findest du unschön, weil du der Meinung bist dass alles was an einer Stelle erzeugt wurde auch an dieser wieder zerstört werden muss.

Was hier aber tatsächlich unschön ist, ist die Tatsache dass Picture ein var- und kein out-Parameter ist (am besten wäre eigentlich eine Funktion). Deswegen würde ich die erste Zeile sicherheitshalber abändern:

Code: Alles auswählen

 
  if not Assigned(Picture) then Picture := TPicture.Create;
 

In der aktuellen Implementierung wird wohl immer nur nil hineingegeben, aber das könnte sich ja einmal ändern.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: (gelöst) Fehler bei IpHtmlPanel1

Beitrag von wp_xyz »

Mit "out" statt "var" und dem "if Assigned" hast du natürlich recht.

Ich finde dir Konstruktion trotzdem fehlerträchtig. Wenn ich ein Speicherleck suche, dann sehe ich nach Code-Stellen, wo ein "Create" kein entsprechendes "Free" hat. Hier muss ich die Tiefen einer Drittkomponente studieren, um zu verstehen, dass hier kein "Free" stehen darf. Besser wäre von vornhinein gewesen, das Picture schon im IpHtmlPanel zu erzeugen, und das Event ohne "var" und ohne "out" zu deklarieren, so dass der Benutzer gar nicht auf die Idee kommt, das Picture zu erzeugen.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: (gelöst) Fehler bei IpHtmlPanel1

Beitrag von m.fuchs »

wp_xyz hat geschrieben:Besser wäre von vornhinein gewesen, das Picture schon im IpHtmlPanel zu erzeugen, und das Event ohne "var" und ohne "out" zu deklarieren, so dass der Benutzer gar nicht auf die Idee kommt, das Picture zu erzeugen.

Naja, das haut auch nicht hin. Wenn es nämlich kein Bild gibt, gibt man nil zurück. Ist alles nicht so einfach da.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: (gelöst) Fehler bei IpHtmlPanel1

Beitrag von wp_xyz »

m.fuchs hat geschrieben:
wp_xyz hat geschrieben:Besser wäre von vornhinein gewesen, das Picture schon im IpHtmlPanel zu erzeugen, und das Event ohne "var" und ohne "out" zu deklarieren, so dass der Benutzer gar nicht auf die Idee kommt, das Picture zu erzeugen.

Naja, das haut auch nicht hin. Wenn es nämlich kein Bild gibt, gibt man nil zurück. Ist alles nicht so einfach da.

Wenn es kein Bild gibt, dann verwendet man in meinem Ansatz entweder keinen Event-Handler, oder lässt das als Parameter übergebene Picture unverändert. Die Komponente muss intern dafür sorgen, dass sie mit diesem Fall klarkommt.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: (gelöst) Fehler bei IpHtmlPanel1

Beitrag von m.fuchs »

wp_xyz hat geschrieben:
m.fuchs hat geschrieben:Naja, das haut auch nicht hin. Wenn es nämlich kein Bild gibt, gibt man nil zurück. Ist alles nicht so einfach da.

Wenn es kein Bild gibt, dann verwendet man in meinem Ansatz entweder keinen Event-Handler,

Da stehe ich grad auf dem Schlauch, wie geht das?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: (gelöst) Fehler bei IpHtmlPanel1

Beitrag von wp_xyz »

Irgendwie denken wir aneinander vorbei...

Wenn das IpHtmlPanel im anzuzeigenden HTML-Text ein img-Tag findet, wird der DataProvider beauftragt, vom aufrufenden Programm das Bild per Ereignis OnGetImage abzuholen (Gegenstand der Diskussion weiter oben). Wenn das Picture nicht übergeben wird, weil der Event-Handler nicht verwendet wird, oder weil das Bild nicht gefunden wird, so zeigt IpHtmlPanel ein Stellvertreter-Bild an. In meinem "Nicht-var/out"-Ansatz würde das IpHtmlPanel ein TPicture mit Stellvertreter-Bild erzeugen und als Picture Parameter ans Event übergeben. Das aufrufendene Programm hat per LoadFromFile/LoadFromStream oder wie auch immer die Möglichkeit einen anderen Inhalt in dieses Picture einzuladen. Geschieht das nicht, bleibt das Standardbild erhalten. Gegenüber der jetzigen Variante, in der der User selbst das TPicture erzeugt und per var ans IpHtmlPanel übergibt, hat das den Vorteil, dass sich der User nicht um das Aufräumen des Bildes kümmern muss und die Grundregel "Wer etwas erzeugt, muss es auch aufräumen" unangetastet bleibt.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: (gelöst) Fehler bei IpHtmlPanel1

Beitrag von m.fuchs »

Ah, da hatte ich wirklich einen kleinen Aussetzer. Ja, mit einem Platzhalter-Bild ergibt das natürlich Sinn.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten