Home » Tutorials » Systemnahe Programmierung » Editor ohne VCL

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;