Autor Beitrag
MeierZwoo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Mi 26.03.14 21:57 
Hallo,
ich möchte die nur im Drucker(treiber) vorhandenen Fonts des Druckers direkt ermitteln.

Bisher mache ich dies bisher brutal durch Vergleich der Gesamt-Fonts mit den Screen-Fonts, der auch funktioniert und hier nur zum evtl. Verständnis steht:

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:
39:
40:
41:
42:
43:
44:
// Symbolischer, grob funktionierender Quelltext
procedure irgendwas;
var ScreenFonts,
    Druckerfonts : TStringList;
    i, fi, p     : integer;
    FontName     : string;
    // ...
begin 
  // ...
 
  // aktuell zu untersuchenden Drucker index p setzen, damit dessen Fonts in der Font-Gesamtliste sind
  printer.PrinterIndex:=p:

  // Die Font-Gesamtliste besteht nun aus den Windows-Fonts (Screenliste) und den Drucker-Fonts
  // Gesamtliste mit Screenliste vergleichen, der Rest sind die Drucker-Fonts
  if GetDeviceCaps(Printer.Handle,NUMFONTS)>0  // nur wenn der Druckertreiber meint, der Drucker hat Fonts
  then begin
    ScreenFonts  := TStringList.Create;
    Druckerfonts := TStringList.Create;

    for i:=0 to Screen.Fonts.Count-1  // alle Screen.Fonts der Screenliste hinzufuegen
    do begin
      FontName:=Screen.Fonts[i];
      ScreenFonts.add(FontName);
    end;

    for i:=0 to Printer.Fonts.Count-1  // alle Printer.Fonts (Gesamtliste) mit Screenliste vergleichen 
    do begin
      FontName:=Printer.Fonts[i]; 
      fi:=ScreenFonts.IndexOf(FontName);
      if ((fi>=0and (fi<ScreenFonts.count))
      then ScreenFonts.Delete(fi) 
      else Druckerfonts.add.FontName;
    end;
    // in der Druckerliste sind nun nur Fonts, die nicht in der Screenliste sind

    // ... (Ausgabe der Druckerfonts)

    Druckerfonts.free:
    ScreenFonts.free;
  end// NUMFONTS>0

  // ...
end;


Ich suche allerdings nach einer Möglichkeit, die Fonts direkt vom aktuell gesetzen Drucker(treiber) zu ermitteln - ich hatte das irgendwann mal im Web gelesen, aber nicht vermerkt und finde es auch nicht wieder.

MfG :)


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 26.03.2014 um 22:09
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 26.03.14 22:11 
ausblenden Delphi-Quelltext
1:
Listbox1.Items.Assign(Printer.Fonts);					

Quelle: Tipps-und-Tricks-Seite im Delphi-Treff

Welche Fonts sollte man denn sonst erhalten, wenn man Printer.Fonts abruft? Ich meine, man erhält immer die Fonts des aktuellen Druckers. Übrigens glaube ich nicht, daß in Druckertreibern Fonts enthalten sind, lasse mich aber gerne eines Besseren belehren. Meines Wissens nach befinden sich Fontdaten in den Druckern selber, denn viele Drucker können auch komplett ohne PC und Druckertreiber betrieben werden, z.B. beim Drucken der Testseite.
MeierZwoo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Mi 26.03.14 22:53 
user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:

Welche Fonts sollte man denn sonst erhalten, wenn man Printer.Fonts abruft?

Alle Fonts, die printer.canvas benutzen kann. Das sind alle unter win installierten Fonts sowie die im Drucker (nach Meinung des Treibers) installierten Fonts. Dazu muß der Drucker weder am PC angeschlossen sein noch (zum evtl. antworten) eingeschaltet sein. Diese Information bezieht Win aus dem Treiber.

Win entscheidet beim Ausführen der canvas dann, ob ein Font nur in Win existiert und sendet dann Pixel, oder ob ein Font auf dem Drucker selbst installiert ist, und sendet dann Commands. Bis Win 3x war in den Fontlisten (z.B. für das Schriftsetzen in einem Editor) noch ein Druckersymbol vor dem Schriftnamen (statt TT oder Adobe-Symbol).

Zitat:

Übrigens glaube ich nicht, daß in Druckertreibern Fonts enthalten sind, lasse mich aber gerne eines Besseren belehren.

Fonts selber müssen dort auch nicht enthalten sein - wohl aber die Liste der Fonts. Und nur um diese Liste geht es ja hier. Wenn Du die Fontliste printer.fonts ausgeben läßt, wirst Du dort alle Fonts erhalten, incl. der nur im (aktuell gesetzen) Drucker enthaltenen Fonts (Die Nur-Druckerfonts normal am Anfang der Liste (Index 0..n)). Woher soll denn sonst ein Programm zur Runtime in der canvas einen nur im Drucker vorhandenen Font benutzen können, wenn dieser nicht antworten kann?

Und oft kann der Drucker nicht antworten und seine Fonts mitteilen, selbst wenn wollte. Entweder wg. einer uni-directionalen Schnittstelle oder im LAN, wenn der Druckauftrag in Queue geschrieben wird - die Queue kann keine Druckerinformationen zurück übermitteln.

Zitat:

Meines Wissens nach befinden sich Fontdaten in den Druckern selber, denn viele Drucker können auch komplett ohne PC und Druckertreiber betrieben werden, z.B. beim Drucken der Testseite.

Natürlich weiß ein Drucker selbst, welche Fonts auf ihm installiert sind (Und kann diese Fontliste auch per Testdruck am Drucker selbst ausgeben - zumindest bei denen, die das Implementiert haben).
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 26.03.14 23:36 
Vielleicht hilft dieser Text weiter: support.microsoft.com/kb/201978
MeierZwoo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Do 27.03.14 00:17 
Danke Gerd,
hoch interessant, aber die Umsetzung in Quellcode ist wohl etwas aufwendiger als meine zugegebenerweise "primitive" Version, zumal ich die Fontwerte (Fontmatrix, ...) nicht benötige.
:)