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.
procedure TForm1.MenuItem2Click(Sender: TObject); // info
var
verzeichnis: string;
begin
Form2.Show;
verzeichnis:=GetCurrentDir;
Form2.IpHtmlPanel1.openURL(verzeichnis+'\info.html');
end;
Flotte Grüße
Zuletzt geändert von yodi am Sa 23. Jun 2018, 11:24, insgesamt 1-mal geändert.
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:
<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>
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:
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.
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:
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 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 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.
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.