Seite 2 von 2
Verfasst: 18.11.2006 16:50
von mk-soft
Auszug aus
http://www.purebasic.fr/german/viewtopi ... highlight=
Code: Alles auswählen
Procedure Datei_Oeffnen()
;{ Procedure für Datei öffnen
;
;}
Protected temp.s
; Bei änderung Speichern aufrufen
If Speichern
r1 = MessageRequester("Frage", "Änderung speichern?", #PB_MessageRequester_YesNoCancel | #MB_ICONQUESTION)
If r1 = #PB_MessageRequester_Yes
Datei_Speichern()
EndIf
EndIf
If r1 = #PB_MessageRequester_Cancel
ProcedureReturn 0
EndIf
; Dateiname erfragen
temp = OpenFileRequester("Datei öffnen", "", "Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*", 0)
If temp = ""
ProcedureReturn 0
EndIf
; Datei öffnen
Datei = temp
If OpenFile(0, Datei)
temp = ""
; Datei lesen bis zum ende
While Eof(0) = 0
temp + ReadString(0) + #CRLF$
Wend
; Datei schliessen
CloseFile(0)
; Text in Editorfeld eintragen
SetGadgetText(#Edit, temp)
temp = ""
; Variablen aktuallisieren
Speichern = 0
Neu = 0
; Titel und Status aktuallisieren
Titel = "PB Editor - " + Datei
SetWindowTitle(#Window, Titel)
StatusBarText(#StatusBar, 0, "Geöffnet")
Else
MessageRequester("Fehler", "Datei konnte nicht geöffnet werden", #MB_ICONSTOP)
EndIf
EndProcedure
Verfasst: 18.11.2006 17:26
von tobe
@edel
stimmt, hat auf den ersten blick so ausgekuckt
hab damit mal ein 1,5mb file geladen (140ms)
is echt ein feiner code !
zum vergleich hab ich noch den code von mk-soft getestet aber die geschwindigkeitsunterschiede sind gigantisch
C:\Windows\setuplog.txt
813041 byte
stream: 47 ms
read: 29656 ms
hier noch mein test code:
Code: Alles auswählen
Procedure _StreamFileIn_Callback(hFile, pbBuff, cb, pcb)
ProcedureReturn ReadFile_(hFile, pbBuff, cb, pcb, 0)!1
EndProcedure
Procedure Editor_Load(Gadget, File.s)
Protected StreamData.EDITSTREAM
Protected FileID.l
FileID = ReadFile(#PB_Any, File)
If FileID
StreamData\dwCookie = FileID(FileID)
StreamData\dwError = #Null
StreamData\pfnCallback = @_StreamFileIn_Callback()
If UCase(GetExtensionPart(File)) = "RTF"
SendMessage_(GadgetID(Gadget), #EM_STREAMIN, #SF_RTF, @StreamData)
Else
SendMessage_(GadgetID(Gadget), #EM_STREAMIN, #SF_TEXT, @StreamData)
EndIf
CloseFile(FileID)
EndIf
EndProcedure
Procedure Datei_Oeffnen(Gadget, Datei.s)
Protected temp.s
If OpenFile(0, Datei)
; Datei lesen bis zum ende
While Eof(0) = 0
temp + ReadString(0) + #CRLF$
Wend
; Datei schliessen
CloseFile(0)
; Text in Editorfeld eintragen
SetGadgetText(Gadget, temp)
EndIf
EndProcedure
If OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
EditorGadget(0, 8, 8, 306, 133)
Datei$ = OpenFileRequester("Datei öffnen", "", "Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*", 0)
If Datei$
Debug Datei$
Debug Str(FileSize(Datei$)) + " byte"
time = ElapsedMilliseconds()
Editor_Load(0, Datei$)
Debug "stream: " + Str(ElapsedMilliseconds() - time) + " ms"
ClearGadgetItemList(0)
time = ElapsedMilliseconds()
Datei_Oeffnen(0, Datei$)
Debug "read: " + Str(ElapsedMilliseconds() - time) + " ms"
Debug "-----"
EndIf
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Verfasst: 18.11.2006 17:40
von edel
Wenn schon ohne Api dann besser so:
Code: Alles auswählen
Procedure Datei_Oeffnen(Gadget, Datei.s)
Protected temp.s , Size.l , hFile.l
hFile = ReadFile(#PB_Any, Datei)
If hFile
; Datei lesen bis zum ende
Size = Lof(hFile)
temp = Space(Size)
ReadData(hFile,@temp,Size)
; Datei schliessen
CloseFile(hFile)
; Text in Editorfeld eintragen
SetGadgetText(Gadget, temp)
EndIf
EndProcedure
Geschwindigkeitstests nicht im Debug-Modus ausfuehren.
Verfasst: 18.11.2006 17:51
von mk-soft
Stream ist schneller
Nicht vergessen
Sonst können nur 32kb bearbeitet werden
FF

Verfasst: 18.11.2006 17:55
von edel
Stimmt , damit werden dann ganze 64k angezeigt
'Etwas' groesser wird es mit :
Code: Alles auswählen
SendMessage_(GadgetId(Gadget),#EM_EXLIMITTEXT, 0,$7fffffff)
Verfasst: 18.11.2006 18:08
von mk-soft
@edel
danke, werde den PB_Editor auf ReadData überarbeiten.
Mit "SendMessage_(GadgetID(#Edit), #EM_SETLIMITTEXT, 0, 0)" habe ich auch keine begrenzung mehr bei StringGadget. Mit EditorGadget nicht getestet

Verfasst: 18.11.2006 18:13
von edel
Da braucht man nicht testen :
lResult = SendMessage( // returns LRESULT in lResult
(HWND) hWndControl, // handle to destination control
(UINT) EM_SETLIMITTEXT, // message ID
(WPARAM) wParam, // = (WPARAM) () wParam;
(LPARAM) lParam // = 0; not used, must be zero );
Parameters
wParam
Specifies the maximum number of TCHARs the user can enter. For ANSI text, this is the number of bytes; for Unicode text, this is the number of characters. This number does not include the terminating null character.
Rich edit controls: If this parameter is zero, the text length is set to 64,000 characters.
Edit controls on Windows NT/2000/XP: If this parameter is zero, the text length is set to 0x7FFFFFFE characters for single-line edit controls or –1 for multiline edit controls.
Edit controls on Windows 95/98/Me: If this parameter is zero, the text length is set to 0x7FFE characters for single-line edit controls or 0xFFFF for multiline edit controls.
lParam
This parameter is not used.
Return Value
This message does not return a value.
[...]
Rich Edit: Supported in Rich Edit 1.0 and later. Use the message EM_EXLIMITTEXT for text length values greater than 64,000. For information about the compatibility of rich edit versions with the various system versions, see About Rich Edit Controls.
Muesste dann bei dir auch -1 sein.
Verfasst: 18.11.2006 18:27
von mk-soft
@edel
habe jetzt auf -1 gesetzt wegen kompalität
THX

Verfasst: 18.11.2006 19:06
von tobe
@edel
dein Datei_Oeffnen() umbau ist ja (meistens) noch schneller als der stream
1637696 byte
stream: 140 ms
edel: 24 ms
813041 byte
stream: 45 ms
edel: 53 ms
270336 byte
stream: 19 ms
edel: 3 ms
ps: die geschwindigkeit ändert sich bei mir nicht, egal ob im Debug-Modus oder als exe