Seite 1 von 1

Quellcode von PB IDE aus drucken

Verfasst: 05.03.2014 23:56
von hjbremer
Manchmal möchte ich einen Code oder Teile davon ausdrucken. Habe aber keine Lust mit Markieren, Kopieren und dann via Notepad zu drucken.

Unten stehenden Code als Werkzeug einbinden und man kann einen ganzen Code oder einen markierten Teil einfach ausdrucken. Purebasic machts möglich.

Man kann natürlich auch ein anderes Textprogramm als Notepad zum Drucken angeben. z.B. Write.exe
Schriftart und Seitenränder sind in Notepad vorher anzugeben. Einfach aufrufen, ändern, Beenden.

Code: Alles auswählen

CompilerIf #PB_Compiler_Debugger
   
   ;zum Testen
   para_dateiname$ = "c:\bremer\kto\kto.pb" 
   para_selection$ = "10x2x19x5"
   
CompilerElse
   
   para_dateiname$ = ProgramParameter()
   para_selection$ = ProgramParameter()
   
   ;wurde Datei noch nicht gepeichert, ist %FILE leer und die Parameter 
   ;verschieben sich, so das para_selection$ ein Leerstring ist.
   If para_selection$ = ""
      MessageRequester("", "Datei noch nicht gespeichert")
      End
   EndIf
   
CompilerEndIf

path$ = GetEnvironmentVariable("TEMP")
print_dateiname$ = path$ + "\mySelection.txt"

row1$ = StringField(para_selection$, 1, "x")
col1$ = StringField(para_selection$, 2, "x")
row2$ = StringField(para_selection$, 3, "x")
col2$ = StringField(para_selection$, 4, "x")

If Bool(row1$ = row2$ And col1$ = col2$)
   selected = #False
Else
   selected = #True
EndIf   

