(gelöst) Fehler bei IpHtmlPanel1

Für Fragen von Einsteigern und Programmieranfängern...

(gelöst) Fehler bei IpHtmlPanel1

Beitragvon yodi » 21. Jun 2018, 20:51 (gelöst) Fehler bei IpHtmlPanel1

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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von yodi am 23. Jun 2018, 10:24, insgesamt 1-mal geändert.
--------
yodi
 
Beiträge: 21
Registriert: 11. Jan 2015, 06:40
Wohnort: bei Göttingen
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Mathias » 21. Jun 2018, 21:25 Re: Fehler bei IpHtmlPanel1

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3987
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon yodi » 21. Jun 2018, 22:24 Re: Fehler bei IpHtmlPanel1

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
--------
yodi
 
Beiträge: 21
Registriert: 11. Jan 2015, 06:40
Wohnort: bei Göttingen
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Mathias » 21. Jun 2018, 22:26 Re: Fehler bei IpHtmlPanel1

Was kommt, bei
Code: Alles auswählen
ShowMessage(verzeichnis)
?
Würde der Pfad stimmen ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3987
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 21. Jun 2018, 22:44 Re: Fehler bei IpHtmlPanel1

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.
wp_xyz
 
Beiträge: 2531
Registriert: 8. Apr 2011, 08:01

Beitragvon yodi » 22. Jun 2018, 00:03 Re: Fehler bei IpHtmlPanel1

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
--------
yodi
 
Beiträge: 21
Registriert: 11. Jan 2015, 06:40
Wohnort: bei Göttingen
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 22. Jun 2018, 08:33 Re: Fehler bei IpHtmlPanel1

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.
wp_xyz
 
Beiträge: 2531
Registriert: 8. Apr 2011, 08:01

Beitragvon yodi » 23. Jun 2018, 10:25 Re: (gelöst) Fehler bei IpHtmlPanel1

Hey Danke so funktioniert alles :)

Flotte Grüße Dirk
--------
yodi
 
Beiträge: 21
Registriert: 11. Jan 2015, 06:40
Wohnort: bei Göttingen
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon m.fuchs » 23. Jun 2018, 10:42 Re: Fehler bei IpHtmlPanel1

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
m.fuchs
 
Beiträge: 1946
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon wp_xyz » 23. Jun 2018, 11:06 Re: (gelöst) Fehler bei IpHtmlPanel1

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.
wp_xyz
 
Beiträge: 2531
Registriert: 8. Apr 2011, 08:01

Beitragvon m.fuchs » 23. Jun 2018, 11:11 Re: (gelöst) Fehler bei IpHtmlPanel1

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
m.fuchs
 
Beiträge: 1946
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon wp_xyz » 24. Jun 2018, 10:12 Re: (gelöst) Fehler bei IpHtmlPanel1

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.
wp_xyz
 
Beiträge: 2531
Registriert: 8. Apr 2011, 08:01

Beitragvon m.fuchs » 24. Jun 2018, 11:26 Re: (gelöst) Fehler bei IpHtmlPanel1

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
m.fuchs
 
Beiträge: 1946
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon wp_xyz » 24. Jun 2018, 13:05 Re: (gelöst) Fehler bei IpHtmlPanel1

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.
wp_xyz
 
Beiträge: 2531
Registriert: 8. Apr 2011, 08:01

Beitragvon m.fuchs » 24. Jun 2018, 16:52 Re: (gelöst) Fehler bei IpHtmlPanel1

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
m.fuchs
 
Beiträge: 1946
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried