Editor ohne VCL
Öffnen einer Datei
Dazu müssen wir uns erst mal noch ein paar Konstanten und Variablen deklarieren.
Filter für den Datei-Öffnen-Dialog
const FilterString = 'Text Files'#0'*.txt'#0+'All Files'#0'*.*'#0#0;
Maximale Anzahl der Dateien
MAXSIZE = 260;
Maximal zur Verfügung gestellter Speicher
MEMSIZE = 65535;
String für den Fenstertitel
Titel = ' - Editor';
Struktur für den Datei-Öffnen-Dialog
var ofn : TOpenFileName;
Buffer für die Datei
buffer : array [0..MAXSIZE-1] of Char;
Handle für die Datei
hFile : THandle;
Handle auf den Speicher für die Datei
hMemory : THandle;
Zeiger auf die Anfangsadresse des reservierten Speichers
pMemory : Pointer;
Variable für die Dateigröße
SizeReadWrite : DWORD;
Dateiname
sFile : PChar;
Kompletter Pfad mit Dateiname
sFilePath : PChar;
Hilfsstring
s : String;
procedure OpenFileDlg(hWnd: hWnd; hwndEdit: THandle);
begin
Struktur für den Datei-Öffnen-Dialog
ofn.lStructSize := SizeOf(TOpenFileName); ofn.hWndOwner := hWnd; ofn.hInstance := HInstance; ofn.lpstrFilter := FilterString; ofn.lpstrFile := buffer; ofn.nMaxFile := MAXSIZE; ofn.Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_HIDEREADONLY;
Aufrufen des Dialoges
Öffnen der Datei mit CreateFile()
CreateFile(Zeiger auf Dateiname; Zugriffs-Modus; Share-Mode; Zeiger auf eine Struktur mit Sicherheitsattributen; wie zu generieren (öffnen / anlegen); Datei-Attribute; Handle auf eine Vorlagen-Datei
if GetOpenFileName(ofn) then begin hFile := CreateFile(buffer, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);
Bereitstellen des Speichers
hMemory := GlobalAlloc(GMEM_MOVEABLE or GMEM_ZEROINIT, MEMSIZE);
Zeiger auf das erste Byte des reservierten Speichers setzen
pMemory := GlobalLock(hMemory);
Einlesen der Datei in hFile. ReadFile(Handle auf die zu lesende Datei; Adresse des Buffer, der die Datei aufnimmt; maximal zu lesende Bytes; tatsächlich gelesene Bytes; Adresse auf eine Datieinformations-Struktur)
ReadFile(hFile, pMemory^, MEMSIZE - 1, SizeReadWrite, nil);
Übergeben des Dateipfades an sFilePath
sFilePath := ofn.lpstrFile;
Extrahieren des Dateinamens (um ihn im Fenstertitel anzuzeigen)
sFile := PChar(@ofn.lpstrFile[ofn.nFileOffset]);
Ergänzen des Dateinames mit der Titel-Konstanten
s := sFile + Titel;
Setzen des Fenstertitels mit SetWindowText(Handle des betreffenden Fensters; Text)
SetWindowText(hWnd, PChar(s));
Laden des Dateiinhaltes in das Editfeld
SendMessage(hwndEdit, WM_SETTEXT, 0, Integer(pMemory));
Reservierten Speicher wieder freigeben
CloseHandle(hFile); GlobalUnlock(DWORD(pMemory)); GlobalFree(hMemory); end else exit; end;