If selected = #True
   
   vonzeile = Val(row1$)
   biszeile = Val(row2$)
   
   dnr = ReadFile(#PB_Any, para_dateiname$)
   znr = CreateFile(#PB_Any, print_dateiname$)
   If dnr
      If znr
         
         WriteStringN(znr, "")
         WriteStringN(znr, #PB_Compiler_Filename + " von Zeile: " + row1$ + " bis " + row2$)
         WriteStringN(znr, "")
         
         While Eof(dnr) = 0
            x$ = ReadString(dnr)
            ze + 1
            If Bool(ze >= vonzeile And ze <= biszeile)
               WriteStringN(znr, RSet(Str(ze), 5) + " " + x$)
            EndIf            
         Wend
         
         CloseFile(znr)
      EndIf
      CloseFile(dnr)
   EndIf
   
Else
   
   print_dateiname$ = para_dateiname$
   
EndIf

ShellExecute_(#Null, "open", "notepad", "/P " + print_dateiname$, #Null, #SW_HIDE)
;oder
;RunProgram("Notepad", "/P " + print_dateiname$, "")


Programm als EXE compilieren. Ich habe es im Purebasic Verzeichnis stehen mit Namen pbprint.exe

Einbinden:
Folgendes Beispiel mit PB 5.21, ältere Versionen können abweichen

Werkzeuge/Werkzeuge konfigurieren aufrufen
Neu wählen

In Kommandozeile
Programmname (incl.kompletter Pfad) eingeben oder Button durchsuchen drücken
z.B. C:\Bremer\PureBasic521\pbprint.exe

In Argumente
%FILE %SELECTION

Arbeitsverzeichnis
nix eingeben

Name
z.B. PbPrint

Ereignis
Menu oder Tastenkürzel

Tastenkürzel
drücken sie z.B. STRG + P

ok drücken, ok drücken und FERTIG !

Will man für das Werkzeug ein Symbol in der oberen Symbolleiste haben

Datei/Einstellungen
Symbolleiste
Einstellungen für den Eintrag: Combobox steht bei Trennzeichen, Button hinzufügen drücken
ein Trennzeichen wird ans Ende der Liste gesetzt
Dann Combobox drücken und Symbol-Datei wählen
Rechts daneben Durchsuchen Button drücken (...) und eine passende ico oder png Datei wählen
linke Combobox darunter Werkzeug starten wählen
rechte Combobox PbPrint wählen (wie auch immer ihr es genannt habt)
Hinzufügen drücken und übernehmen, das wars

Re: Quellcode von PB IDE aus drucken

Verfasst: 05.03.2014 23:58
von RSBasic
Gute Idee. :allright:

Re: Quellcode von PB IDE aus drucken

Verfasst: 17.04.2016 15:52
von GPI
Ich würde ein paar kleinigkeiten ändern:

Code: Alles auswählen

path$ = GetTemporaryDirectory()
print_dateiname$ = path$ + "mySelection.txt"
Besser als eine Enviroment-Variable Abzufragen, die es nur in Windows gibt.

Code: Alles auswählen

RunProgram("Notepad", "/P " +Chr(34)+ print_dateiname$+Chr(34), "",#PB_Program_Wait)
DeleteFile(print_dateiname$)
Damit wird die Datei auch wieder gelöscht. Zudem fängt es den Fall ab, das ein Leerzeichen in Temp-Pfad ist.

und wichtig als Parameter

Code: Alles auswählen

"%FILE" "%SELECTION"
Falls ein Leerzeichen in Pfad ist, sonst gibts Probleme

wenn jetzt noch wer die Druckbefehle für MAC und LINUX umsetzt, kann es jeder nutzen :)

ahcja, taucht unter IDE_Tools\PrintSelection.pb in CodeArchiv auf :)

Re: Quellcode von PB IDE aus drucken

Verfasst: 28.04.2016 16:57
von SDL
Mit dem Löschen ist es so eine Sache :mrgreen:
Ich schlage hier mal auf die schnelle folgende Änderung vor:

Code: Alles auswählen

;ShellExecute_(#Null, "open", "notepad", "/P " + print_dateiname$, #Null, #SW_HIDE)
;oder
; RunProgram("Notepad", "/P " +Chr(34)+ print_dateiname$+Chr(34), "",#PB_Program_Wait|#PB_Program_Hide)

RunProgram("C:\Program Files (x86)\UltraEdit\Uedit32.exe", "/P " +Chr(34)+ print_dateiname$+Chr(34), "",#PB_Program_Wait|#PB_Program_Hide)

DeleteFile(GetTemporaryDirectory()+print_dateiname$)

; IDE Options = PureBasic 5.42 LTS (Windows - x64)
bei mir war einfach mal der Quelltext das Opfer.
An sonsten :allright:

Re: Quellcode von PB IDE aus drucken

Verfasst: 01.05.2016 21:33
von GPI
äh, warum nochmals das Temp-Verzeichnis angeben?
path$ = GetTemporaryDirectory()
print_dateiname$ = path$ + "mySelection.txt"

verwendet doch schon den Temp-Pfad, oder übersehe ich was. Ultraedit könnte ansonsten auch die Datei nicht öffnen...

Re: Quellcode von PB IDE aus drucken

Verfasst: 02.05.2016 20:46
von SDL
GPI hat geschrieben:äh, warum nochmals das Temp-Verzeichnis angeben?
path$ = GetTemporaryDirectory()
print_dateiname$ = path$ + "mySelection.txt"

verwendet doch schon den Temp-Pfad, oder übersehe ich was. Ultraedit könnte ansonsten auch die Datei nicht öffnen...
So hab ich das auch gesehen, aber beim Praxisversuch wurde bei mir der Quelltext im Projektordner gelöscht. Und bei Ausschnittdruck blieb die Tempdatei in Temp liegen. Die "Änderung" war ein "Schnellschuß" um das Problem zu lösen. :oops:

Muss mir mal mehr Zeit nehmen. (von hier: IDE_Tools\PrintSelection.pb in CodeArchiv)

Re: Quellcode von PB IDE aus drucken

Verfasst: 02.05.2016 21:20
von SDL
Noch einmal:

Code: Alles auswählen

..........
 para_dateiname$ = ProgramParameter() ;OK
 para_selection$ = ProgramParameter()
.........
path$ = GetTemporaryDirectory()
print_dateiname$ = path$ + "mySelection.txt" ;OK
...............
Else

  print_dateiname$ = para_dateiname$ ; nicht mehr OK
  
EndIf
.............
DeleteFile(print_dateiname$) ; ??
Sieh noch einmal drüber, nicht das ich falsch liege.

Re: Quellcode von PB IDE aus drucken

Verfasst: 07.05.2016 16:47
von GPI
hast recht. Wenn man nichts auswählt, wird gelöscht.

Code: Alles auswählen

;    Description: Print selected sourcecode
;Parameter (IDE): "%FILE" "%SELECTION"
;         Author: hjbremer
;           Date: 2014-03-05
;     PB-Version: 5.42
;             OS: Windows
;  English-Forum: 
;   French-Forum: 
;   German-Forum: http://www.purebasic.fr/german/viewtopic.php?f=8&t=27810
; -----------------------------------------------------------------------------

CompilerIf #PB_Compiler_OS<>#PB_OS_Windows
  CompilerError "Windows only!"
CompilerEndIf

CompilerIf #PB_Compiler_Debugger
  
  ;zum Testen
  para_dateiname$ = "c:\bremer\kto\kto.pb"
  para_selection$ = "10x2x19x5"
  
CompilerElse
  
  para_dateiname$ = ProgramParameter()
  para_selection$ = ProgramParameter()
  
  ;wurde Datei noch nicht gepeichert, ist %FILE leer und die Parameter
  ;verschieben sich, so das para_selection$ ein Leerstring ist.
  If para_selection$ = ""
    MessageRequester("", "File must be saved!")
    End
  EndIf
  
CompilerEndIf

path$ = GetTemporaryDirectory()
temp_dateiname$ = path$ + "mySelection.txt"
print_dateiname$ = path$ + "mySelection.txt"

row1$ = StringField(para_selection$, 1, "x")
col1$ = StringField(para_selection$, 2, "x")
row2$ = StringField(para_selection$, 3, "x")
col2$ = StringField(para_selection$, 4, "x")

If Bool(row1$ = row2$ And col1$ = col2$)
  selected = #False
Else
  selected = #True
EndIf   

If selected = #True
  
  vonzeile = Val(row1$)
  biszeile = Val(row2$)
  
  dnr = ReadFile(#PB_Any, para_dateiname$)
  znr = CreateFile(#PB_Any, print_dateiname$)
  If dnr
    If znr
      
      WriteStringN(znr, "")
      WriteStringN(znr, #PB_Compiler_Filename + " from line " + row1$ + " to " + row2$)
      WriteStringN(znr, "")
      
      While Eof(dnr) = 0
        x$ = ReadString(dnr)
        ze + 1
        If Bool(ze >= vonzeile And ze <= biszeile)
          WriteStringN(znr, RSet(Str(ze), 5) + " " + x$)
        EndIf           
      Wend
      
      CloseFile(znr)
    EndIf
    CloseFile(dnr)
  EndIf
  
Else
  
  print_dateiname$ = para_dateiname$
  
EndIf

;ShellExecute_(#Null, "open", "notepad", "/P " + print_dateiname$, #Null, #SW_HIDE)
;oder
RunProgram("Notepad", "/P " +Chr(34)+ print_dateiname$+Chr(34), "",#PB_Program_Wait|#PB_Program_Hide)
DeleteFile(temp_dateiname$)
ich hab jetzt eine temp_dateiname$ hinzugefügt, um das Problem zu umgehen.

Re: Quellcode von PB IDE aus drucken

Verfasst: 07.05.2016 23:23
von SDL
:bounce: Danke.
Ich hatte den gleichen Gedanken -

Code: Alles auswählen

backup_dateiname$ = print_dateiname$
.... , nur warst Du schneller.

Re: Quellcode von PB IDE aus drucken

Verfasst: 12.05.2016 03:03
von SDL
Hier mal meine Idee : hjbremer "Danke für die Grundlagen"

Code: Alles auswählen

;
; Description: Print selected sourcecode
;    Parameter (IDE): "%FILE" "%SELECTION"
;         Author: hjbremer  "Danke für die Grundlagen"
;           Date: 2014-03-05
;     PB-Version: 5.42
;             OS: Windows
;  English-Forum: 
;   French-Forum: 
;   German-Forum: http://www.purebasic.fr/german/viewtopic.php?f=8&t=27810
; -----------------------------------------------------------------------------

EnableExplicit

; #True = 1 / #False = 0

Global.s para_dateiname$, para_selection$,row1$,row2$,x$,col1$,col2$,path$, print_dateiname$
Global vonzeile ; Markierter Quelltext von .....
Global biszeile ; bis
Global ze.u     ; Zeilennummer 
Global znr      ; Zieldatei
Global dnr      ; Quelldatei
Global Leerzeichen ; Anzahl der Einrückung
Global ZeilenEOF   ; Zeilenumbruch für zu langen String
Global selected    ; Auswahlhilfe True/False
Global selected_z  ; Zähler


#AnzahlD = 99     ; Anzahl der möglichen Druckzeichen ohne Zeilennummer
                  ; Ultraedit: linker Rand 25/ rechter Rand 10 DinA4
                  ; Lucida Console 8

#Leerzeichen = " " ; Zeilenumbruchbedingungen:
#Komma = ","
#Semi = ";"
#_Or = "|"

Declare _Leerzeichen()          ; Sucht Leerzeichen am Anfang des Strings (Einrückung)
Declare _ZeilenEOF()            ; Sucht Trennmöglichkeit im zu langen String
Declare _Write_StringN ()       ; Zeilennummer + String bei kleiner Stringlänge
Declare _Write_StringN_l()      ; Zeilennummer + Teil-string 
Declare _Write_StringN_ol()     ; Einrückung + Teilstring
Declare _Write_StringN_oleof()  ; Einrückung + Reststring
Declare _String_Formatieren()   ; String zerlegen wenn nötig

;******************************************************************************

CompilerIf #PB_Compiler_OS<>#PB_OS_Windows
  CompilerError "Windows only!"
CompilerEndIf

CompilerIf #PB_Compiler_Debugger
  
  ;zum Testen
  para_dateiname$ = "c:\bremer\kto\kto.pb"
  para_selection$ = "10x2x19x5"
  
CompilerElse
  
  para_dateiname$ = ProgramParameter() ;Ermittelt den nächsten Parameter-String, der dem Executable beim Start übergeben wurde
  para_selection$ = ProgramParameter()
  
  ;wurde Datei noch nicht gepeichert, ist %FILE leer und die Parameter
  ;verschieben sich, so das para_selection$ ein Leerstring ist.
  If para_selection$ = ""
    MessageRequester("", "File bitte speichern!")
    End
  EndIf
  
CompilerEndIf

path$ = GetTemporaryDirectory() ; gibt den Namen des temporären Verzeichnisses ("Temp") zurück. 

row1$ = StringField(para_selection$, 1, "x") ; Gibt den Inhalt des Stringfelds an der Stelle 'Index' zurück. 
col1$ = StringField(para_selection$, 2, "x") ; Zerlegt den String in Abschnitte - Trenner "x"
row2$ = StringField(para_selection$, 3, "x")
col2$ = StringField(para_selection$, 4, "x")

If Bool(row1$ = row2$ And col1$ = col2$)   ; Gibt es ein markierten Quelltext
  selected = #False
Else
  selected = #True
EndIf   


If selected = #True ; markierter Quelltext Ja
  
  print_dateiname$ = path$ + GetFilePart(para_dateiname$)+"_mySelection"
  
  vonzeile = Val(row1$)
  biszeile = Val(row2$)
  ze=0
  
  dnr = ReadFile(#PB_Any, para_dateiname$)    ; Öffnet eine existierende Datei ausschließlich für Lese-Operationen.
  znr = CreateFile(#PB_Any, print_dateiname$) ; Schreibt in Temp Datei "mySelection.txt"
  
  If dnr
    If znr
      
      WriteStringN(znr, #Leerzeichen)
      WriteStringN(znr, #PB_Compiler_Filename + " from line " + row1$ + " to " + row2$)
      WriteStringN(znr, #Leerzeichen)
      
      While Eof(dnr) = 0
        x$ = ReadString(dnr)       ; Liest einen String aus Datei 
        ze + 1
 
        If Bool(ze >= vonzeile And ze <= biszeile)
          
          _String_Formatieren()
          
        EndIf           
      Wend
      
      CloseFile(znr)
    EndIf
    CloseFile(dnr)
  EndIf
  
Else    ; kein Text markiert **************************************************
  
  print_dateiname$ = path$ + GetFilePart(para_dateiname$) 
  
  ze=0
  dnr = ReadFile(#PB_Any, para_dateiname$)    ; Öffnet eine existierende Datei ausschließlich für Lese-Operationen.
  znr = CreateFile(#PB_Any, print_dateiname$) ; Schreibt in Temp Datei 
  
  If dnr
    If znr
      
      WriteStringN(znr, para_dateiname$) 
      WriteStringN(znr, #Leerzeichen)
      
      While Eof(dnr) = 0
        x$ = ReadString(dnr)       ; Liest einen String aus Datei 
        ze + 1
        
        _String_Formatieren()  
        
      Wend
      
      CloseFile(znr)
    EndIf
    CloseFile(dnr)
  EndIf
  
EndIf

;RunProgram("Notepad", "/P " +Chr(34)+ print_dateiname$+Chr(34), "",#PB_Program_Wait|#PB_Program_Hide)

RunProgram("C:\Program Files (x86)\UltraEdit\Uedit32.exe", "/P " +Chr(34)+ print_dateiname$+Chr(34), "",#PB_Program_Wait|#PB_Program_Hide)

DeleteFile(print_dateiname$)

End
;******************************************************************************

Procedure _Leerzeichen() ; Anzahl der Leerzeichen links bestimmen
  
  Repeat
    Leerzeichen +1  
  Until Mid(x$,Leerzeichen,1) <> #Leerzeichen
  
EndProcedure

Procedure _ZeilenEOF() ; Stringlänge bestimmen für zeile
  
  Repeat 
    ZeilenEOF-1
  Until Mid(x$,ZeilenEOF,1) = #Leerzeichen Or Mid(x$,ZeilenEOF,1) = #Komma Or Mid(x$,ZeilenEOF,1) = #Semi Or Mid(x$,ZeilenEOF,1) = #_Or
  
EndProcedure

Procedure _Write_StringN () ; Drucken Zeilennummer + String
  
  WriteStringN(znr, RSet(Str(ze), 5) + #Leerzeichen + x$)
  
EndProcedure

Procedure _Write_StringN_l() ; Drucken Zeilennummer + String bei Überlänge
  
  WriteStringN(znr, RSet(Str(ze), 5) + #Leerzeichen + Mid(x$,1,ZeilenEOF))
  
EndProcedure

Procedure _Write_StringN_ol()
  
  WriteStringN(znr, RSet(#Leerzeichen,5 + Leerzeichen) + LTrim(Mid(x$,1,ZeilenEOF)))
  
EndProcedure


Procedure _Write_StringN_oleof() ; Drucken ohne Zeilennummer mit leerzeichen
  
  WriteStringN(znr, RSet(#Leerzeichen,5 + Leerzeichen) + LTrim(x$)) 
  
EndProcedure

Procedure _String_Formatieren()
  If ze = 1
    x$ =  Right(x$,Len(x$)-1) 
  EndIf
  
  If Len(x$) < #AnzahlD
    
    _Write_StringN()          ;WriteStringN(znr, RSet(Str(ze), 5) + #Leerzeichen + x$)
    
  Else
    selected_z = #False
    Leerzeichen = #False
    _Leerzeichen()
    
    While Len(x$) >= #AnzahlD
      
      ZeilenEOF = #AnzahlD
      _ZeilenEOF()
      
      If selected_z = #False
        _Write_StringN_l() ;WriteStringN(znr, RSet(Str(ze), 5) + #Leerzeichen + Mid(x$,1,ZeilenEOF)) 
        selected_z = #True
      Else
        _Write_StringN_ol() ; WriteStringN(znr, RSet(#Leerzeichen,5 + Leerzeichen) + LTrim(Mid(x$,1,ZeilenEOF)))
      EndIf 
      
      x$ = Right(x$,Len(x$)-ZeilenEOF)
      
    Wend
    If Len(x$)> #False
      _Write_StringN_oleof() ;WriteStringN(znr, RSet(#Leerzeichen,5 + Leerzeichen) + LTrim(x$)) 
    EndIf
    
  EndIf
EndProcedure 




; IDE Options = PureBasic 5.42 LTS (Windows - x64)
; EnableUnicode
; EnableXP