Seite 1 von 1

N-Edit | ein kleiner Notepad-Klon | Bitte um Kritik!!!

Verfasst: 03.02.2006 15:03
von JohnMC

Hallo!
Ich bin ein ziemlicher Einsteiger in Purebasic und habe mal nen kleinen Texteditor programmiert. Es sollte ein Notepad Klon werden....

Ich bitte um Kritik, Lob oder Anregungen für neue Ideen zum Einbauen.

Danke!

Ach ja, hier ist der Code:

Code:

Code: Alles auswählen

Global sp,olds$,pr,loc,fsize,lo,le,datei,a,pro.f,opro.f,rf$,rfa,otext$,ex
Procedure error()
MessageRequester("N-Edit","Es ist ein Fehler aufgetreten. Das Programm wird beendet.")
End
EndProcedure
OnErrorGosub(@error())
var=0
If ReadFile(datei,"font")
fontname$=ReadString()
size=Val(ReadString())
fsize=size
sytle=Val(ReadString())
If LoadFont(font,fontname$,size,style)
var=1
EndIf
CloseFile(datei)
Else
CreateFile(datei,"file")
CloseFile(datei)
LoadFont(font,"Arial",10)
var=1
EndIf
Dim rf$(3)
Dim orf$(3)
If ReadFile(datei,"file")
a=0
Repeat
a=a+1
rf$(a)=ReadString()
Until Eof(datei)<>0 Or a=3
rfa=a
Else
CreateFile(datei,"file")
CloseFile(datei)
rfa=0
EndIf
Dim aus$(10000000)
;- Enumeration
Enumeration
#p1:#p2:#p3:#statuswindow:#forts:#druck:#druckt:#suchet:#toolbar:#newt:#opent:#savet
#help
#format
#info
#neu
#suchen
#wsuchen
#einf
#kop
#zaehl
#editor
#save
#window
#saveas
#open
#end
#Windowsuche
#String_0
#Text_0
#suchbutton
#abbrechen
EndEnumeration
;- PROCEDURES
Procedure addprinterline(line$)
Locate(200,200+loc)
DrawText(line$)
loc=loc+(fsize*10)
pline$=""
EndProcedure
Procedure drucken(save$)
loc=0
pritext$=GetGadgetText(#editor)
If save$=""
savep$="Unbennantes Dokument"
Else
savep$=save$
EndIf
pr=0
prints=0
If PrintRequester()
pr=1
If StartPrinting(GetFilePart(savep$)+" - N-Edit")
If StartDrawing(PrinterOutput())
prints=1
DrawingFont(UseFont(font))
For a=1 To Len(pritext$)
If Mid(pritext$,a,2)=(Chr(13)+Chr(10))
addprinterline(pline$)
pline$=""
a=a+1
Else
pline$=pline$+Mid(pritext$,a,1)
EndIf
Next
StopDrawing()
EndIf
StopPrinting() 
EndIf
EndIf
If prints=1
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.s open_searchwindow(oldsuche$)
ret=0
OpenWindow(#Windowsuche, 308, 123, 281, 100,  #PB_Window_SystemMenu | #PB_Window_TitleBar , "N-Edit - Suchen")
CreateGadgetList(WindowID())
StringGadget(#String_0, 10, 40, 260, 20, oldsuche$)
TextGadget(#Text_0, 10, 5, 260, 30, "Bitte geben Sie den Suchbegriff ein, nachdem Sie suchen möchten:")
ButtonGadget(#suchbutton, 160, 70, 105, 25, "Suchen")
ButtonGadget(#abbrechen, 15, 70, 110, 25, "Abbrechen")
Repeat
sevent=WaitWindowEvent()
If sevent=#pb_eventgadget
Select EventGadgetID()
Case #suchbutton
ret=1
Break
Case #abbrechen
ret=0
Break
EndSelect
EndIf
Until sevent=#pb_event_closewindow
retu$=GetGadgetText(#string_0)
CloseWindow(#windowsuche)
UseWindow(#window)
ActivateWindow()
If ret=1
ProcedureReturn retu$
Else
ProcedureReturn "0"
EndIf
EndProcedure
Procedure pos(spos,stext2$)
sabs=0
For a=1 To spos
If Mid(stext2$,a,1)=Chr(10)
sabs=sabs+1
EndIf
Next
ProcedureReturn sabs
EndProcedure
Procedure suche(stext$,suchs$,neues)
If neues=0
spos=0
EndIf
If suchs$<>olds$
spos=0
EndIf
For a=sp To Len(stext$)
spos=FindString(stext$,suchs$,a)
If spos<>0
suchpos=pos(spos,stext$)+1
MessageRequester("N-Edit - Suche","Das gesuchte Wort befindet sich in Zeile "+Str(suchpos)+"!",#pb_messagerequester_OK)
olds$=suchs$
sp=spos+1
Break
EndIf
Next
If spos=0
MessageRequester("N-Edit","Das gesuchte Wort wurde leider nicht gefunden",#pb_messagerequester_OK)
EndIf
ActivateWindow()
spos=0
EndProcedure

Procedure zaehlen()
ztext$=""
absaetze=0
buchst=0
leerz=0
ztext$=GetGadgetText(#editor)
For a=1 To Len(ztext$)
If Mid(ztext$,a,1)=Chr(10)
absaetze=absaetze+1
EndIf
If Mid(ztext$,a,1)=" "
leerz=leerz+1
EndIf
buchst=buchst+1
Next
erg$="In dieser Datei stehen..."+Chr(10)+Str(buchst)+" Zeichen, davon.."+Chr(10)+Str(leerz)+" Leerzeichen und"+Chr(10)+Str(absaetze)+" Zeilenumbrüche"
MessageRequester("N-Edit",erg$,#pb_messagerequester_OK)
EndProcedure

Procedure dateil(save3$)
ReadFile(datei2,save3$)
le=0
Repeat
le=le+1
ReadString()
Until Eof(datei2)
CloseFile(datei2)
ProcedureReturn le

EndProcedure

Procedure.s auslesen(save$)
dlen=dateil(save$)

ReadFile(datei,save$)
ClearGadgetItemList(#editor)
atext$=""
otext$=""
ntext$=""
a=0
OpenWindow(#statuswindow, 0,0, 209, 37, #pb_window_screencentered , "N-Edit - Dateistatus")
CreateGadgetList(WindowID())
ProgressBarGadget(#forts, 5, 5, 200, 30, 0, dlen, #PB_ProgressBar_Smooth)
Repeat
a=a+1
pro.f=(a/dlen)*100
UseWindow(#window)
If a=1
atext$=ReadString()
Else
atext$=atext$+Chr(13)+Chr(10)+ReadString()
EndIf
UseWindow(#statuswindow)
SetGadgetState(#forts,a)
If pro.f<>opro.f
SetWindowTitle(#statuswindow,"N-Edit - Dateistatus "+Str(pro.f)+" %")
opro.f=pro.f
EndIf
Until Eof(datei)<>0
CloseWindow(#statuswindow)
UseWindow(#window)
ActivateWindow()
CloseFile(datei)
SetGadgetText(#editor,atext$)
For a=1 To 3
orf$(a)=""
Next
ReadFile(zb,"file")
a=0
Repeat
a=a+1
Orf$(a)=ReadString()
Until Eof(zb)<>0 Or a=2
rfs=a
CloseFile(zb)
If CreateFile(zb,"file")
WriteStringN(save$)
For a=1 To rfs
WriteStringN(orf$(a))
Next
CloseFile(zb)
EndIf
If ReadFile(datei,"file")
a=0
Repeat
a=a+1
rf$(a)=ReadString()
Until Eof(datei)<>0 Or a=3
Else
CreateFile(datei,"file")
CloseFile(datei)
rfa=0
EndIf
For a=1 To rfa
FreeMenu(a)
Next
rfa=a
rfs=0

ProcedureReturn atext$

EndProcedure

Procedure recentfile(rcfnr)
ex=0
ntext$=GetGadgetText(#editor)
If ntext$<>otext$
yn=MessageRequester("N-Edit","Die Datei wurde geändert. Vor dem Beenden abspeichern?",#pb_messagerequester_yesno)
If yn=6
If save$ =""
save$=OpenFileRequester("Text speichern","C:\","Alle Dateien (*.*) | *.*",0)
EndIf
CreateFile(datei,save$)
WriteStringN(text$)
CloseFile(datei)
EndIf
EndIf

save$=rf$(rcfnr)
If ReadFile(datei,save$)
ex=1
CloseFile(datei)
EndIf
If ex=1
otext$=auslesen(save$)
otext$=GetGadgetText(#editor)
SetGadgetText(#editor,otext$)
SetWindowTitle(#window,"N-Edit - "+GetFilePart(save$))
Else
MessageRequester("N-Edit","Datei konnte nicht göffnet werden!")
EndIf
EndProcedure
;- OPENWINDOW
OpenWindow(#window,0,0,700,500, #pb_window_minimizegadget | #pb_window_maximizegadget |#pb_window_systemmenu|#pb_window_screencentered | #pb_window_sizegadget,"N-Edit - Unbenanntes Dokument")
CreateToolBar(#toolbar,WindowID())
ToolBarStandardButton(#newt,#pb_toolbaricon_new)
ToolBarStandardButton(#opent,#pb_toolbaricon_open)
ToolBarStandardButton(#savet,#pb_toolbaricon_save)
ToolBarStandardButton(#suchet,#pb_toolbaricon_find)
ToolBarStandardButton(#druckt,#pb_toolbaricon_print)
CreateGadgetList(WindowID())
CreateStatusBar(sbar,WindowID())
AddStatusBarField((WindowWidth()-100))
AddStatusBarField(100)
EditorGadget(#editor,0,27,WindowWidth(),WindowHeight()-65)
CreateMenu(menu,WindowID())
MenuTitle("&Datei")
MenuItem(#neu,"&Neu....                                Strg+N")
MenuItem(#open,"&Öffnen...                             Strg+O")
MenuItem(#save,"&Speichern...                        Strg+S")
MenuItem(#saveas,"S&peichern unter...               Strg+Shift+S")
OpenSubMenu("Zuletzt benutzte Dateien...")
For a= 1 To rfa
If a=1
MenuItem(#p1,GetFilePart(rf$(a)))
ElseIf a=2
MenuItem(#p2,GetFilePart(rf$(a)))
ElseIf a=3
MenuItem(#p3,GetFilePart(rf$(a)))
EndIf
Next
CloseSubMenu()
MenuItem(#druck,"Drucken...                          Strg+P")
MenuBar()
MenuItem(#end,"&Beenden                             Strg+Q")
MenuTitle("&Bearbeiten")
MenuItem(#suchen,"S&uchen...                                 Strg+F")
MenuItem(#wsuchen,"&Weitersuchen                          F3")
MenuItem(#format,"&Textformat...                            Strg+T")
MenuItem(#zaehl,"&Zeichen Zählen                       Strg+Shift+Z")
MenuTitle("&Hilfe")
MenuItem(#help,"Hilfe...                  F1")
MenuItem(#info,"Über...                 F2")
;- Shortcuts
AddKeyboardShortcut(#window,#pb_shortcut_F2,#info)
AddKeyboardShortcut(#window,#pb_shortcut_control | #pb_shortcut_T,#format)
AddKeyboardShortcut(#window,#pb_shortcut_F1,#help)
AddKeyboardShortcut(#window,#pb_shortcut_control | #pb_shortcut_n,#neu)
AddKeyboardShortcut(#window,#pb_shortcut_control | #pb_shortcut_p,#druck)
AddKeyboardShortcut(#window,#pb_shortcut_control | #pb_shortcut_f,#suchen)
AddKeyboardShortcut(#window,#pb_shortcut_control | #pb_shortcut_F3,#wsuchen)
AddKeyboardShortcut(#window,#pb_shortcut_control | #pb_shortcut_o,#open)
AddKeyboardShortcut(#window,#pb_shortcut_control | #pb_shortcut_q,#end)
AddKeyboardShortcut(#window,#pb_shortcut_control | #pb_shortcut_shift | #pb_shortcut_s,#saveas)
AddKeyboardShortcut(#window,#pb_shortcut_control | #pb_shortcut_s,#save)
AddKeyboardShortcut(#window,#pb_shortcut_control | #pb_shortcut_shift |#pb_shortcut_z,#zaehl)
wh=WindowHeight()
ww=WindowWidth()
If var=1
SetGadgetFont(#editor,UseFont(font))
EndIf
cmd$=ProgramParameter()
If cmd$
save$=cmd$
otext$=auslesen(save$)
otext$=GetGadgetText(#editor)
SetGadgetText(#editor,otext$)
SetWindowTitle(#window,"N-Edit - "+GetFilePart(save$))
EndIf
;- MAIN
Repeat
event=WaitWindowEvent()
If WindowHeight()<>wh Or WindowWidth()<>ww
ResizeGadget(#editor,0,27,WindowWidth(),WindowHeight()-65)
ww=WindowWidth()
wh=WindowHeight()
EndIf
If event=#pb_eventmenu
Select EventMenuID()
Case #p1
If rf$(1)
recentfile(1)
EndIf
Case #p2
If rf$(2)
recentfile(2)
EndIf
Case #p3
If rf$(3)
recentfile(3)
EndIf
Case #druck
If drucken(save$)=1
ElseIf pr=1
MessageRequester("N-Edit","Beim Drucken ist ein Fehler aufgetreten!")
EndIf
Case #druckt
If drucken(save$)=1
ElseIf pr=1
MessageRequester("N-Edit","Beim Drucken ist ein Fehler aufgetreten!")
EndIf
Case #format
If FontRequester("Arial",12,0)
LoadFont(font,SelectedFontName(),SelectedFontSize(),SelectedFontStyle())
fsize=SelectedFontSize()
If CreateFile(datei,"font")
WriteStringN((SelectedFontName()))
WriteStringN((Str(SelectedFontSize())))
WriteStringN((Str(SelectedFontStyle())))
CloseFile(datei)
EndIf
SetGadgetFont(#editor,UseFont(font))
EndIf
Case #info
MessageRequester("Über N-Edit 0.1","M E d i t o r  V e r s i o n  0 . 1"+Chr(10)+"(c) by Jonas Haag"+Chr(10)+Chr(10)+"Written in Purebasic by Jonas Haag"+Chr(10)+"This Program is Freeware!"+Chr(10)+Chr(10)+Chr(10)+"Get Information:"+Chr(10)+"http://www.jonashaag.ch.vu"+Chr(10)+"Copyright (c) by Jonas Haag 2005. All rights reserved.",#pb_messagerequester_OK)
Case #neu
ntext$=GetGadgetText(#editor)
If ntext$<>otext$
yn=MessageRequester("N-Edit","Die Datei wurde geändert. Vor dem Beenden abspeichern?",#pb_messagerequester_yesno)
If yn=6
If save$ =""
save$=OpenFileRequester("Text speichern","C:\","Alle Dateien (*.*) | *.*",0)
EndIf
CreateFile(datei,save$)
WriteStringN(text$)
CloseFile(datei)
EndIf
EndIf
ClearGadgetItemList(#editor)
save$=""
otext$=""
ntext$=""
SetWindowTitle(#window,"N-Edit - Unbenanntes Dokument")
Case #open
If save$<>""
sort$=GetPathPart(save$)
Else
sort$=""
EndIf
save1$=""
save1$=OpenFileRequester("Datei öffnen",sort$,"Alle Dateien (*.*) | *.*",0)
If save1$
save$=save1$


otext$=auslesen(save$)
otext$=GetGadgetText(#editor)
SetGadgetText(#editor,otext$)
SetWindowTitle(#window,"N-Edit - "+GetFilePart(save$))
EndIf
Case #newt
ntext$=GetGadgetText(#editor)
If ntext$<>otext$
yn=MessageRequester("N-Edit","Die Datei wurde geändert. Vor dem Beenden abspeichern?",#pb_messagerequester_yesno)
If yn=6
If save$ =""
save$=OpenFileRequester("Text speichern","C:\","Alle Dateien (*.*) | *.*",0)
EndIf
CreateFile(datei,save$)
WriteStringN(text$)
CloseFile(datei)
EndIf
EndIf
ClearGadgetItemList(#editor)
save$=""
otext$=""
ntext$=""
SetWindowTitle(#window,"N-Edit - Unbenanntes Dokument")
Case #help
RunProgram("Readme.txt")
Case #opent
If save$<>""
sort$=GetPathPart(save$)
Else
sort$=""
EndIf
save1$=""
save1$=OpenFileRequester("Datei öffnen",sort$,"Alle Dateien (*.*) | *.*",0)
If save1$
save$=save1$
otext$=auslesen(save$)
otext$=GetGadgetText(#editor)
SetGadgetText(#editor,otext$)
SetWindowTitle(#window,"N-Edit - "+GetFilePart(save$))
EndIf
Case #wsuchen
If olds$<>""
stext$=GetGadgetText(#editor)
olds2$=olds$
suche(stext$,olds2$,0)
Else
stext$=GetGadgetText(#editor)
suchs$=open_searchwindow(olds$)
If suchs$<>"0"
suche(stext$,suchs$,1)
EndIf
EndIf
Case #suchen
stext$=GetGadgetText(#editor)
suchs$=open_searchwindow(olds$)
If suchs$<>"0"
suche(stext$,suchs$,1)
EndIf
Case #suchet
If olds$<>""
stext$=GetGadgetText(#editor)
olds2$=olds$
suche(stext$,olds2$,0)
Else
stext$=GetGadgetText(#editor)
suchs$=open_searchwindow(olds$)
If suchs$<>"0"
suche(stext$,suchs$,1)
EndIf
EndIf
Case #zaehl
zaehlen()
Case #end
Gosub ende
Case #save
If save$
sort$=GetPathPart(save$)
Else
sort$=""
EndIf
text$=GetGadgetText(#editor)
If save$ =""
save1$=SaveFileRequester("Datei speichern...",sort$,"Alle Dateien (*.*) | *.*",0)
If save1$<>""
save$=save1$
EndIf
EndIf
If CreateFile(datei,save$)
WriteString(text$)
CloseFile(datei)
otext$=GetGadgetText(#editor)
EndIf

otext$=GetGadgetText(#editor)
Case #savet
If save$<>""
sort$=GetPathPart(save$)
Else
sort$=""
EndIf
text$=GetGadgetText(#editor)
If save$ =""
save1$=SaveFileRequester("Datei speichern...",sort$,"Alle Dateien (*.*) | *.*",0)
If save1$<>""
save$=save1$
EndIf
EndIf
If CreateFile(datei,save$)
WriteString(text$)
CloseFile(datei)
otext$=GetGadgetText(#editor)
EndIf

otext$=GetGadgetText(#editor)
Case #saveas
save1$=SaveFileRequester("Datei speichern unter...","C:\","Alle Dateien (*.*) | *.*",0)
If save1$
save$=save1$
If DeleteFile(save$)
CreateFile(datei,save$)
WriteString(text$)
CloseFile(datei)
otext$=GetGadgetText(#editor)
EndIf
EndIf
EndSelect
EndIf
Until event=#pb_event_closewindow
Gosub ende
ende:
yn=0
ntext$=GetGadgetText(#editor)
If ntext$<>otext$
yn=MessageRequester("N-Edit","Die Datei wurde geändert. Vor dem Beenden abspeichern?",#pb_messagerequester_yesno)
If yn=6
If save$ =""
save$=OpenFileRequester("Text speichern","C:\","Alle Dateien (*.*) | *.*",0)
EndIf
If CreateFile(datei,save$)
WriteStringN(ntext$)
CloseFile(datei)
EndIf
Else
End
EndIf
EndIf
End
Return
[/b][/b][/code]

Verfasst: 03.02.2006 15:48
von Batze
Tip: Weniger fett schreiben. :wink:

Verfasst: 03.02.2006 15:49
von ts-soft
Für ein Einsteigerprogramm schon sehr passabel.

Folgende Dinge sind noch nicht korrekt:
OpenFileRequester für Speichern
Beim Drucken ist der Text so klein, das ich ein "Mikroskop" brauche :wink:

Folgende Dinge fehlen:
Kontextmenü
Toolbar ausblenden
Zeilenumbruch an/aus

Das war erstmal das auffälligste. Ist ja auch ganz schön Mutig,
Billys bestes Stück zu clonen :lol:

//Nachtrag: Hier kann was nicht stimmen:

Code: Alles auswählen

Gosub ende
ende:
yn=0
ntext$=GetGadgetText(#editor)
If ntext$<>otext$
  yn=MessageRequester("N-Edit","Die Datei wurde geändert. Vor dem Beenden abspeichern?",#PB_MessageRequester_YesNo)
  If yn=6
    If save$ =""
      save$=OpenFileRequester("Text speichern","C:\","Alle Dateien (*.*) | *.*",0)
    EndIf
    If CreateFile(datei,save$)
      WriteStringN(ntext$)
      CloseFile(datei)
    EndIf
  Else
    End
  EndIf
EndIf
End
Return

Verfasst: 03.02.2006 16:11
von Macros
Man kann das Dokument nur 1 mal durchsuchen!

übrigens, hab eingebaut, dass beim Suchen das Wort markiert wird.
http://www.testem.de/roger/files/temp/template.pb

PS: am Montag lösche ich den Code wieder.

Verfasst: 03.02.2006 16:29
von Kiffi
Punkt 1:

Versuch mal, die Anzahl der globalen Variablen auf ein Mindestmaß zu
reduzieren. Globale Variablen sollte man nur da verwenden, wo es sich
nicht vermeiden lässt.

Punkt 2:

sowas:

Code: Alles auswählen

MenuItem(#neu,"&Neu....                                Strg+N")
kann man prima ersetzen durch:

Code: Alles auswählen

MenuItem(#neu,"&Neu...." + #TAB$ + "Strg+N")
Die Shortcuts werden dann automatisch ausgerichtet.

Punkt 3:

Der Text des Messagerequesters, der erscheint, wenn man nach Ändern
eines Textes den Menüpunkt 'Neu' aufruft, sollte noch geändert werden. ;-)

Ansonsten: Für ein Anfängerprojekt ist das eine solide Leistung :allright:

Grüße ... Kiffi

Verfasst: 03.02.2006 23:00
von Rubiko
und Codeeinrückung wär gut, das is sinnvoll bei größeren Projekten, da man dort schnell die Übersicht verlieren kann :wink: