# Drucken



## Stgt (29. Dezember 2004)

hi

weiß jemand von euch, wie man zeilenweise drucken kann. 
Also es soll eine Zeile gedruckt werden und dann angehalten werden . 
Sprich die Seite soll nicht durchgezogen werden. 
danke
gruß


----------



## Tobias K. (29. Dezember 2004)

moin


Erstmal ne standart Antwort/Frage von mir:
Welcher Compiler?
Welche Bibliotheken stehen dir zur verfügung(MFC/API/reines C/C++);
In welcher Sprache, C oder C++?


mfg
umbrasaxum


----------



## Stgt (29. Dezember 2004)

hi

VC6/ VS.net
MFC/API usw
c++

wobei ich mir sicher bin dass es mit GDI nicht geht, stimmts ?
gruß


----------



## PixelShader (29. Dezember 2004)

Hi,
Fruher unter DOS habe ich genau diesen Effekt erreicht, indem ich die Zeichen einfach an LPT Port ausgegeben habe, der Drucker druckt sie dann sodort und wartet auf das naechste. Ich glaube Zeichen 0x01 war dann das Zeichen um das Papier auszuwerfen. Mit inout32.dll wird es unter XP vielleicht sogar klappen.


----------



## Stgt (30. Dezember 2004)

hi

wie hast du das dann gemacht. Kannst du mir das bitte mal zeigen.
Also ich hab gedacht es würde so gehen:

#include <stdio.h>  // Präprozessor-Direktiven
int main()
{
   FILE *Drucker;
   int Logfehler;

// Ausgabe des Ergebnisses
   Drucker = fopen("PRN","w");
   fprintf(Drucker," L O G F E H L E R \n\n");
   fprintf(Drucker,"%d",Logfehler); 
  fclose(Drucker); 
   return 0;
}


danke, gruß


----------



## PixelShader (30. Dezember 2004)

Hi,
Ich habe das nicht mit WinAPI gemacht, wie du, sondern mit Assembler direkt die LPT Ports angeschprochen. LPT1 = 0x378. Das waren aber auch alte Zeiten...
Hier: http://www.logix4u.cjb.net/
kannst du die inpout32.dll runterladen, und unter Windows NT Versionen auch den LPT port per Out32 direkt ansprechen.

Etwa so:

