confused newbie

Blitz3D Forums/Blitz3D Beginners Area/confused newbie

REDi(Posted 2004) [#1]
Hi all

This is my first ever project in BlitzPlus, and to start with i decided to write a notepad clone, everything was going fine until i added the Copy and Paste commands to the edit menu, now the program seems to crash/freeze at random times and giving no error messages, can anybody see what i've done wrong?

; userlibs
; *********************************************
; .lib "user32.dll"
; OpenClipboard%(hwnd%):"OpenClipboard"
; CloseClipboard%():"CloseClipboard"
; ExamineClipboard%(format%):"IsClipboardFormatAvailable"
; EmptyClipboard%():"EmptyClipboard"
; GetClipboardData$(format%):"GetClipboardData"
; SetClipboardData%(format%,txt$):"SetClipboardData"
; *********************************************



Global CurrentFileName$
Global CurrentFont

; ---------------------------------------------------------------------------------------------------
; BUILD WINDOW

; create application window
Global AppWin = CenterWindow("Text Editor",640,480)


; create menu
menu = WindowMenu(AppWin)

FileMenu = CreateMenu("File",0,menu)
	CreateMenu("New",1,FileMenu)
	CreateMenu("Open...",2,FileMenu)
	CreateMenu("Save",3,FileMenu)
	CreateMenu("Save As...",4,FileMenu)
	CreateMenu("",0,FileMenu)
	CreateMenu("Exit",5,FileMenu)

EditMenu = CreateMenu("Edit",0,menu)
	CreateMenu("Cut",20,EditMenu)
	CreateMenu("Copy",21,EditMenu)
	CreateMenu("Paste",22,EditMenu)
	CreateMenu("Delete",23,EditMenu)

FormatMenu = CreateMenu("Format",0,menu)
	Global WordWrap = CreateMenu("Word Wrap",40,FormatMenu)
	CreateMenu("Font...",41,FormatMenu)

UpdateWindowMenu AppWin

; create text area
Global TextArea = CreateTextArea(0,0,ClientWidth(AppWin),ClientHeight(AppWin),AppWin)
SetTextAreaColor TextArea,255,255,255,False
SetTextAreaColor TextArea,0,50,90,True
SetGadgetLayout TextArea,1,1,1,1 




; ---------------------------------------------------------------------------------------------------
; MAIN LOOP

Repeat

	Event = WaitEvent()
	
	Select Event
	
		Case $803
			Exit

		Case $1001
			EID = EventData()
			Select EID

				Case 1	; New
					SetTextAreaText TextArea,""
					CurrentFilename$ = ""
					SetStatusText(AppWin,CurrentFileName$)
				
				Case 2	; Open
					FileName$ = RequestFile("Open a text file","txt,log,ini")
					OpenTextFile(FileName$)

				Case 3	; Save
					If CurrentFilename$ <> ""
						SaveTextFile(CurrentFileName$)
					Else
						FileName$ = RequestFile("Save text file as","txt,log,ini",True)
						SaveTextFile(FileName$)
					EndIf						

				Case 4	; Save As
					FileName$ = RequestFile("Save text file as","txt,log,ini",True)
					SaveTextFile(FileName$)

				Case 5	; Exit
					If Confirm("do you really want to exit?") End

				Case 20	; Cut
					pos = TextAreaCursor(TextArea)
					length = TextAreaSelLen(TextArea)
					WriteClipboardText(TextAreaText(TextArea,pos,length))
					SetTextAreaText TextArea,"",pos,length

				Case 21	; Copy
					pos = TextAreaCursor(TextArea)
					length = TextAreaSelLen(TextArea)
					WriteClipboardText(TextAreaText(TextArea,pos,length))

				Case 22	; Paste
					pos = TextAreaCursor(TextArea)
					SetTextAreaText TextArea,ReadClipboardText$(),pos,0

				Case 23	; Delete
					pos = TextAreaCursor(TextArea)
					length = TextAreaSelLen(TextArea)
					SetTextAreaText TextArea,"",pos,length

				Case 40	; Word Wrap
					If MenuChecked(WordWrap)
						UncheckMenu WordWrap
						Style = 0
					Else
						CheckMenu WordWrap
						Style = 1
					EndIf
					UpdateWindowMenu AppWin
					CurrentText$ = TextAreaText(TextArea)
					FreeGadget TextArea
					TextArea = CreateTextArea(0,0,ClientWidth(AppWin),ClientHeight(AppWin),AppWin,style)
					SetTextAreaFont TextArea,CurrentFont
					SetTextAreaColor TextArea,255,255,255,False
					SetTextAreaColor TextArea,0,50,90,True
					SetGadgetLayout TextArea,1,1,1,1 
					SetTextAreaText TextArea,CurrentText$
					CurrentText$ = ""
					
				Case 41	; Font
					SelectedFont = RequestFont()
					If SelectedFont
						CurrentFont = SelectedFont
						SetTextAreaFont TextArea,CurrentFont
						SetTextAreaColor TextArea,255,255,255
					EndIf
												
			End Select

	End Select

Forever


End



; ---------------------------------------------------------------------------------------------------
; OPEN TEXT FILE

Function OpenTextFile(Filename$)

	If FileType(FileName$) <> 1 Then Return
	File = ReadFile(Filename$)	
	LockTextArea TextArea
	Repeat
		If lineno=0 
			Line$ = ReadLine(File)
		Else
			Line$ = Line$ + Chr$(13) + ReadLine(File)
		EndIf
		lineno = lineno + 1
	Until Eof(File)
	SetTextAreaText TextArea,Line$
	CloseFile File
	UnlockTextArea TextArea
	CurrentFilename$ = Filename$
	SetStatusText(AppWin,CurrentFileName$)
 
End Function



; ---------------------------------------------------------------------------------------------------
; SAVE TEXT FILE

Function SaveTextFile(Filename$)

	File = WriteFile(Filename$)	
	For n=0 To TextAreaLen(TextArea,2)-1
		WriteLine File,TextAreaText(TextArea,n,1,2)
	Next
	CloseFile File
	CurrentFilename$ = Filename$
	SetStatusText(AppWin,CurrentFileName$)

End Function


; ---------------------------------------------------------------------------------------------------
; CREATE A CENTERD WINDOW

Function CenterWindow(Title$,Width,Height,Group=0,Style=15)

	x = ( GadgetWidth(Desktop()) - Width ) / 2
	y = ( GadgetHeight(Desktop()) - Height ) / 2
	Return CreateWindow(Title$,x,y,width,height,Group,Style)

End Function


;-----------------------------------

Function WriteClipboardText(txt$)
	Local cb_TEXT=1
	If txt$="" Then Return 
	OpenClipboard 0
	EmptyClipboard
	SetClipboardData cb_TEXT,txt$
	CloseClipboard
End Function

;-----------------------------------

Function ReadClipboardText$()
	Local cb_TEXT=1
	Local txt$=""
	OpenClipboard 0
	If ExamineClipboard(cb_TEXT) 
		txt$=GetClipboardData$(cb_TEXT)
	EndIf
	CloseClipboard
	Return txt$
End Function



soja(Posted 2004) [#2]
A guess:
After playing with it, it looks like memory is being overwritten, as in a buffer overflow. I would try changing the SetClipboardData function to pass a bank instead of a string.

1) In the userlib declaration, change txt$ to txt*
2) In WriteClipboardText, convert the string to a bank before sending

See if that works better


REDi(Posted 2004) [#3]
turns out the problem was the ReadClipboardText function!

Should be...
Function ReadClipboardText$() 
Local cb_TEXT=1 
Local txt$="" 
If OpenClipboard(0) Then 
If ExamineClipboard(cb_TEXT) 
txt$=GetClipboardData$(cb_TEXT) 
EndIf 
CloseClipboard 
EndIf 
Return txt$ 
End Function 


Thanx again Darkuni :)


Darkuni(Posted 2004) [#4]
Well, heck .. helping people all over ... FABULOUS! :)