# Form Oberfläche drucken



## hausmeister079 (15. August 2008)

Hallo zusammen,

1. Ich möchte gerne mein komplettes Programm bzw die Form Oberfläche auf ein A4 Blatt ausdrucken. Mit dem Befehl form1.printform klappt das auch, jedoch druckt er es in die ersten 3/4. der letzte 1/4 ist nichts... 
Ich würde gerne oben hin zum Blatt mehr Luft lassen.

2. Kann man das komplette formular speichern uns je nach bedarf wieder aufrufen und wenn es nötig ist auch Änderungen vornehmen?

und wiedermal vielen dank für die Hilfe.


----------



## Alex F. (16. August 2008)

Soweit ich weiss hat man bei PrintForm nicht so viele Möglichkeiten (also eigentlich keine) Du könntest höchstens versuchen die Seiteneinstellungen deines Druckers zu beeinflussen 

Grüsse bb


----------



## hausmeister079 (17. August 2008)

hallo brainbyte,

schade das man da nichts machen kann. Wie schaut es denn aus wenn man alle Eingaben und Ausgaben von der Application auf ein Word doc übernimmt. Kann man da dann auch Schiftarten etc ändern?
Hättest du vllt ein Bsp code zur Hand, sodass ich mir das mal ansehen könnte?


----------



## wincnc (17. August 2008)

Hallo

Das ist vielleicht etwas für Dich:

```
Private Declare Sub keybd_event Lib "user32" ( _
  ByVal bVk As Byte, _
  ByVal bScan As Byte, _
  ByVal dwFlags As Long, _
  ByVal dwExtraInfo As Long)
  
Private Enum Ausrichtung
 Hochformat = 1
 Querformat = 2
End Enum

Private Sub Command1_Click()
  FormToPrinter True, Querformat
End Sub

Private Sub FormToPrinter(Optional ByVal bActiveWindow As Boolean = True, Optional Orientation As Ausrichtung = Hochformat)

  Const KEYEVENTF_KEYUP = &H2
  Const VK_MENU = &H12
  Const VK_SNAPSHOT = &H2C

  If bActiveWindow Then keybd_event VK_MENU, 0, 0, 0
  keybd_event VK_SNAPSHOT, 0, 0, 0
  keybd_event VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0
  If bActiveWindow Then keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0
  DoEvents
  
  Printer.Orientation = Orientation
  
  ' Hier kannst Du die Seitenränder einstellen
  Printer.PaintPicture Clipboard.GetData, 0, 0, Printer.ScaleWidth, Printer.ScaleHeight
  
  Printer.EndDoc
End Sub
```


----------



## hausmeister079 (17. August 2008)

vielen Dank @Wincnc. Werde das mal in meiner applikation versuchen. Weisst du denn auch ob man diese applikation speichern kann und gegebenfals wieder aufrufen, um eine Änderung vorzunehmen?


----------



## wincnc (17. August 2008)

Die Daten Deiner Form könntest Du in einer INI - Datei oder einer Datenbank speichern.


----------



## hausmeister079 (18. August 2008)

ok, was wuerdest du vorschlagen? Es waere toll wenn man diese wieder aufrufen koennte und gegebenfals aendern. Kann man das in der Urspruenglichen Form dan auch wieder oeffnen, via einer INI-Datei?


----------



## hausmeister079 (18. August 2008)

@wincnc

das mitdem druck code ist genau nach was ich gesucht habe... vielen Dank dafuer, habe es soeben ausprobiert.


----------



## wincnc (18. August 2008)

Hier ein Beispiel für die Speicherung in der ini.

```
Private Declare Function WritePrivateProfileString Lib _
  "kernel32" Alias "WritePrivateProfileStringA" _
  (ByVal lpApplicationName As String, _
  ByVal lpKeyName As Any, ByVal lpString As Any, _
  ByVal lpFileName As String) As Long

Private Declare Function GetPrivateProfileString Lib _
  "kernel32" Alias "GetPrivateProfileStringA" _
  (ByVal lpApplicationName As String, _
  ByVal lpKeyName As Any, ByVal lpDefault As String, _
  ByVal lpReturnedString As String, ByVal nSize As Long, _
  ByVal lpFileName As String) As Long

Private Sub Form_Load()
'INI Datei beim Starten der Anwendung lesen.

Dim sValue As String * 255
Dim lResult As Long

  lResult = GetPrivateProfileString("TextBox", "1", "", sValue, Len(sValue), App.Path & "\Test.ini")
  Text1.Text = Left$(sValue, lResult)

  lResult = GetPrivateProfileString("TextBox", "2", "", sValue, Len(sValue), App.Path & "\Test.ini")
  Text2.Text = Left$(sValue, lResult)
End Sub

Private Sub Form_Unload(Cancel As Integer)
'INI Datei beim Beenden der Anwendung schreiben.

  WritePrivateProfileString "TextBox", "1", Text1.Text, App.Path & "\Test.ini"
  WritePrivateProfileString "TextBox", "2", Text2.Text, App.Path & "\Test.ini"
End Sub
```
Das funktioniert aber nur mit TextBoxen ohne Multiline, bzw. mit einfachen Strings bis zu einer Länge von 255 Zeichen.


----------



