Autor |
Beitrag |
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Do 28.05.15 16:25
Hallo,
während ich für das Problem des Ladens von Schriftarten aus einer Ressourcen-DLL noch eure vielen Hinweise einarbeite, bin ich erneut bei einem DLL-Ressourcenproblem gelandet.
Einige Hundert PDF-Dateien habe ich ebenfalls in einer DLL zusammengefasst. Ich mag eine Datei lieber als einige Hundert im Ordner.
Zum Anzeigen eines ausgewählten PDFs nutze ich
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| procedure pdfanzeigen(const pdfname:string); var s,t,v:pchar; bib :HINST; procedure dll_lesen; var ms1: TResourcestream; s : string; begin bib := LoadLibraryex(pchar(...+'tpdf.dll'),0,LOAD_LIBRARY_AS_DATAFILE); try ms1 := TResourceStream.Create(bib,pdfname,RT_RCDATA); try s:=arbeitsverzeichnis+'mathe.pdf'; if fileexists(s) then deletefile(s); ms1.savetofile(s); finally ms1.Free; end; finally FreeLibrary(bib); end; end; begin dll_lesen; getmem(s,500); getmem(t,500); getmem(v,500); strpcopy(v,arbeitsverzeichnis); strpcopy(s,arbeitsverzeichnis+'mathe.pdf'); findexecutable(s,nil,t); strpcopy(s,'mathe.pdf'); shellexecute(application.handle,'open',t,s,v,SW_SHOWNORMAL); freemem(s); freemem(t); freemem(v); end; |
Es funktioniert genau wie es soll. Der PDF-Reader wird ermittelt und die Datei korrekt angezeigt. So weit so gut.
Mein Problem ist, dass ich die PDF-Ressource lese und in eine Hilfsdatei "mathe.pdf" im Arbeitsverzeichnis des Programms speichere. Diese wird dann dem PDF-Programm übergeben.
Elegant ist das wohl nicht. Irgendwie stört mich diese Hilfsdatei. Außerdem kann ich so natürlich nur eine PDF-Datei öffnen. Eine zweite Datei geht erst, wenn die erste geschlossen ist. Ich würde daher gern den TResourceStream ms1 direkt an shellexecute übergeben. Das geht aber nicht, da shellexecute eine Datei verlangt und keinen im Speicher liegenden Stream.
Sieht jemand von Euch eine Variante, wie ich die Hilfsdatei umgehen kann.
Danke für Hinweise
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Nersgatt
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 28.05.15 16:39
Ich würde mir den Umweg über die Ressourcendatei sparen. Auch wenn ich dann viele kleine PDF-Dateien im Programmorder habe.
Dadurch umgehst Du alle Probleme, die Du jetzt ansprichst. Und weniger Aufwand ist es obendrein.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Do 28.05.15 16:42
Soviel ich weiß macht Windows das auch nicht anders, denn in den temporären Verzeichnissen findet man dutzende von PDF-Dateien. Ich mach das bei mir auch so, die PDF-Dateien in ein temporäres Verzeichnis. Die Dateinamen erhalten ProzessID, Datum und Uhrzeit, damit sind sie für meine Zwecke eindeutig.
|
|
Nersgatt
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 28.05.15 16:49
Und dann wundern sich die Leute, dass der Temp-Ordner mit der Zeit 50 GB anwächst...
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Do 28.05.15 17:08
Hallo,
Nersgatt hat folgendes geschrieben : | Ich würde mir den Umweg über die Ressourcendatei sparen. Auch wenn ich dann viele kleine PDF-Dateien im Programmorder habe. |
Im Prinzip hast du recht.
Mein Problem war nur, dass ich in der "schlimmsten" Zeit fast 10000 Dateien (GIF,JPG,TXT,PDF,...) in x Programmordnern hatte. Allein das Kopieren und Installieren dauerte eine Ewigkeit. Die Verwaltung war ebenfalls schwieriger, da ich statt 20 Ressourcen-DLLs mehr als 50 Unterordner hatte. Am Ende habe ich kaum noch durchgesehen.
Festplatten sind zwar heute gigantisch groß, aber über 20 % Dateiüberhang auf der HD war mir einfach zu viel. Jetzt bin ich bei 0,03 %. Beweisen kann ich es nicht, aber mein Eindruck ist, dass auch der Zugriff auf die Daten jetzt schneller ist.
Na ja und außerdem hatte ich auch den Wunsch, dass nicht jeder ohne Aufwand an die einzelnen Dateien herankam und sie für nicht beabsichtigte Zwecke "missbraucht". Natürlich kommt jeder Profi ohne Probleme an die Daten. Das ist klar.
Nersgatt hat folgendes geschrieben : | Und dann wundern sich die Leute, dass der Temp-Ordner mit der Zeit 50 GB anwächst... |
Richtig. Das geschieht aber bei meinem Problem nicht, da maximal 1 PDF-Datei im Arbeitsverzeichnis liegt.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Nersgatt
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 28.05.15 17:48
Um was für PDFs handelt es sich denn? Du könntest nach einer Lösung suchen, die Dateien direkt in Deinem Programm anzuzeigen. Damit hab ich mich noch nicht beschäftigt, könnte mir aber vorstellen, dass es dafür Komponenten gibt. Die aber sicher auch Geld kosten.
Oder könntest Du die Infos aus in ein anderes Format wandeln? Wenn Du z.B. HTML-Seiten daraus machst, kannst Du sie recht problemlos innerhalb der Anwendung anzeigen.
Und mit den Lösungen brauchst Du auch die temporären Dateien nicht mehr und hast alles selbst im Griff.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Für diesen Beitrag haben gedankt: Mathematiker
|
|
jaenicke
Beiträge: 19284
Erhaltene Danke: 1742
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 28.05.15 21:07
Solange du das Verzeichnis für temporäre Dateien von Windows nutzt und die Datei dort auch wieder löscht, gibt es damit kein Problem.
Es gibt auch temporäre Dateien, die Windows automatisch löscht. Das könnte evtl. auch gehen.
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Fr 29.05.15 23:58
Hallo,
Danke für die Antworten.
Wahrscheinlich gibt es wohl keine einfache Methode einen MemoryStream direkt an shellexecute weiterzugeben. Macht nichts.
Die Idee mit den HTML-Dateien sehe ich mir mal an.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
jaenicke
Beiträge: 19284
Erhaltene Danke: 1742
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 30.05.15 06:48
Mathematiker hat folgendes geschrieben : |
Wahrscheinlich gibt es wohl keine einfache Methode einen MemoryStream direkt an shellexecute weiterzugeben. |
Nein, das geht gar nicht. Denn die Parameter muss das Zielprogrsmm ja auswerten, wie sollte man das allgemein machen?
|
|
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 30.05.15 10:21
Moin Mathematiker
Vielleicht wäre es an der Zeit, deine anerkannt sinnvolle und weit verbreitete Mathe-Anwendung, die sich mit der Zeit wohl immer schwerer warten und erweitern lassen wird, auf eine neue Stufe zu heben und eine Datenbank einzusetzen. Damit wäre das alles weitaus einfacher zu handeln, denn die Verwaltung übernähme das DBMS. Das könntest du auch mit deiner Delphi-Version (Zeos-Komponenten) oder auch mit Lazarus bzw. CodeTyphon, wobei letzteres noch den Vorteil böte, für andere Betriebssysteme wie Linux und Mac zu kompilieren. Vermutlich schreckst du da erstmal davor zurück, denn das würde natürlich "ein wenig" Aufwand bedeuten, sich aber aus meiner Sicht letztendlich lohnen.
Das PDF-Format ist meiner Erfahrung nach ungeeignet für Anzeigen in Programmen, es dient vor allem der Weitergabe formatierter Texte, die auf zahlreichen Geräten und Betriebssystemen nahezu gleich aussehen sollen. Ich hätte hier das RichText-Format gewählt, das genügt in den allermeisten Fällen vollauf zur Textdarstellung – oder eben HTML, wie oben bereits vorgeschlagen wurde. Einige Browser bieten gut bedienbare HTML-Editoren. So hab ich z.B. meine "neue" Firmenhomepage mit dem HTML-Editor von Seamonkey gestaltet.
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Martok
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Sa 30.05.15 20:14
jaenicke hat folgendes geschrieben : | Es gibt auch temporäre Dateien, die Windows automatisch löscht. Das könnte evtl. auch gehen. |
Das wäre dann ein FILE_FLAG_DELETE_ON_CLOSE, das hilft aber nur wenn du selbst die Datei offen halten kannst.
Browser machen sowas im allgemeinen so, dass sie alle erzeugten Temp-Downloads in eine Liste schreiben und die beim Programmende abräumen. Die Dateinamen könnte man sich von Windows per GetTempFileName geben lassen.
Perlsau hat folgendes geschrieben : | Vielleicht wäre es an der Zeit, deine anerkannt sinnvolle und weit verbreitete Mathe-Anwendung, die sich mit der Zeit wohl immer schwerer warten und erweitern lassen wird, auf eine neue Stufe zu heben und eine Datenbank einzusetzen. |
Und wo hilft das für das aktuelle Problem?
Übrigens: du brauchst das auszuführende Programm nicht vorher ermitteln, ShellExecute tut das selber, wenn man als Programmnamen den Dateinamen verwendet und als Operation 'open'.
Zitat: | open
Opens the item specified by the lpFile parameter. The item can be a file or folder.
|
Damit bleibt dann nur noch:
Delphi-Quelltext 1:
| shellexecute(application.handle,'open',pchar(arbeitsverzeichnis+'mathe.pdf'),nil, nil,SW_SHOWNORMAL); |
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 30.05.15 20:58
Für diesen Beitrag haben gedankt: Martok
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mo 01.06.15 18:38
Hallo Perlsau,
Perlsau hat folgendes geschrieben : | ... auf eine neue Stufe zu heben und eine Datenbank einzusetzen. Damit wäre das alles weitaus einfacher zu handeln ... |
Du hast recht, aber mein Verhältnis zu Datenbanken ist "schwer gestört".
Alle Argument sprechen dafür, ich kann mich im Moment aber nicht dazu entschließen, eine solch gravierende Änderung durchzuführen. Vielleicht doch irgendwann ...
Hallo Martok,
Martok hat folgendes geschrieben : | Übrigens: du brauchst das auszuführende Programm nicht vorher ermitteln, ShellExecute tut das selber, wenn man als Programmnamen den Dateinamen verwendet und als Operation 'open'. |
Auf meinem vorherigen Rechner hatte ich den Adobe PDF-Reader und zusätzlich eine ziemlich alte Version des "Vollprogramms". Aus irgendeinem Grund funktionierte dort das Aufrufen über den Dateinamen nicht. Deshalb hatte ich so umständlich pdf-Dateien aufgerufen.
Ich habe es jetzt wieder auf deinen Hinweis umgestellt.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Mo 01.06.15 21:26
Ich schlage mich hier auf Perlsaus Seite. Auch wenn das Problem mit seiner Antwort vielleicht nicht gelöst zu sein scheinen mag, so ist ein Hinweis, das Problem auf einem neuen Niveau, mit einer neuen Qualität zu lösen, prinzipiell und tendenziell vielleicht doch hilfreich. Anderenfalls wäre Programmierung auch heute noch auf dem Niveau des Maschinencodes angesiedelt.
Zuletzt bearbeitet von Delphi-Laie am Mo 01.06.15 22:16, insgesamt 1-mal bearbeitet
|
|
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 01.06.15 22:04
Auch wenn ich in der Sache recht habe, verstehe ich doch des Mathematikers Situation sehr gut: Er entwickelt sein Programm nebenberuflich, wobei er als Lehrer immer auch Arbeit mit nach Hause nehmen muß (Klassenarbeiten korrigieren) und zudem, wie ich glaube, auch noch Familie hat. Sicher dürfte auch der Aufwand ansich eine Rolle spielen, angefangen mit dem Einarbeiten in Datenbank-Entwicklung bis hin zu Überlegungen, wie man mit einer Uralt-Delphi-Version moderne Anforderungen umsetzen kann, falls das überhaupt möglich ist. Daher denke ich, wir sollten damit aufhören, diesbezüglich weiter Druck auf den Mathematiker auszuüben. Er ist schon "groß" wird daher selber wissen, was er will und was nicht.
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Mo 01.06.15 22:15
Als "Druck ausüben" habe ich weder Deinen helfenden Hinweis angesehen noch meine Meinung dazu gemeint. Der Einarbeitungsaufwand ist hoch, die Erfolge lassen zunächst auf sich warten. Aber auch die Infinitesimalrechnung z.B. wurde anfangs angefeindet, und ihr Sinn erschließt sich anfangs auch keinem Schüler.
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 01.06.15 22:18
Moin!
Da das eigentliche Thema des Threads offensichtlich nicht mehr diskutiert wird, mache ich hier mal zu.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
Für diesen Beitrag haben gedankt: Christian S., Nersgatt
|
|
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.
Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.
|
|