```
Out32( 0x378, 'A' ); // Der Drucker soll erstmal ein "A" drucken
Out32( 0x378, 10 ); // Dann in die naechste Zeile
```
Vor der ausgabe zum Drucker mit Out32 muss du auch keine HANDLES initialisieren, wie du das sonst unter Windows machst. Hab aber selber mit Out32 nicht ausprobiert..  :-(


----------



## Stgt (30. Dezember 2004)

hi
mmh okay, von Assembler usw versteh ich eh nichts...
aber mal schaun..
danke


----------



## PixelShader (30. Dezember 2004)

Hi,
inpout.dll hat auch nichts mit Assembler zu tuhn... ist fur C++ und Basic gedacht.

Falls du nur deinen Logfehler ausgeben willst, und der Drucker 2 Blätter Papier ausgibt, anstatt einen, versuchs mal mit insgesamt nur 1nem fprintf()

```
fprintf(Drucker," L O G F E H L E R %d \n\n", Logfehler);
```


----------



## Stgt (30. Dezember 2004)

aso, okay

das ist so ein NAdeldrucker mit endlospapier und mein problem oder bedenken wäre dass er das ganze Blatt durchzieht, aber er soll immer was drucken wenn es eine fehlermeldung gibt.
Also brauch ich doch noch eine endloschleife....
Ach ich muss %c anstatt %d nehmen oder? und dann anstatt int Logfehler;  char Logfehler
oder?
danke


----------



## PixelShader (30. Dezember 2004)

Hi,
wenn du char Logfehler machst, dann begrenzt du den Wert von Logfehler auf 0-255. Also falls du Werte uber 255 hast, und uberhaupt, ist es sicherer int zu nehmen. Wenn du statt %d, %c nimmst, dann zeigst du nicht die Zahl an, sondern ein Zeichen mit dem entsprechenden ASCII code. D.h. falls Logfehler 0x41 ist, kommt beim Drucker "L O G F E H L E R A" raus, denn 0x41 ist ein ASCII Wert fur "A".

Falls du jedoch als Logfehler einen String nehmen willst, dann sieht das ganze so aus:

```
char *Logfehler;
Logfehler = "Irgendein fehler, hehe"; // FehlerString zuweisung
fprintf(Drucker," L O G F E H L E R %s \n\n", Logfehler);
```
Glaube jedoch nicht dass das erwünscht war, oder?

um jetzt per Out32 den text auszugeben, muss man selber eine Ausgabeschleife mit sprintf machen:

```
char *Logfehler;
char DerGanzeFahler[1000];  // einen String erstellen
Logfehler = "Irgendein fehler, hehe"; // FehlerString zuweisung

sprintf(DarGanzeFehler," L O G F E H L E R %s \n\n", Logfehler); // den string fullen

// Zusammengesetzten Text an Drucker ausgeben
for(int i=0;DerGanzeFehler[i] != 0;i++)
{
  Out32( 0x378, DerGanzeFehler[i];
}
```


----------



## Stgt (30. Dezember 2004)

hi

yup mit int ist dann besser bzw richitig. okay danke für die Erläuterung

Bei siehts nun so aus:
Allerdings glaub ich dass ich die endlos schleife falsch ist.
Also es kommt jetzt eine Fehlermedlung andie Variable (Logfehler)
und dann soll sofort gedruckt werden. Okay das wird gemacht, das passt.
Wenn nun das alles war soll der Drucker die Seite nicht durchziehen (macht er glaub auch nicht, Kanns ja leider nicht testen). Sondern der Drucker steht still. Wenn nun wieder eine Medlung an die Variable (Logfehler) kommt soll einen Absatz drunter wieder gedruckt werden.

Aber das passt so nicht wie ich das gemacht hab oder? Weil der Inhalt der Variable (Logfehler) wird
 ja nicht gelöscht


```
#include <stdio.h>  // Präprozessor-Direktiven
#include <stdlib.h>
int main()
{
   FILE *Drucker;
   int Logfehler;
   
// Ausgabe des Ergebnisses
   Drucker = fopen("PRN","w");
   fprintf(Drucker," L O G F E H L E R \n\n");
   for ( ; ; ) 
   {
  fprintf(Drucker,"%d",Logfehler);
   }
  fclose(Drucker); 
   return 0;
}
```


----------



## PixelShader (30. Dezember 2004)

Hi,


> Weil der Inhalt der Variable (Logfehler) wird ja nicht gelöscht


Logfehler soll ja nicht geloescht, sondern mit dem neuen Fehler beschrieben werden?


> aber er soll immer was drucken wenn es eine fehlermeldung gibt.



soll "for( ; ; )" eine Endlosschleife darstellen?
Setz dann da lieber "while(true)"
Dann wuerde der Code den ich sehe bei Logfehler=123 dies an den Drucker schicken:


> L O G F E H L E R
> 
> 123123123123123123123123123123123123123123



du brauchst eine Fehlermeldungquelle... und natuerlich damit er die Fehlercodes untereinander schreibt, ein \n.
So sähe die Schleife aus:

```
while(true)
{
  Logfehler = GetError();  // wobei du diese Funktion selber schreibst
  fprintf(Drucker,"%d\n",Logfehler);
}
```


----------



## Stgt (30. Dezember 2004)

Die Variable Logfehler soll mit einem neuen Fehler beschrieben werden,  Genau
JA meine Endlosschleife würde dann immer unednlich viele gleiche Fehler ausgeben
Das wäre ja müll ;-)
okay danke das sieht gut aus, wie du das gemacht hast
So solls sein. 
Wusse nur nicht wie ich eine endlosschleife mit while mache. Danke
Und hier Logfehler = GetError();   fang ich mögliche fehler ab, z.B kein drucker insatlliert usw gell?


----------



## PixelShader (30. Dezember 2004)

GetError solltest du eigentlich selber schreiben, eine Funktion die auf Fehler wartet, und den Fehlercode zuruckgibt.

```
int GetError()
{
   /* dein code hier*/
}
```
Das abfangen solcher fehler wie Drucker nicht installiert? Naja das wird schwerer. Vor allem der Fehler "Drucker nicht installiert" wird schon am Anfang auftauchen, als du den Drucker zu fopen() versuchst.


----------



## Stgt (30. Dezember 2004)

ist klar, yup danke, naja das stimmt, dass das schwer ist aber das brauch ja auch eigentlich nicht 

Du weißt auch nicht zufällig wie ich überprüfen kann ob es den als text eingegeben drucker auch gibt und wenn ja dann soll gedruckt werden ,andernsfalls fehlermedlung erzeugen

Naja, ich habs dass nur in MFC hinbekommen mit Enum Printer...., aber wie das in API geht. Keine Ahnung...
Wie ich  einlesen kann (scanf) ist klar, aber wie man dann das überprüft ob es den auch gibt...?


----------



## PixelShader (30. Dezember 2004)

