Autor Beitrag
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ausblenden volle Höhe Delphi-Quelltext
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';    //Hilfsdatei erzeugen
        if fileexists(s) then deletefile(s);
        ms1.savetofile(s);
      finally
        ms1.Free;
      end;
    finally
      FreeLibrary(bib);
    end;
  end;
begin
  //Hilfsdatei erzeugen
  dll_lesen;
  getmem(s,500);
  getmem(t,500);
  getmem(v,500);
  //Verzeichnisse für den PDF-Reader erstellen
  strpcopy(v,arbeitsverzeichnis);
  strpcopy(s,arbeitsverzeichnis+'mathe.pdf');
  findexecutable(s,nil,t);
  //Hilfsdatei anzeigen
  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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Do 28.05.15 17:08 
Hallo,
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 30.05.15 06:48 
user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:

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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Sa 30.05.15 20:14 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden Delphi-Quelltext
1:
  shellexecute(application.handle,'open',pchar(arbeitsverzeichnis+'mathe.pdf'),nilnil,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



BeitragVerfasst: Sa 30.05.15 20:58 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
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? ;-)

Dieser Vorschlag von mir macht natürlich nur Sinn, wenn man das, was ich weiter unter in dem Beitrag, von dem du nur diesen einen Satz zitiert hast, berücksichtigt: Das PDF-Format als Anzeige-Format im Programm verwerfen und auf ein sinnvolleres Format umsteigen, das sich erstens leicht in einer DB speichern und zweitens leichter anzeigen läßt als eine PDF-Datei.

Für diesen Beitrag haben gedankt: Martok
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mo 01.06.15 18:38 
Hallo Perlsau,
user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
... 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 ... :wink:

Hallo Martok,
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Ü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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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.