## hausmeister079 (19. August 2008)

das problemist, dass ich textboxen habe mit multilines... Geht es denn wenn man es in ein daten sheet speichert?

ich habe auch mal versucht die Form in ein Word document zu kopieren, habe praktisch deinen code fuers drucken uebernommen und ein wenig veraendert. Das Word document oeffnet sich, jedoch weiss ich nicht den code das der die form dort rein kopiert.

hier mal was ich versucht habe:

Private Sub command5_click()
FormTodocument True, querformat
Dim X As Object
    Set X = CreateObject("word.application")
  X.Visible = True
  X.documents.Add
End Sub

Kann ich dann auch direkt scalieren, sowie du es fuer den Druck befehl gemacht hast?

vielen dank fuer deine Hilfe...


----------



## Zvoni (19. August 2008)

wincnc hat gesagt.:


> Das funktioniert aber nur mit TextBoxen ohne Multiline, bzw. mit einfachen Strings bis zu einer Länge von 255 Zeichen.



Wieso soll es mit Multiline nicht gehen? In Multiline-Textboxen sind halt ein CR und LF mit im String drin, was am Ende auch nur Zeichen des ASCII-Zeichensatzes sind, und somit in einem String zulässig.

Um eine feste Stringlänge zu umgehen, könnte man eventuell zuerst einen Schlüssel mit der Länge des Strings anlegen.

Ungefähr so:
GetPrivatProfileString HoleDieStringLänge
Erstelle einen Stringpuffer mit der StringLänge
GetPrivateProfileString HoleDenString


IMHO sollte aber die INI-Variante vermieden werden. Ich würde das Zeug eher in die Registry schreiben, da die Registry bzw. die Registry-Funktionen im Gegensatz zu GetPrivateProfileString auch andere Datentypen ausser String unterstützt.


----------



## hausmeister079 (19. August 2008)

tja ich würde da ja gerne mitreden, doch habe ich leider nicht so den Plan davon.
Was ist denn der Grund das ini nicht so gut ist? 
Wie würde es denn gehen, wenn ich es in die Registry schreiben würde?


----------



## Zvoni (19. August 2008)

Schau dir mal die VB-Hilfe zum Thema "SaveSetting" und "GetSetting" an


----------



## ronaldh (20. August 2008)

Bei Registry-Einträgen ist jedoch zu beachten, dass diese Variante wirklich nur für lokale Anwendungen möglich ist. Soll eine Anwendung beispielsweise im Netzwerk von mehreren Rechnern genutzt werden, die auf die gleichen Einstellungen zurückgreifen sollen, ist die Registry naturgemäß unbrauchbar, da es sich hierbei um lokale Einstellungen handelt.


----------



## Zvoni (20. August 2008)

ronaldh hat gesagt.:


> Bei Registry-Einträgen ist jedoch zu beachten, dass diese Variante wirklich nur für lokale Anwendungen möglich ist. Soll eine Anwendung beispielsweise im Netzwerk von mehreren Rechnern genutzt werden, die auf die gleichen Einstellungen zurückgreifen sollen, ist die Registry naturgemäß unbrauchbar, da es sich hierbei um lokale Einstellungen handelt.



Richtig, wobei sich jedoch wiederum die Sinnfrage stellt!

Basis: Programm steht im Netzwerk für alle User zur Verfügung

User 1 startet das Programm und erbt die Einstellungen aus der INI

User 2 startet nach User 1 das Programm und erbt die Einstellungen aus der INI
User 2 beendet das Programm, und das Programm speichert die veränderten Einstellungen in der INI

User 1 beendet das Programm, und das Programm speichert die veränderten Einstellungen in der INI

User 2 startet erneut das Programm, erbt jedoch die Einstellungen aus der INI, wie sie User 1 gespeichert hat

Sinn, wo bist du?


----------



## ronaldh (20. August 2008)

Wie ich ja geschrieben hatte:



> Soll eine Anwendung beispielsweise im Netzwerk von mehreren Rechnern genutzt werden, die auf die gleichen Einstellungen zurückgreifen sollen, ist die Registry naturgemäß unbrauchbar, da es sich hierbei um lokale Einstellungen handelt.



Sollen es nicht die GLEICHEN Einstellungen, sondern lokal unterschiedliche Einstellungen sein, ist eine lokale Speicherung (ob nun in Registry oder Ini-Datei) sinnvoll, dass ist ja logisch, oder?

Im Übrigen sollte man sich schon gut überlegen, ob man die Registry für lokale temporäre Einstellungen nutzt. Falls das Programm deinstalliert wird, bleiben genau solche Einträge in der Regel zurück, weil der Installer davon nichts weiß und diese demzufolge nicht löschen kann. Die Ini-Datei kann man manuell dann wesentlich einfacher löschen, als möglicherweise hunderte von Registry-Einträgen.


----------



## beule1808 (5. November 2008)

hi, hab nun auchmal ne frage.

das mit dem drucken im querformat und so das klappt bei mir.

nun hab ich folgenes problem, meine form1 hat nen schwarzen hintergrund, der aber beim drucken weiß sein soll. 

wie kann ich´n das anstellen?

ich denke mal das wird für euch kein problem darstellen, da ihr denke ich profis seid.

mfg beule1808


----------

