Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   FreePascal Äquivalent für ShellExecute ("print", Filename) unter Linux (https://www.delphipraxis.net/182527-aequivalent-fuer-shellexecute-print-filename-unter-linux.html)

Harry Stahl 29. Okt 2014 21:17

Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Unter Windows kann ich mit

Delphi-Quellcode:
ShellExecute (0, 'print', DocumentName, ...);
eine bestimmte Dokumentdatei automatisch vom richtigen Programm öffnen und drucken lassen.

Aber wie geht das mit FreePascal/Lazarus unter Linux? Die Möglichkeit mit TProcess eine Datei ausführen zu können kenne ich, aber dann wird die Datei nur vom zugehörigen Programm geöffnet, ich will Sie aber direkt auch drucken. Gibt es evtl. dafür unter Linux einen bestimmten (Konsolen-) Befehl?

himitsu 29. Okt 2014 21:26

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Du könntest irgendwo auslesen welches Programm man zum Öffnen dieser Datei verwenden muß
und dann guckst du in die Dokumentation, ob das Programm auch einen Parameter hat, der dem Programm sagt "druck das". :stupid:

Harry Stahl 29. Okt 2014 22:33

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Dann müsste ich bei jedem Programm in die Dokumentation schauen, das wär ein wenig zuviel Aufwand. Es wäre schön, wenn es unter Linux einen ähnlichen Standard, wie unter Windows gäbe. Vielleicht gibt es den ja, nur kenne ich mich unter Linux noch nicht wirklich gut aus (also im Verhältnis zu Windows gesehen).

himitsu 29. Okt 2014 23:02

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
:gruebel: Man nimmt das Dokument und schickt es an den Drucker?

Bei Google suchenlinux command line print document

Namenloser 29. Okt 2014 23:16

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Anscheinend läuft das über CUPS:

Zitat:

Zitat von Wikipedia
Der Hauptvorteil von CUPS gegenüber anderen Drucksystemen ist, dass es ein standardisiertes und modularisiertes System ist, welches eine Vielzahl von unterschiedlichen Daten auf dem Druckserver versteht (z. B. PDF-Dateien, PNG-Bilder, LaTeX-Texte). Mit einem solchen System ist plattformübergreifendes Arbeiten in heterogenen Netzwerken möglich. In Verbindung mit Samba lassen sich sogar CUPS-Dateien über einen virtuellen Spooler drucken, mit welchem Windows-Rechner kommunizieren können.


jaenicke 30. Okt 2014 09:36

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Es gibt aber keinen Ersatz für die Funktionalität von ShellExecute. Sprich es gibt keine Standardmöglichkeit ein bestimmtes Programm zu öffnen um damit ein Dokument zu drucken.

Klaus01 30. Okt 2014 09:45

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Vielleicht hilft diese Seite (executing external programms)

Grüße
Klaus

MichaelT 30. Okt 2014 15:01

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
PostScript, PDF, Text und Bilder wird von CUPS direkt verstanden.

http://www.eecs.utk.edu/resources/it...x-command-line

https://people.gnome.org/~alexl/pres...6-printing.pdf

Wie weit das nützlich ist ....

So etwas wie Shell_Execute und anzeigen wäre gnome_url_show().

Die meisten formatierten Ausdrucke laufen über PDF und PDF/A.

Wobei Dokument einfach auf den Drucker schicken.


Zitat:

Zitat von Harry Stahl (Beitrag 1277983)
Unter Windows kann ich mit

Delphi-Quellcode:
ShellExecute (0, 'print', DocumentName, ...);
eine bestimmte Dokumentdatei automatisch vom richtigen Programm öffnen und drucken lassen.

Aber wie geht das mit FreePascal/Lazarus unter Linux? Die Möglichkeit mit TProcess eine Datei ausführen zu können kenne ich, aber dann wird die Datei nur vom zugehörigen Programm geöffnet, ich will Sie aber direkt auch drucken. Gibt es evtl. dafür unter Linux einen bestimmten (Konsolen-) Befehl?


creed steiger 30. Okt 2014 17:41

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Was für Dokumente sind es genau?

xdg gibt sowas leider nicht her, aber evtl findet sich eine andere Lösung.

jaenicke 30. Okt 2014 18:41

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Es geht ja wie er schon oben geschrieben hat um keine bestimmten Dateien, sondern um beliebige Dateien. Und dafür gibt es nun einmal unter Linux keine Lösung wie unter Windows.

creed steiger 30. Okt 2014 19:04

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Zitat:

Zitat von jaenicke (Beitrag 1278099)
Es geht ja wie er schon oben geschrieben hat um keine bestimmten Dateien, sondern um beliebige Dateien. Und dafür gibt es nun einmal unter Linux keine Lösung wie unter Windows.

Beliebig? (Das funktioniert unter Windows auch nicht ohne die entsprechende Anwendungen)
Hab ich jetzt nicht so aus der Fragestellung herausgelesen.
Darum dir Frage nach den Formaten.

Harry Stahl 30. Okt 2014 21:36

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Ja, es ging mir schon um "beliebige" Dateien. Und klar, unterstellt wie bei Windows, dass dafür Anwendungen auf dem PC bereit stehen, die sich im System zum Öffnen und Drucken für den Dateityp registriert haben.

Aber wenn es sowas unter Linux nicht gibt, werde ich es dann wohl doch so machen, wie hier vorgeschlagen, dass ich zumindest für die wichtigsten Dateitypen prüfen werde, ob dafür Programme zum Öffnen auf dem System installiert sind und diese dann direkt mit einem richtigen Startparameter beim Start des Programms (bei Libre Writer z.B. "-p {Dateiname}") auf dem Drucker ausgebe.

Harry Stahl 30. Okt 2014 23:17

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich habe das jetzt erst mal so gelöst, dass eine Reihe von Standard-Dokumententypen einfach mit den Programmen des Libre-Office-Pakets gedruckt werden, die ja eigentlich bei jeder größeren Linux-Distro mit dabei sind.

Delphi-Quellcode:

procedure ExecACommand (cmd: string);
var
  WrkProcess:TProcess;
begin
  WrkProcess:=TProcess.Create(nil);
  WrkProcess.Options:=[poNoConsole];
  WrkProcess.CommandLine:=Cmd;
  WrkProcess.Execute;
  WrkProcess.Free;
end;

procedure PrintOutThisFile (fn: String);
var
  ext: string;
begin
  ext := lowercase (ExtractFileExt (fn));

  if pos (ext, '.odt.txt.doc.rtf.docx.pas.dfm') <> 0 then begin
    ExecACommand ('soffice --writer -p "' + fn + '"');
  end;

  if pos (ext, '.ods.xls.xlsx.csv') <> 0 then begin
    ExecACommand ('soffice --calc -p "' + fn + '"');
  end;

  if pos (ext, '.ppt.pptx') <> 0 then begin
    ExecACommand ('soffice --impress -p "' + fn + '"');
  end;

  if pos (ext, '.bmp') <> 0 then begin
    ExecACommand ('soffice --draw -p "' + fn + '"');
  end;
end;

procedure Tf_PrintFiles.bnPrintAllClick(Sender: TObject);
var
  L: Integer;
  pa: string;
begin
  for L := 0 to lbPrint.Count -1 do begin
    if lbPrint.checked[L] then begin
      PrintOutThisFile (lbPrint.items[L]);
      lbPrint.checked[L] := false;
    end;
  end;
end;
Gedacht ist diese Funktion z.B. wenn mann mehrere Dateien per Mail erhält (Textdokument, XLS und Powerpoint-Dateien), dann kann man die gewünschten Dateien auswählen und auf einmal zum Drucker schicken, man muss nicht jede einzelne Datei öffnen und die Druckfunktion aufrufen. Eine ungemeine Arbeitserleichterung (vgl. auch anl. Screenshot).

JamesTKirk 5. Nov 2014 06:37

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Du solltest vielleicht noch sicherstellen, dass du eventuelle Exceptions von
Delphi-Quellcode:
TProcess
abfängst, die zum Beispiel kommen, wenn soffice nämlich nicht installiert ist, denn wenn auch jede Distro LibreOffice im jeweiligen PacketManager hat, so muss es nicht auf jeder Benutzerinstallation auch vorhanden sein (einer meiner beiden ArchLinux Rechner hat zum Beispiel kein LibreOffice installiert).

Gruß,
Sven

creed steiger 5. Nov 2014 18:41

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
kioclient oder gnome-open wäre evtl noch eine Möglichkeit die weite Bereiche (KDE und Gnome) abdeckt.

himitsu 5. Nov 2014 20:00

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Zitat:

Zitat von Harry Stahl (Beitrag 1278119)
Delphi-Quellcode:
ext := lowercase (ExtractFileExt (fn));
  if pos (ext, '.odt.txt.doc.rtf.docx.pas.dfm') <> 0 then begin

Mit POS kannst du, dank der Mobilen Plattformen schnell mal stolpern,
denn neuerdings sind String 0-basierend. :stupid:

Darum würde ich dir eher zu den neueren und ganz neuen Features raten.
z.B. Delphi-Referenz durchsuchenContainsText(X, S), Delphi-Referenz durchsuchenMatchText(S, [X, X, ...]), S.ToLower.LastIndexOf(X)>=0
Vorallem die Record-Helper sind immer 0-basierend und arbeiten somit überall gleich, auch im Windows.

implementation 5. Nov 2014 20:36

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Du solltest die Programme dafür auch nicht fest eincoden. Lass es doch den User entscheiden, was wie geöffnet wird. Dann gibt es auch keine Probleme, wenn derjenige mal lieber Calligra, KOffice, AbiWord, Gnumeric, OpenOffice, CheGuevaraOffice oder whatever benutzt, evtl. auch unter irgendeinem exotischen Pfad, der nicht in $PATH steckt. KDE und GNOME haben für sowas auch zentrale Einstellungen, du kannst ja schauen ob du dich einer davon bedienen willst. Der User freut sich bestimmt, nicht alles bei jedem Programm aufs neue setzen zu müssen. Ansonsten mach einfach einen Einstellungsdialog dafür, mit ner Tabelle, immer links das Dateimerkmal (könnte man als Endung umsetzen oder als allgemeinere Maske, z.B. Wildcards oder RegEx; oft haben Dateien unter GNU/Linux nämlich auch gar keine Endung, gibt z.B. die Konvention, reine Textdateien, die zum lesen bestimmt sind (also nicht zum weiterverarbeiten) einfach nur in VERSALIEN zu schreiben, z.B. "INSTALL", "README", "AUTHORS", "COPYRIGHT", ...; und dann gibts noch die schöne "Makefile"; Ausführbares hat entweder nie eine Endung (binaries) oder sie ist optional (Skripte, wenn sie ein Shebang haben); manchmal spiegelt der Teil hinterm Punkt auch was völlig anderes wieder als den Typen, z.B. sind /etc/rc.local und /etc/rc.shutdown beides Shellskripte) und rechts dann die Kommandozeile dafür.

Harry Stahl 5. Nov 2014 20:48

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
An JamesTKirk (als alter Star-Trek-Fan kann ich nur sagen, cooler Name!):
Danke, guter Hinweis, werde ich da noch einbauen.

An creed steiger:
gnome open funktioniert aber nicht unter Linux mint, da muss man was anderes nehmen.

An himitsu:
Ja, das stimmt zwar, aber mein Code ist in Free Pascal 2.6.x / Lazarus 1.26 geschrieben, da gibt es noch kein s.Tolower etc.
(und zur Erinnerung, hier geht es um Linux:wink:)

An implementation:
Ja, könnte man optional auswählbar machen. Wäre natürlich mit etwas Arbeit verbunden für den User...

implementation 5. Nov 2014 20:58

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Zitat:

Zitat von Harry Stahl (Beitrag 1278844)
An implementation:
Ja, könnte man optional auswählbar machen. Wäre natürlich mit etwas Arbeit verbunden für den User...

Du kannst ja Standardwerte vorgeben, von denen du denkst, dass sie in den meisten Fällen laufen. Und nur wo der User was anderes wünscht, muss ers ändern.
Sorry, dass ich das so sage, aber so etwas hartzukodieren finde ich ziemlich interopatibilitätsfeindlich und das ist auf einem Multikulti-OS, das bei jedem anders funktioniert, eine ziemliche Todsünde. Ich drück das so drastisch nicht aus, weil ich dich irgendwie beleidigen will oder so, sondern es ist wirklich so, dass Setup A potenziell völlig anders aussieht als Setup B. Es gibt nichts, wovon du annehmen kannst, dass es immer vorhanden ist, außer vielleicht die libc, POSIX und bei grafischen Oberflächen höchstens noch XDG. Du musst nicht für alle Fälle eine Lösung bieten, das ist klar, wird auch selten erwartet. Aber es kommt sehr negativ rüber, wenn man es dann nicht einmal selbst anpassen kann.
Also ernsthaft: Mach es irgendwie änderbar, wenn auch nur über eine sonstwo versteckte Konfigdatei, oder eben über einen externen Mechanismus.

himitsu 5. Nov 2014 21:45

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Wie Delphi für Linux mal aussehn wird, weiß auch noch keiner so genau.

Aber selbst Lazarus/FreePascal sollte Befehle wie ContainsText und MatchText kennen, welche genau das machen, was man eigentlich machen will.

Harry Stahl 5. Nov 2014 22:23

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von implementation (Beitrag 1278847)
Sorry, dass ich das so sage, aber so etwas hartzukodieren finde ich ziemlich interopatibilitätsfeindlich und das ist auf einem Multikulti-OS, das bei jedem anders funktioniert, eine ziemliche Todsünde. Ich drück das so drastisch nicht aus, weil ich dich irgendwie beleidigen will oder so, sondern es ist wirklich so, dass Setup A potenziell völlig anders aussieht als Setup B.

Kein Problem, ich bin für Hinweise immer dankbar. Das war jetzt auch erst mal nur eine schnelle Lösung, damit die Funktion überhaupt etwas bietet. Unter Linux bin ich ein ziemlicher Anfänger, da fehlt mir noch an vielen Ecken das Hintergrundwissen. Ohne das ist es auch nicht so einfach, die Sachen unter Linux zu programmieren. Hinzu kommt, das jedes Linux mit unterschiedlichen Desktopmanagern oder Systemtools versehen sein kann und das diese in der nächsten größten Versionsänderung nicht mehr verwendet werden...

Ich muss mich also der Sache langsam nähern und Schritt für Schritt optimieren. In gewisser Weise kann man das im Moment auch als eine Art Hobby sehen, denn großen Kommerz sehe ich im Moment unter Linux nicht auf mich zukommen. Macht aber irgendwie Spaß...:-D Und manchmal gibt es ja vielleicht eine Anregung, wie etwas unter Linux gelöst ist, was man dann nach Windows oder MAC übernehmen könnte.

Für das Öffnen von Dateien habe ich übrigens schon so eine User-Auswahl-Lösung drin (siehe anliegende Sreenshots): Der user kann die Dateien zum Öffnen von Programmen in den Einstellungen festlegen und dann per Rechtsklick auf die Datei auswählen. Sowas in der Art könnte man natürlich auch für das Drucken machen...

JamesTKirk 6. Nov 2014 06:22

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Zitat:

Zitat von himitsu (Beitrag 1278850)
Aber selbst Lazarus/FreePascal sollte Befehle wie ContainsText und MatchText kennen, welche genau das machen, was man eigentlich machen will.

Nennt sich
Delphi-Quellcode:
Pos
. ;)

Gruß,
Sven

creed steiger 6. Nov 2014 16:47

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
hmm ich hab noch mal geschaut, mit xgd-open sollte es doch gehen.
(Es greift wenn vorhanden auf gnome-open oder kioclient oder exo-open zu. Wenn diese nicht vorhanden sind auf die eigene config)
Allerdings kommt hier wieder die Paketierung zum tragen d.h. es wäre eine Anforderung (xdg-utils) für deine Software.
https://wiki.archlinux.org/index.php/xdg-open

himitsu 6. Nov 2014 16:54

AW: Äquivalent für ShellExecute ("print", Filename) unter Linux
 
Zitat:

Zitat von JamesTKirk (Beitrag 1278863)
Nennt sich
Delphi-Quellcode:
Pos
. ;)

Pos -> komische Zahl

Ist da der Text dort drin enthalten? (Contains) -> Ja oder Nein
Ist der Text in dem Array/Liste enthalten? (Match) -> Ja oder Nein

Ist das Auto grün? -> 42 :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz