LoginSignup
1
0

win16 apiを叩きたい。 その5

Last updated at Posted at 2024-01-29

概要

win16 apiを叩きたい。
pc98エミュレーターに、ms-dos入れて、windows3.1入れて、turbo pascal入れて、窓を表示する。
demo見つけたので、やってみた。

サンプルコード


program DirDemo;
uses WinTypes, WinProcs, WinCrt, WinDos, Strings;
const
	MaxDirSize = 512;
	MonthStr: array[1..12, 0..3] of Char = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
type
	PDirEntry = ^TDirEntry;
	TDirEntry = record
		Attr: Byte;
		Time: Longint;
		Size: Longint;
		Name: array[0..12] of Char;
	end;
	TDirList = array[0..MaxDirSize - 1] of PDirEntry;
var
	Count: Integer;
	Path: array[0..fsPathName] of Char;
	DirList: TDirList;
function NumStr(N: Integer): PChar;
const
	NumText: array[0..2] of Char = '00';
begin
	NumText[0] := Chr(N div 10 + Ord('0'));
	NumText[1] := Chr(N mod 10 + Ord('0'));
	NumStr := NumText;
end;
procedure QuickSort(L, R: Integer);
var
	I, J: Integer;
	X, Y: PDirEntry;
begin
	I := L;
	J := R;
	X := DirList[(L + R) div 2];
	repeat
		while StrComp(DirList[I]^.Name, X^.Name) < 0 do 
			Inc(I);
		while StrComp(DirList[J]^.Name, X^.Name) > 0 do 
			Dec(J);
		if I <= J then
		begin
			Y := DirList[I];
			DirList[I] := DirList[J];
			DirList[J] := Y;
			Inc(I);
			Dec(J);
		end;
	until I > J;
	if L < J then 
		QuickSort(L, J);
	if I < R then 
		QuickSort(I, R);
end;

procedure GetPath;
var
	Attr: Word;
	Dir: array[0..fsDirectory] of Char;
	Name: array[0..fsFileName] of Char;
	Ext: array[0..fsExtension] of Char;
	F: File;
begin
	Write('Show directory of? ');
	ReadLn(Path);
	FileExpand(Path, Path);
	if Path[StrLen(Path) - 1] <> '\' then
	begin
		Assign(F, Path);
		GetFAttr(F, Attr);
		if (DosError = 0) and (Attr and faDirectory <> 0) then
			StrLCat(Path, '\', fsPathName);
	end;
	FileSplit(Path, Dir, Name, Ext);
	if Name[0] = #0 then 
		StrCopy(Name, '*');
	if Ext[0] = #0 then 
		StrCopy(Ext, '.*');
	StrECopy(StrECopy(StrECopy(Path, Dir), Name), Ext);
end;
procedure FindFiles;
var
	N: Word;
	SearchRec: TSearchRec;
begin
	Count := 0;
	FindFirst(Path, faReadOnly + faDirectory + faArchive, SearchRec);
	while (DosError = 0) and (Count < MaxDirSize) do
	begin
		N := StrLen(SearchRec.Name) + 10;
		GetMem(DirList[Count], N);
		Move(SearchRec.Attr, DirList[Count]^, N);
		Inc(Count);
		FindNext(SearchRec);
	end;
end;
procedure SortFiles;
begin
	if Count <> 0 then 
		QuickSort(0, Count - 1);
end;
procedure PrintFiles;
var
	I: Integer;
	Total: Longint;
	P: PChar;
	T: TDateTime;
	N: array[0..fsFileName] of Char;
	E: array[0..fsExtension] of Char;
begin
	WriteLn('Directory of ', Path);
	if Count = 0 then
	begin
		WriteLn('No matching files');
		Exit;
	end;
	Total := 0;
	for I := 0 to Count - 1 do
		with DirList[I]^ do
		begin
			P := StrPos(Name, '.');
			if (P = nil) or (P = Name) then
			begin
				StrCopy(N, Name);
				StrCopy(E, '');
			end 
			else
			begin
				StrLCopy(N, Name, P - Name);
				StrCopy(E, P + 1);
			end;
			Write(N, ' ': 9 - StrLen(N), E, ' ': 4 - StrLen(E));
			if Attr and faDirectory <> 0 then
				Write('<DIR>	 ')
			else
				Write(Size: 8);
			UnpackTime(Time, T);
			WriteLn(T.Day: 4, '-', MonthStr[T.Month], '-', NumStr(T.Year mod 100), T.Hour: 4, ':', NumStr(T.Min));
			Inc(Total, Size);
		end;
	WriteLn(Count, ' files, ', Total, ' bytes, ', DiskFree(Ord(Path[0]) - 64), ' bytes free');
	WriteLn;
end;
begin
	ScreenSize.X := 64;
	ScreenSize.Y := 256;
	while True do
	begin
		GetPath;
		FindFiles;
		SortFiles;
		PrintFiles;
	end;
end.

以上。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0