> Vor allem der Fehler "Drucker nicht installiert" wird schon am Anfang auftauchen, als du den Drucker zu fopen() versuchst.


fopen() gibt NULL zuruck falls da ein Fehler aufgetaucht ist.


```
FILE *Drucker;
   Drucker = fopen("PRN","w");
   if(Drucker == NULL)
   {
      // Denk dir hier einen Fehler aus. Die 16 ist ein rotes Kreutz+OK Taste
      MessageBox(NULL, "Fehler beim zugreifen auf den Drucker", "LogFehler hat einen Fehler! ;) ", 16);
      return 1;
   }
```


----------



## Stgt (30. Dezember 2004)

ah sauber, okay vielen dank nochmal für deine super Unterstützung.
Ich hof ich bekomm das jetzt selber hin.... ist ja nicht mehr so viel


----------



## Stgt (5. Januar 2005)

Hallo,
nochmal eine Frage

Dann wuerde der Code den ich sehe bei Logfehler=123 dies an den Drucker schicken:

Zitat:
L O G F E H L E R

123123123123123123123123123123123123123123 
while(true)
 {
   fprintf(Drucker,"%d\n",Logmeldungen); 
 }

Wie bekomm ich das hin, dass er NICHT immer das selbe druckt? Sondern immer druckt wenn es was zu drucken gibt. 
Weil nach dem er das aufgerufen hat : fprintf(Drucker,"%d\n",Logmeldungen); 
Soll er nicht mehr drucken,  

Jemand eine Ahnung?PixelShader vielleicht ? 
danke


----------



## Stgt (5. Januar 2005)

würde das gehen?


```
//Endlosschleife, um die Logfehler zu bekommen
while(true)
{
 if(Logmeldungen !== NULL)
 {
  fprintf(Drucker,"%d\n",Logmeldungen);
  //Variableninhalt  löschen, aber wie,?
 }
 else
 {
  //nichts machen
 }
}
```


----------



## PixelShader (5. Januar 2005)

> //Variableninhalt  löschen, aber wie,?


Löschen muss man nicht, nochmal nach oben


> du brauchst eine Fehlermeldungquelle... und natuerlich damit er die Fehlercodes untereinander schreibt, ein \n.
> So sähe die Schleife aus:
> 
> 
> ...


ich meinte damit, dass DU die Funktion GetError() proggst, die auf einen Fehler wartet, und den Fehlercode dann zurückgibt, sodass der Fehlercode dann in "Logfehler" landet, gedruckt wird, und das Programm dann beim nächsten Aufruf von GetError() hängenbleibt bis wieder ein Fehler kommt.


----------



## Stgt (5. Januar 2005)

aha okay, sorry 


die auf einen Fehler wartet, und den Fehlercode dann zurückgibt, sodass der Fehlercode dann in "Logfehler" landet, gedruckt wird 

okay, das hab ich so gemacht:

```
int GetError()
{
 if(Logmeldungen !== NULL)
 {
  return Logmeldungen;
 }
  
}
```
 
Meinst du das so?


Was ich noch nicht weiß ist wie ich das machen muss:


> dass das Programm dann beim nächsten Aufruf von GetError() hängenbleibt bis wieder ein Fehler kommt


----------



## PixelShader (5. Januar 2005)

unter "die auf einen Fehler wartet" und "haengenbleibt, bis ein Fehler kommt" meinte ich dasselbe  :-( 

dein code fur GetError() wuerde ja auf nichts warten.
eher was mit

```
int GetError()
{
  Logmeldungen = NULL;
  while(Logmeldungen==NULL); // warten bis Logmeldungen verschieden von NULL wird
  return Logmeldungen;
}
```
doch wüsste ich nicht wann "Logmeldungen" seinen Wert ändern wird. Es sei denn du schreibst ein Multithreading-programm.
ansonsten soetwas:

```
int GetError()
{
  do
  {
    Logmeldungen = /* Deine Fehlerquelle */;
  }while(Logmeldungen==NULL); // NULL als "kein Fehler" Fehlercode
  return Logmeldungen;
}
```

PS: darf ich erfahren was denn die Fehlerquelle ist?


----------



## Stgt (5. Januar 2005)

darf ich erfahren was denn die Fehlerquelle 

-->klar meinst du aber mit Fehlerquelle? 
Logmeldungen = /* Deine Fehlerquelle */;    


irgenwie aber hab ich immer noch das Gefühl , wenn die Fehlermeldung" Danke" heißt, dass
dann DankeDankeDankeusw gedruckt wird oder versteht ich da was komplett falsch. Hab mir grad alle Beiträge nochmal durchgelesen ;-)


----------



## PixelShader (5. Januar 2005)

elso erstmal wo hast du Fehler gesehen die "Danke" sagen?  

ne ernsthaft, wir haben doch
int Logfehler;
deklariert, also kann Logfehler kein String sein.


> Logmeldungen = /* Deine Fehlerquelle */;


aber was ist die Fehlerquelle? Willst du gucken ob Datei richtig geschpeichert wurde, ob der Bilschirm richtige Aufloesung hat... letztendlich vielleicht ob der Benutzer am aufm Stuhl vor dem PC sitzt?

ich glaube ich weiss jetzt was du mit "variable löschen" meintest. Das liegt aber wieder an deiner Fehlerquelle. Falls das (Fehlerquelle) sowas wieder wie eine Variable ist, dann stimmt das mit dem löschen, hier:

```
int GetError()
{
  do
  {
    Logmeldungen = Fehlerquelle;  // eine simple Variable?
  }while(Logmeldungen==NULL); // NULL als "kein Fehler" Fehlercode
  Fehlerquelle = NULL;
  return Logmeldungen;
}
```
jedoch wüsste ich nicht wieso sich (und wer) die Fehlerquelle Variable wärend der while() Schleife ändern sollte?


----------



## Stgt (5. Januar 2005)

bei mir heißts jetzt:
int Logmeldungen; aber das ist wurst ;-)

und darin steht dann der Fehler ( keine Ahnung welche, wenns halt Problem gibt beim auswerten usw, ist ja egal )

Deswegen versteh ich nicht was Fehlerquelle sein soll, brauch ich doch nicht oder?

So müssts doch auch gehn:

```
while(true)
{
 
 if(Logmeldungen != NULL)
 {
  fprintf(Drucker,"%d\n",Logmeldungen);
  Logmeldungen = NULL; //Logmeldungen Inhalt löschen
  //wenn dann nach einer gewissen Zeit wieder was in der Variablen
  //Logmeldungen reinkommt, soll wieder gedruckt werden
 } 
}
```


----------



## PixelShader (5. Januar 2005)

korrekt, bis auf eine unklarheit (das was ich unter Fehlerquelle meinte   lol )


> //wenn dann nach einer gewissen Zeit wieder was in der Variablen Logmeldungen reinkommt


wie denn?


----------



## Stgt (5. Januar 2005)

wie denn?--> ja geht so leider nicht :-(


----------



## PixelShader (5. Januar 2005)

lol

Vorschläge:
Multithreading +  suchwort CreateThread
muss man sich zuerst reindenken bevor man anfängt so proggs zu schreiben

oder sobald du weisst welche Fehler dein Programm abfangen soll, gibts eventuell WinAPI Funktionen dazu.


----------



## Stgt (5. Januar 2005)

okay, also wie man thread erstellt
und kannst du mir auch kurz sagen, für was das gut sein soll  
danke


----------



## PixelShader (5. Januar 2005)

Multithreading = mehrere Threads "Codes" paralel laufen lassen.
Fur deinen zweck, dass ein Thread druckt, falls was in Logfehler reingeschrieben wird, und der andere schreibt den Fehler in Logfehler rein.

 mach dir das Leben nicht schwer mit Threads. (wierhole ich das jetzt zum 10 mal?  ) Wen du weisst wo du die Fehler herbekommst, kannst du das auch ohne Multithreading machen.


----------



## Stgt (5. Januar 2005)

> mach dir das Leben nicht schwer mit Threads. (wierhole ich das jetzt zum 10 mal?  )


bei mir zum ersten Mal




> Wen du weisst wo du die Fehler herbekommst, kannst du das auch ohne Multithreading machen


aha, und nehmen wir mal an ich weiß das jetzt? Wie komm ich dann weiter ;-) ?


----------



## PixelShader (5. Januar 2005)

PixelShader hat gesagt.:
			
		

> oder sobald du weisst welche Fehler dein Programm abfangen soll, gibts eventuell WinAPI Funktionen dazu.


die du dann benutzen kannst


```
while(true)
{
 /* WinAPI Funktionen */
 if(Logmeldungen != NULL)
 {
  fprintf(Drucker,"%d\n",Logmeldungen);
  Logmeldungen = NULL; //Logmeldungen Inhalt löschen
  //wenn dann nach einer gewissen Zeit wieder was in der Variablen
  //Logmeldungen reinkommt, soll wieder gedruckt werden
 }
}
```


----------



## Stgt (5. Januar 2005)

okay alles klar 

mal schaun....
danke dir für deine Mühe, und schönes WE
cu


----------

