home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Windows Shareware GOLD
/
NuclearComputingVol3No1.cdr
/
utils
/
f1498
/
plx.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1991-09-23
|
38KB
|
1,290 lines
{Program Listing Express - Program Copyright (C) Doug Overmyer 9/2/91}
{Begun 8/2/91}
{1.1 9/15/91 change BN5, add sculpted static text fields }
{1.2 9/23/91 revise printer method to eliminate double spacing of over-wide
lines;force enumeration and reselection of font after running control panel;
explicitly dispose of Faces collection; better redraw of PSText objects}
program PLXpress;
{$S-}
{$R plx.RES}
{$R-}
uses WinTypes,WinProcs,Strings,WObjects,WOPlus,WFPlus,StdDlgs;
const
cm_FOpen = 101; {menuitem FileOpen }
cm_FPrint = 102; {menuitem FilePrint }
cm_FSetUp = 103; {menuitem FilePageSetup}
cm_FExit = 104; {menuitem FileExit }
cm_TFont = 111; {menuitem TextFont }
id_But1 = 201; {User defined button 1}
id_But2 = 202; { " 2}
id_But3 = 203; { " 3}
id_But4 = 204; { " 3}
id_But5 = 205; { " 5}
id_D1Lb1 = 301; {List box element in Dlg1}
id_St1 = 401; {Static text 1 }
id_St2 = 402; {Static text 2 }
id_St3 = 403; {Static text 3 }
id_St4 = 404; {Static text 4 }
id_D3Setup = 501; {Setup button in Dlg3}
id_D3OKPrt = 521; {OK button in Dlg3 }
id_D2EC1 = 603; {Edit Control 1 in Dlg2}
id_D2EC2 = 605; { 2 }
id_D2EC3 = 607; { 3 }
id_D2EC4 = 609; { 4 }
id_D2EC5 = 617; { 5 }
id_D2CB1 = 612; {Check box 1 in Dlg2 }
id_D2CB2 = 613; {Check box 2 in Dlg2 }
id_D2CB3 = 614; {Check box 3 in Dlg2 }
id_D2CB4 = 615; {Check box 4 in Dlg2 }
id_D2CB5 = 619; {Check box 5 in Dlg2 }
id_D2CB6 = 620; {Check box 6 in dlg2 }
id_D2OK = 601; {OK button in Dlg2 }
id_D4LB1 = 701; {List box in Dlg4}
id_D4LB2 = 702; {List box in Dlg4 }
idm_About = 801; {menu id for PLX_About menu}
idm_RunCP = 802; {menu id for run control panel}
um_FilePrint = 803; {User defined message }
{******************************************************************}
{ Types }
{******************************************************************}
type
TPLXApplication = object(TApplication)
procedure InitMainWindow;virtual;
end;
type
pFormatRec = ^FormatRec;
FormatRec = record
ShowRuler,ShowFName,ShowDTStamp,ShowPageNum,ShowLineNum,UseCCB:Integer;
end;
PPLXDlg2 = ^TPLXDlg2;
TPLXDlg2 = object(TDialog) {Page setup dialog}
Margins:TRect;
Format:FormatRec;
TabSize:Integer;
procedure WMInitDialog(var Msg:TMessage);virtual wm_First+wm_InitDialog;
procedure IDD2OK(var Msg:TMessage); virtual id_First+id_D2OK;
procedure IDD2EC1(var Msg:TMessage);virtual id_First+id_D2EC1;
procedure IDD2EC2(var Msg:TMessage);virtual id_First+id_D2EC2;
procedure IDD2EC3(var Msg:TMessage);virtual id_First+id_D2EC3;
procedure IDD2EC4(var Msg:TMessage);virtual id_First+id_D2EC4;
procedure IDD2EC5(var Msg:TMessage);virtual id_First+id_D2EC5;
procedure IDD2CB1(var Msg:TMessage);virtual id_First+id_D2CB1;
procedure IDD2CB2(var Msg:TMessage);virtual id_First+id_D2CB2;
procedure IDD2CB3(var Msg:TMessage);virtual id_First+id_D2CB3;
procedure IDD2CB4(var Msg:TMessage);virtual id_First+id_D2CB4;
procedure IDD2CB5(var Msg:TMessage);virtual id_First+id_D2CB5;
procedure IDD2CB6(var Msg:TMessage);virtual id_First+id_D2CB6;
end;
PPLXDlg3 = ^TPLXDlg3;
TPLXDlg3 = object(TDialog) {Print setup dialog}
procedure WMInitDialog(var Msg:TMessage);virtual wm_First+wm_InitDialog;
procedure IDSetup(var Msg:TMessage);virtual id_First+id_D3Setup;
procedure IDOKPrt(var Msg:TMessage);virtual id_First+id_D3OKPrt;
end;
PPLXDlg4 = ^TPLXDlg4; {Type Faces & Sizes Dialog}
TPLXDlg4 = object(TDialog)
FontSize: Integer;
procedure WMInitDialog(var Msg:TMessage);virtual wm_First+wm_InitDialog;
procedure IDD4Lb1(var Msg:TMessage);virtual id_First+id_D4Lb1;
procedure IDD4Lb2(var Msg:TMessage);virtual id_First+id_D4Lb2;
procedure LoadSizes;virtual;
end;
type {convert TLogFont records to objects}
PFontItem = ^TFontItem;
TFontItem = object(TObject)
LogFont:TLogFont;
FontType:Integer;
constructor Init(NewItem:TLogFont;NewType:Integer);
destructor Done;virtual;
end;
PFontCollection = ^TFontCollection; {Collection of printer TLOGFont recs}
TFontCollection = object(TSortedCollection)
function KeyOf(Item:Pointer):Pointer;virtual;
function Compare(Key1,Key2:Pointer):Integer;virtual;
function GetCount:Integer;virtual;
end;
type
pPLXPrinter = ^tPLXPrinter;
tPlxPrinter = object(tWOPrinter)
HeadLine1:Array[0..210] of Char;
function DoHeader:Boolean;virtual;
function SetHeader1(NewHeadLine1:PChar):Boolean;virtual;
end;
type {MainWindow of Application}
PPLXWindow = ^TPLXWindow;
TPLXWindow = object(TWindow)
BWin:PEdit; {child window displaying sample lines from infile}
TheIcon:HIcon;
Bn1,Bn2,Bn3,Bn4,Bn5 :PODButton;
FileName:Array[0..79] of Char; {infile name}
CharsInFile:LongInt; {chars in infile}
St1,St2:PSText;
FontSelection:Integer; {Index into Faces collection}
PFontSize:Integer; {Current font size for printed text}
LogPixX,LogPixY:Integer; {LogPixelsX & Y for current Printer}
Records:PCollection; {Collection of Infile recordds}
Margins:TRect; {in inches * 100}
Format:FormatRec;
Tabsize:Integer;
constructor Init(AParent:PWindowsObject;ATitle:PChar);
destructor Done;virtual;
procedure SetupWindow;virtual;
procedure Paint(PaintDC:HDC;var PaintInfo:TPaintStruct);virtual;
procedure SetStaticText;
procedure LoadBWin;
procedure WMDrawItem(var Msg:TMessage);virtual wm_First + wm_DrawItem;
procedure WMSize(var Msg:TMessage);virtual wm_First+wm_Size;
procedure WMSetFocus(var Msg:TMessage);virtual wm_First+wm_SetFocus;
procedure IDBut1(var Msg:TMessage);virtual id_First+id_But1; {Print}
procedure IDBut2(var Msg:TMessage);virtual id_First+id_But2; {FileOpen}
procedure IDBut3(var Msg:TMessage);virtual id_First+id_But3; {PageSetup}
procedure IDBut4(var Msg:TMessage);virtual id_First+id_But4; {SelectFont}
procedure IDBut5(var Msg:TMessage);virtual id_First+id_But5; {Exit}
procedure EnumerateFaces;virtual;
procedure EnumerateSizes;virtual;
function GetFontSelection:Integer;virtual;
procedure SetFontSelection(NewSelection:Integer);
function GetLogPixX:Integer;virtual;
function GetLogPixY:Integer;virtual;
procedure SetFontSize(NewfontSize:Integer);virtual;
procedure SetPFontSize(NewfontSize:Integer);virtual;
procedure UMFilePrint(var Msg:TMessage);virtual wm_User+um_FilePrint;
procedure WMSysCommand(var Msg:TMessage);virtual wm_First+wm_SysCommand;
procedure CMFOpen(var Msg:TMessage);virtual cm_First+cm_FOpen;
procedure CMFPrint(var Msg:TMessage);virtual cm_First+cm_FPrint;
procedure CMFSetUp(var Msg:TMessage);virtual cm_First+cm_FSetUp;
procedure CMFExit(var Msg:TMessage);virtual cm_First+cm_FExit;
procedure CMTFont(var Msg:TMessage);virtual cm_First+cm_TFont;
procedure GetFormatFlags(var pFormat:PFormatRec);virtual;
procedure SetFormatFlags(NewFormat:FormatRec);virtual;
procedure GetMargins(var pMargins:PRect);virtual;
procedure SetMargins(NewMargins:TRect);virtual;
function GetTabSize:Integer;virtual;
procedure SetTabSize(NewTabSize:Integer);virtual;
procedure GetProfileValues;virtual;
end;
{********************************************************************}
{G L O B A L V A R I A B L E S }
{********************************************************************}
var
Faces:PFontCollection; {collection of PFontItem for call-back func}
Sizes:PCollection; {collection of stacks for call-back func}
{********************************************************************}
{M E T H O D S }
{********************************************************************}
procedure TPLXApplication.InitMainWindow;
begin
MainWindow := New(PPLXWindow,Init(nil,'PLX'));
end;
{********************************************************************}
{Init}
constructor TPLXWindow.Init(AParent:PWindowsObject;ATitle:PChar);
begin
TWindow.Init(AParent,ATitle);
Attr.Menu := LoadMenu(HInstance,'PLX_Menu');
Attr.X := 20; Attr.Y := 25; Attr.W := 595; Attr.H := 260;
Bn1 := New(PODButton,Init(@Self,id_But1,'Print',200,0,50,50,False,'PLX_Bn1'));
Bn2 := New(PODButton,Init(@Self,id_But2,'File Open',0,0,50,50,False,'PLX_Bn2'));
Bn3 := New(PODButton,Init(@Self,id_But3,'Page Setup',50,0,100,50,False,'PLX_Bn3'));
Bn4 := New(PODButton,Init(@Self,id_But4,'Font',150,0,50,50,False,'PLX_Bn4'));
Bn5 := New(PODButton,Init(@Self,id_But5,'Exit',250,0,50,50,False,'PLX_Bn5'));
St1 := New(PSText,Init(@Self,id_St1,'',315,3,240,20,1,dt_Center or dt_VCenter));
St2 := New(PSText,Init(@Self,id_St2,'',315,26,240,20,1,dt_Center or dt_VCenter));
LogPixY := 1;
FontSelection := 9999;
PFontsize := 10;
Faces := New(PFontCollection,Init(100,100));
Faces^.Duplicates := False;
Sizes := New(PCollection,Init(10,10));
EnumerateFaces;
EnumerateSizes;
BWin := New(PEdit,Init(@Self,200,nil,0,0,0,0,0,True));
with BWin^.Attr do
Style := Style or es_NoHideSel ;
Records := New(PCollection,Init(1000,500));
CharsInFile := 0;
Margins.left := 0;Margins.right := 0;Margins.top := 0;Margins.bottom := 0;
Format.ShowRuler := 1;Format.ShowFName := 1;
Format.ShowDTStamp := 1;Format.ShowPageNum := 1;
Format.ShowLineNum := 1;Format.UseCCB := 0;
Tabsize := 2;
GetProfileValues;
end;
{SetupWindow}
procedure TPLXWindow.SetupWindow;
var
SysMenu:hMenu;
OEMFixFont:hFont;
begin
TWindow.SetupWindow;
SetClassWord(HWindow,GCW_HIcon,LoadIcon(HInstance,'PLX_Icon'));
Sysmenu := GetSystemMenu(hWindow,false);
AppendMenu(SysMenu,MF_Separator,0,nil);
AppendMenu(SysMenu,0,idm_RunCP,'Run Control Panel');
AppendMenu(Sysmenu,0,idm_About,'About...');
OEMFixFont := GetStockObject(OEM_Fixed_Font);
SendMessage(BWin^.hWindow,wm_SetFont,OEMFixFont,LongInt(1));
end;
{Paint}
procedure TPLXWindow.Paint(PaintDC:HDC;var PaintInfo:TPaintStruct);
var
ThePen:HPen;
TheBrush :HBrush;
OldBrush :HBrush;
OldPen:HPen;
begin
TheBrush := GetStockObject(LtGray_Brush);
ThePen := CreatePen(ps_Solid,1,$00000000);
OldPen := SelectObject(PaintDC,ThePen);
OldBrush := SelectObject(PaintDC,TheBrush);
Rectangle(PaintDC,0,0,1024,50);
SelectObject(PaintDC,OldBrush);
SelectObject(PaintDC,OldPen);
DeleteObject(ThePen);
end;
{Route the Ownerdraw msgs to correct object}
procedure TPLXWindow.WMDrawItem(var Msg:TMessage);
var
PDIS : ^TDrawItemStruct;
begin
PDIS := Pointer(Msg.lParam);
case PDIS^.CtlType of
odt_Button:
case PDIS^.CtlID of
id_But1 :Bn1^.DrawItem(Msg);
id_But2 :Bn2^.DrawItem(Msg);
id_But3 :Bn3^.DrawItem(Msg);
id_But4 :Bn4^.DrawItem(Msg);
id_But5 :Bn5^.DrawItem(Msg);
end;
end;
end;
{Done}
destructor TPLXWindow.Done;
var
Buf:Array[0..5] of Char;
Buf2:Array[0..30] of Char;
FI:pFontItem;
begin
StrCopy(Buf,'');
if FontSelection <> 9999 then
begin
FI := Faces^.At(FontSelection);
WritePrivateProfileString('PLX','FaceName',FI^.LogFont.lfFaceName,'PLX.INI');
Str(PFontSize:2,Buf);
WritePrivateProfileString('PLX','FontSize',Buf,'PLX.INI');
Str(Format.ShowRuler:1,Buf);
WritePrivateProfileString('PLX','ShowRuler',Buf,'PLX.INI');
Str(Format.ShowFName:1,Buf);
WritePrivateProfileString('PLX','ShowFName',Buf,'PLX.INI');
Str(Format.ShowDTStamp:1,Buf);
WritePrivateProfileString('PLX','ShowDTStamp',Buf,'PLX.INI');
Str(Format.ShowPageNum:1,Buf);
WritePrivateProfileString('PLX','ShowPageNum',Buf,'PLX.INI');
Str(Format.ShowLineNum:1,Buf);
WritePrivateProfileString('PLX','ShowLineNum',Buf,'PLX.INI');
Str(Format.UseCCB:1,Buf);
WritePrivateProfileString('PLX','UseCCB',Buf,'PLX.INI');
Str(Margins.Left,Buf);
WritePrivateProfileString('PLX','MarginL',Buf,'PLX.INI');
Str(Margins.Right,Buf);
WritePrivateProfileString('PLX','MarginR',Buf,'PLX.INI');
Str(Margins.Top,Buf);
WritePrivateProfileString('PLX','MarginT',Buf,'PLX.INI');
Str(Margins.Bottom,Buf);
WritePrivateProfileString('PLX','MarginB',Buf,'PLX.INI');
Str(TabSize,Buf);
WritePrivateProfileString('PLX','TabSize',Buf,'PLX.INI');
WritePrivateProfileString('PLX','End','','PLX.INI');
end;
Dispose(Faces,Done);
Dispose(Sizes,Done);
Dispose(Records,Done);
TWindow.Done;
end;
{WMSize}
procedure TPLXWindow.WMSize(var Msg:TMessage);
begin
SetWindowPos(BWin^.HWindow,0,-1,50,
(Msg.LParamLo )+1,(Msg.LParamHi-50),swp_NoZOrder);
end;
{WMSetFocus}
procedure TPLXWindow.WMSetFocus(var Msg:TMessage);
begin
end;
{IDBut1} {Print file dialog }
procedure TPLXWindow.IDBut1(var Msg:TMessage);
var
Dlg : PDialog;
begin
Dlg :=New(PPLXDlg3,Init(@Self,'PLX_Dlg3'));
Application^.ExecDialog(Dlg);
end;
{IDBut2} {run file open dialog box, load file}
procedure TPLXWindow.IDBut2(var Msg:TMessage);
var
Dlg1 :PFileDialog;
InFile :PTextStream;
InRecord:PChar;
ExpRecord:PChar;
PctMeter:PMeterWindow;
Division,Pctdone:Integer;
indx1 : Integer;
Indx2 : Integer;
hTab :Integer;
begin
Division := 10;
StrCopy(FileName,'*.*');
InRecord :=MemAlloc(9999);
ExpRecord := MemAlloc(9999);
if Records^.Count > 0 then
begin
Dispose(Records,Done);
Records := New(PCollection,Init(1000,500));
end;
BWin^.Clear;
Dlg1 := new(PfileDialog,Init(@Self,PChar(sd_FileOpen),@FileName));
If Application^.ExecDialog(Dlg1) <> id_OK then
begin
StrCopy(FileName,'');
exit;
end;
if StrIComp(FileName,'*.*') <> 0 then
begin
PctMeter := New(PMeterWindow,Init(@Self,'PLX - Reading File'));
Application^.MakeWindow(PctMeter);
PctMeter^.Draw(0);
InFile := New(PTextStream,Init(FileName,stOpen,1024));
CharsInFile := InFile^.CharsToRead;
While NOT InFile^.IsEOF do
begin
StrCopy(InRecord,InFile^.GetNext);
if InFile^.IsEOF = FALSE then
begin
CheckCC(Inrecord,ExpRecord); {check for control characters}
if ExpRecord = nil then {avoid storing null pointers }
StrCopy(ExpRecord,' ');
Records^.Insert(New(PTextObj,Init(ExpRecord)));
end;
if InFile^.GetPctDone > Division then
begin
PctMeter^.Draw(Division);
Inc(Division,10);
end;
end;
Dispose(PctMeter,Done);
end;
FreeMem(InRecord,9999);
FreeMem(ExpRecord,9999);
UpdateWindow(hWindow); {get a redraw before loading preview window}
LoadBWin;
end;
{IDBut3} {page setup}
procedure TPLXWindow.IDBut3(var Msg:TMessage);
var
TotChars:Integer;
begin
Application^.ExecDialog(New(PPLXDlg2,Init(@Self,'PLX_Dlg2')));
InvalidateRect(BWin^.HWindow,nil,True);
end;
{IDBut4} {run font selection dialogs}
procedure TPLXWindow.IDBut4(var Msg:TMessage);
var
Dlg2:PPLXDlg4;
begin
if Faces^.Count = 0 then {if necessary, enumerate fonts for current printer}
begin
EnumerateFaces;
EnumerateSizes;
end;
Dlg2 := new(PPLXDlg4,Init(@Self,'PLX_Dlg4'));
Application^.ExecDialog(Dlg2);
if FontSelection = 9999 then
begin
MessageBox(hWindow,'Please select a font size','Alert',mb_OK or mb_IconExclamation);
exit;
end;
end;
{IdBut5} {exit}
procedure TPLXWindow.IDBut5(var Msg:TMessage);
begin
SendMessage(HWindow,wm_Close,0,0);
end;
function EnumerateFace(var LogFont: TLogFont; TextMetric: PTextMetric;
FontType: Integer; Data: PChar): Integer; export;
function DupF(Item:PFontItem):Boolean;far;
begin
DupF := (StrIComp(Item^.LogFont.lfFaceName, LogFont.lfFacename)= 0);
end;
var
OldFont: HFont;
Result:PFontItem;
begin
Result := Faces^.FirstThat(@DupF);
if Result = nil then Faces^.Insert(New(PFontItem,Init(LogFont,FontType)));
EnumerateFace := 1;
end;
function EnumerateSize(var LogFont: TLogFont; TextMetric: PTextMetric;
FontType: Integer; Data: PChar): Integer; export;
function DupS(Item:PIntObj):Boolean;far;
begin
DupS := (Item^.Int = LogFont.lfHeight);
end;
var
FHeight:Array[0..6] of Char;
PStk :PStack;
Result :PIntObj;
begin
PStk :=Sizes^.At(Sizes^.Count-1);
Result := PStk^.FirstThat(@DupS);
if Result = nil then PStk^.Push(New(PIntObj,Init(LogFont.lfHeight))) ;
EnumerateSize := 1;
end;
{ Collect all of faces of current system printer }
procedure TPLXWindow.EnumerateFaces;
var
EnumProc: TFarProc;
ThePrinter:pWOPrinter;
begin
ThePrinter := New(pWOPrinter,Init(hInstance,@Self));
ThePrinter^.GetPrinterParms;
ThePrinter^.DCCreated;
EnumProc := MakeProcInstance(@EnumerateFace, HInstance);
EnumFonts(ThePrinter^.hPrintDC, nil, EnumProc,nil);
LogPixY := GetDeviceCaps(ThePrinter^.hPrintDC,LogPixelsY);
LogPixX := GetDeviceCaps(ThePrinter^.hPrintDC,LogPixelsX);
ThePrinter^.DeleteContext;
Dispose(ThePrinter,Done);
end;
{ Collect all of sizes for each face of current system printer }
{EnumerateSizes}
procedure TPLXWindow.EnumerateSizes;
var
EnumProc: TFarProc;
ThePrinter:pWOPrinter;
FontItem :PFontItem;
Indx : Integer;
begin
ThePrinter := New(pWOPrinter,Init(hInstance,@Self));
ThePrinter^.GetPrinterParms;
ThePrinter^.DCCreated;
EnumProc := MakeProcInstance(@EnumerateSize, HInstance);
for Indx := 0 to Faces^.Count -1 do
begin
FontItem := Faces^.At(Indx);
Sizes^.Insert(New(PStack,Init(10,10)));
EnumFonts(ThePrinter^.hPrintDC, FontItem^.LogFont.lfFaceName,
EnumProc,nil);
end;
ThePrinter^.DeleteContext;
Dispose(ThePrinter,Done);
end;
{GetFontSelection}
function TPLXWindow.GetFontSelection:Integer;
begin
GetFontSelection := FontSelection;
end;
{SetFontSelection}
procedure TPLXWindow.SetFontSelection(NewSelection:Integer);
begin
FontSelection := NewSelection;
end;
{SetFontSize}
procedure TPLXWindow.SetFontSize(NewFontSize:Integer);
begin
PFontSize := NewFontSize;
end;
{SetPFontSize}
procedure TPLXWindow.SetPFontSize(NewFontSize:Integer);
begin
PFontSize := NewFontSize;
end;
{GetLogPixX}
function TPLXWindow.GetLogPixX:Integer;
begin
GetLogPixX := LogPixX;
end;
{GetLogPixY}
function TPLXWindow.GetLogPixY:Integer;
begin
GetLogPixY := LogPixY;
end;
{UMFilePrint}
procedure TPLXWindow.UMFilePrint(var Msg:TMessage);
var
aPtr : pPLXPrinter;
indx : Integer;
FI : PFontItem;
OldFont,NewFont:hFont;
szSize:Array[0..7] of Char;
LogFont:TLogFont;
TM:TTextMetric;
Buf1,Buf2:PChar;
szIndx:Array[0..5] of Char;
OutRecord:pTextObj;
ExpRec:PChar;
CCB:Char;
begin
if Records^.Count = 0 then
begin
MessageBox(hWindow,'You need to open a file - click the disk icon',
'Alert',mb_OK or mb_IconExclamation);
exit;
end;
if FontSelection = 9999 then
begin
MessageBox(hWindow,'You need to select a font - click the font button',
'Alert',mb_OK or mb_IconExclamation);
exit;
end;
aPtr := New(pPLXPrinter,Init(hInstance,@Self));
indx := 0;
GetMem(Buf1,16000);
GetMem(ExpRec,16000);
if aPtr^.Start('PLX',hWindow) then
begin
aPtr^.SetMarginL(round(Margins.left * LogPixX div 100)) ;{margin in device pixels}
FI := Faces^.At(FontSelection);
FI^.LogFont.lfHeight := Round(PFontsize * LogPixY / 72);
FI^.LogFont.lfWidth := 0;
FI^.LogFont.lfWeight := fw_Normal;
FI^.LogFont.lfQuality := Draft_Quality;
NewFont := CreateFontIndirect(FI^.LogFont);
OldFont := aPtr^.SetFont(NewFont);
aPtr^.SetHeader1(FileName);
aPtr^.DoHeader;
StrCopy(szIndx,'');
for indx := 0 to (Records^.Count-1) do
begin
OutRecord := Records^.AT(indx);
if OutRecord^.Text <> nil then
StrCopy(Buf1,OutRecord^.Text)
else
StrCopy(Buf1,'');
Buf2 := Buf1;
if Format.ShowLineNum = 1 then
Str((indx+1):5,szIndx)
else
StrCopy(szIndx,'');
if (Format.UseCCB = 1) and (buf1 <> nil) then
begin
CCB := Buf1[0];
Buf2 := Buf1+1;
end
else
CCB := ' ';
if Buf1 <> nil then
begin
ExpandTabs(Buf2,ExpRec,Tabsize);
StrCat(StrCat(StrCopy(Buf1,szIndx),' '),ExpRec);
end
else
StrCopy(Buf1,szIndx);
case CCB of
'1': aPtr^.NewPage;
'0': aPtr^.PrintLine(' ');
'-': begin
aPtr^.PrintLine(' ');
aPtr^.PrintLine(' ');
end;
end;
aPtr^.printLine(Buf1);
end;
OldFont := aPtr^.SetFont(OldFont);
DeleteObject(NewFont);
aPtr^.Finish;
Dispose(aPtr,Done);
end; {end if}
FreeMem(Buf1,16000);
FreeMem(ExpRec,16000);
end;
{WMSysCommand}
procedure TPLXWindow.WMSysCommand(var Msg:TMessage);
begin
case Msg.Wparam of
idm_About:
Application^.ExecDialog(New(PDialog,Init(@Self,'PLX_About')));
idm_RunCP:
begin
WinExec('Control',1);
FontSelection := 9999; {Force a reselection of font}
PFontSize := 10;
Dispose(Faces,Done);
Dispose(Sizes,Done);
Faces := New(PFontCollection,Init(100,100));
Faces^.Duplicates := False;
Sizes := New(PCollection,Init(10,10)); {since this occurs asynchronously, }
end; {we'll force a reload of Faces & Sizes later}
else
DefWndProc(Msg);
end;
end;
{SetStaticText}
procedure TPLXWindow.SetStaticText;
var
I: Integer;
Buf:Array[0..80] of Char;
szLines:Array[0..5] of Char;
LPY:Integer;
FontMetrics:TTextMetric;
szBytes:Array[0..7] of Char;
nBytes:Integer;
begin {build text display}
StrCopy(Buf,'File: ');
St1^.SetText(StrCat(Buf,FileName));
Str(CharsInFile:5,szBytes);
Str(Records^.Count:5,szLines);
StrECopy(StrECopy(StrECopy(StrECopy(Buf,'# of Lines:'),szLines),' Bytes:'),szBytes);
St2^.SetText(Buf);
end;
{LoadBWin}
procedure TPLXWindow.LoadBWin;
var
InRecord:PTextObj;
Indx:Integer;
Buf1:pChar;
Cursor:hCursor;
CRLF :Array[0..2] of Char;
RCount:Integer;
begin
StrCopy(CRLF,#13#10#0);
RCount := Records^.Count;
if RCount > 0 then
begin
SetCursor(LoadCursor(0,Idc_Wait));
indx := 0;
BWin^.Clear;
GetMem(Buf1,27000);
StrCopy(Buf1,'');
while (indx < 100) AND (indx < RCount) AND (StrLen(Buf1) < 15000) do
begin
InRecord := Records^.At(indx);
If InRecord^.Text <> NIL then
StrCat(StrCat(Buf1,InRecord^.Text),CRLF)
else
StrCat(Buf1,CRLF) ;
Inc(indx,1);
end;
if (StrLen(Buf1) > 14999) or (Indx > 99) then
begin
StrCat(Buf1,CRLF);
StrCat(StrCat(Buf1,'... Rest of text not displayed!!!'),CRLF);
end;
BWin^.Insert(Buf1);
FreeMem(Buf1,27000);
BWin^.Scroll(0,-9999);
SetCursor(LoadCursor(0,Idc_Arrow));
SetStaticText;
end;
end;
{CMFOpen}
procedure TPLXWindow.CMFOpen(var Msg:TMessage);
begin
IDBut2(Msg);
end;
{CMFPrint}
procedure TPLXWindow.CMFPrint(var Msg:TMessage);
begin
IDBut1(Msg);
end;
{CMFSetup}
procedure TPLXWindow.CMFSetUp(var Msg:TMessage);
begin
IDBut3(Msg);
end;
{CMFExit}
procedure TPLXWindow.CMFExit(var Msg:TMessage);
begin
IDBut5(Msg);
end;
{CMTFont}
procedure TPLXWindow.CMTFont(var Msg:TMessage);
begin
IDBut4(Msg);
end;
procedure TPLXWindow.GetFormatFlags(var pFormat:PFormatRec);
begin
pFormat^.ShowRuler := Format.ShowRuler;
pFormat^.ShowFName := Format.ShowFName;
pFormat^.ShowDTStamp := Format.ShowDTStamp;
pFormat^.ShowPageNum := Format.ShowPageNum;
pFormat^.ShowLineNum := Format.ShowLineNum;
pFormat^.UseCCB := Format.UseCCB;
end;
procedure TPLXWindow.SetFormatFlags(NewFormat:FormatRec);
begin
Format.ShowRuler := NewFormat.ShowRuler;
Format.ShowFName := NewFormat.ShowFName;
Format.ShowDTStamp := NewFormat.ShowDTStamp;
Format.ShowPageNum := NewFormat.ShowPageNum;
Format.ShowLineNum := NewFormat.ShowLineNum;
Format.UseCCB := NewFormat.UseCCB;
end;
procedure TPLXWindow.GetMargins(var pMargins:PRect);
begin
pMargins^.Left := Margins.left;
pMargins^.Right := Margins.right;
pMargins^.Top := Margins.Top;
pMargins^.Bottom := Margins.Bottom;
end;
procedure TPLXWindow.SetMargins(NewMargins:TRect);
begin
Margins.left := NewMargins.left;
Margins.right := NewMargins.right;
Margins.top := NewMargins.top;
Margins.Bottom := NewMargins.bottom;
end;
function TPLXWindow.GetTabSize:Integer;
begin
GetTabSize := TabSize;
end;
procedure TPLXWindow.SetTabSize(NewTabSize:Integer);
begin
TabSize := NewTabSize;
end;
procedure TPLXWindow.GetProfileValues;
var
Buf1:Array[0..30] of Char;
Indx:Integer;
Item:PFontItem;
Found:Boolean;
begin
Format.ShowRuler := GetPrivateProfileInt('PLX','ShowRuler',1,'PLX.INI');
Format.ShowFName := GetPrivateProfileInt('PLX','ShowFName',1,'PLX.INI');
Format.ShowDTStamp := GetPrivateProfileInt('PLX','ShowDTStamp',1,'PLX.INI');
Format.ShowPageNum := GetPrivateProfileInt('PLX','ShowPageNum',1,'PLX.INI');
Format.ShowLineNum := GetPrivateProfileInt('PLX','ShowLineNum',1,'PLX.INI');
Format.UseCCB := GetPrivateProfileInt('PLX','UseCCB',0,'PLX.INI');
Margins.Left := GetPrivateProfileInt('PLX','MarginL',0,'PLX.INI');
Margins.Right := GetPrivateProfileInt('PLX','MarginR',0,'PLX.INI');
Margins.Top := GetPrivateProfileInt('PLX','MarginT',0,'PLX.INI');
Margins.Bottom := GetPrivateProfileInt('PLX','MarginB',0,'PLX.INI');
TabSize := GetPrivateProfileInt('PLX','TabSize',2,'PLX.INI');
GetPrivateProfileString('PLX','FaceName','9999',Buf1,SizeOf(Buf1),'PLX.INI');
PFontSize:= GetPrivateProfileInt('PLX','FontSize',8,'PLX.INI');
Found := False;
for Indx := 0 to Faces^.GetCount -1 do
begin
Item := Faces^.At(Indx);
If (StrIComp(Item^.LogFont.lfFaceName,Buf1) = 0) then
begin
FontSelection := Indx;
Found := True;
end
end;
end;
{***********************************************************************}
constructor TFontItem.Init(NewItem:TLogFont;NewType:Integer);
begin
LogFont := NewItem;
FontType := NewType;
end;
destructor TFontItem.Done;
begin
end;
{***********************************************************************}
function TFontCollection.KeyOf(Item:Pointer):Pointer;
var
Ptr :PChar;
begin
Ptr := PFontItem(Item)^.LogFont.lfFaceName;
KeyOf := Ptr;
end;
function TFontCollection.Compare(Key1,Key2:Pointer):Integer;
begin
Compare := StrIComp(PChar(Key1),PChar(Key2));
end;
function TFontCollection.GetCount:Integer;
begin
GetCount := Count;
end;
{*********************************************************************}
procedure TPLXDlg2.WMInitDialog(var Msg:TMessage);
var
Buf1:Array[0..5] of Char;
pBuf:PChar;
pMargins : PRect;
pFormat:pFormatRec;
begin
pMargins := @Margins;
PPLXWindow(Parent)^.GetMargins(pMargins);
pFormat := @Format;
PPLXWindow(Parent)^.GetFormatFlags(pFormat);
TabSize := PPLXWindow(Parent)^.GetTabSize;
SendDlgItemMsg(id_D2CB1,bm_SetCheck,Format.ShowRuler,0);
SendDlgItemMsg(id_D2CB2,bm_SetCheck,Format.ShowFName,0);
SendDlgItemMsg(id_D2CB3,bm_SetCheck,Format.ShowDTStamp,0);
SendDlgItemMsg(id_D2CB4,bm_SetCheck,Format.ShowPageNum,0);
SendDlgItemMsg(id_D2CB5,bm_SetCheck,Format.ShowLineNum,0);
SendDlgItemMsg(id_D2CB6,bm_SetCheck,Format.UseCCB,0);
pBuf := Buf1;
Str(Margins.Left/100:3:1,Buf1);
SendDlgItemMsg(id_D2EC1,wm_SetText,0,LongInt(pBuf));
Str(Margins.Right/100:3:1,Buf1);
SendDlgItemMsg(id_D2EC2,wm_SetText,0,LongInt(pBuf));
Str(Margins.Top/100:3:1,Buf1);
SendDlgItemMsg(id_D2EC3,wm_SetText,0,LongInt(pBuf));
Str(Margins.Bottom/100:3:1,Buf1);
SendDlgItemMsg(id_D2EC4,wm_SetText,0,LongInt(pBuf));
Str(TabSize,Buf1);
SendDlgItemMsg(id_D2EC5,wm_SetText,0,LongInt(pBuf));
end;
procedure TPLXDlg2.IDD2OK(var Msg:TMessage);
begin
PPLXWindow(Parent)^.SetMargins(Margins);
PPLXWindow(Parent)^.SetFormatFlags(Format);
PPLXWindow(Parent)^.SetTabSize(TabSize);
EndDlg(1);
end;
procedure TPLXDlg2.IDD2CB1(var Msg:TMessage);
begin
case Msg.lParamHi of
bn_Clicked:
begin
Format.ShowRuler := SendDlgItemMsg(id_D2CB1,bm_GetCheck,0,0);
Exit;
end;
end;
end;
procedure TPLXDlg2.IDD2CB2(var Msg:TMessage);
begin
case Msg.lParamHi of
bn_Clicked:
begin
Format.ShowFName := SendDlgItemMsg(id_D2CB2,bm_GetCheck,0,0);
Exit;
end;
end;
end;
procedure TPLXDlg2.IDD2CB3(var Msg:TMessage);
begin
case Msg.lParamHi of
bn_Clicked:
begin
Format.ShowDTStamp := SendDlgItemMsg(id_D2CB3,bm_GetCheck,0,0);
Exit;
end;
end;
end;
procedure TPLXDlg2.IDD2CB4(var Msg:TMessage);
begin
case Msg.lParamHi of
bn_Clicked:
begin
Format.ShowPageNum := SendDlgItemMsg(id_D2CB4,bm_GetCheck,0,0);
Exit;
end;
end;
end;
procedure TPLXDlg2.IDD2CB5(var Msg:TMessage);
begin
case Msg.lParamHi of
bn_Clicked:
begin
Format.ShowLineNum := SendDlgItemMsg(id_D2CB5,bm_GetCheck,0,0);
Exit;
end;
end;
end;
procedure TPLXDlg2.IDD2CB6(var Msg:TMessage);
begin
case Msg.lParamHi of
bn_Clicked:
begin
Format.UseCCB := SendDlgItemMsg(id_D2CB6,bm_GetCheck,0,0);
Exit;
end;
end;
end;
procedure TPLXDlg2.IDD2EC1(var Msg:TMessage);
var
Idx : Integer;
Buf:Array[0..5] of Char;
Ptr : PChar;
ErrCode:Integer;
Margin:Real;
return:Integer;
begin
case Msg.lParamHi of
en_KillFocus:
begin
Ptr := Buf;
Idx := 5;
Return := SendDlgItemMsg(id_D2EC1,wm_GetText,word(Idx),LongInt(Ptr));
val(Ptr,Margin,ErrCode);
Margins.Left := round(Margin * 100);
Exit;
end;
end;
end;
procedure TPLXDlg2.IDD2EC2(var Msg:TMessage);
var
Idx : Integer;
Buf:Array[0..5] of Char;
Ptr : PChar;
ErrCode:Integer;
Margin:Real;
return:Integer;
begin
case Msg.lParamHi of
en_KillFocus:
begin
Ptr := Buf;
Idx := 5;
Return := SendDlgItemMsg(id_D2EC2,wm_GetText,word(Idx),LongInt(Ptr));
val(Ptr,Margin,ErrCode);
Margins.Right := round(Margin * 100);
Exit;
end;
end;
end ;
procedure TPLXDlg2.IDD2EC3(var Msg:TMessage);
var
Idx : Integer;
Buf:Array[0..5] of Char;
Ptr : PChar;
ErrCode:Integer;
Margin:Real;
return:Integer;
begin
case Msg.lParamHi of
en_KillFocus:
begin
Ptr := Buf;
Idx := 5;
Return := SendDlgItemMsg(id_D2EC3,wm_GetText,word(Idx),LongInt(Ptr));
val(Ptr,Margin,ErrCode);
Margins.Top := round(Margin * 100);
Exit;
end;
end;
end;
procedure TPLXDlg2.IDD2EC4(var Msg:TMessage);
var
Idx : Integer;
Buf:Array[0..5] of Char;
Ptr : PChar;
ErrCode:Integer;
Margin:Real;
return:Integer;
begin
case Msg.lParamHi of
en_KillFocus:
begin
Ptr := Buf;
Idx := 5;
Return := SendDlgItemMsg(id_D2EC4,wm_GetText,word(Idx),LongInt(Ptr));
val(Ptr,Margin,ErrCode);
Margins.Bottom := round(Margin * 100);
Exit;
end;
end;
end;
procedure TPLXDlg2.IDD2EC5(var Msg:TMessage);
var
Idx : Integer;
Buf:Array[0..5] of Char;
Ptr : PChar;
ErrCode:Integer;
TSize:Integer;
return:Integer;
begin
case Msg.lParamHi of
en_KillFocus:
begin
Ptr := Buf;
Idx := 5;
Return := SendDlgItemMsg(id_D2EC5,wm_GetText,word(Idx),LongInt(Ptr));
val(Ptr,TSize,ErrCode);
TabSize := TSize;
Exit;
end;
end;
end;
{*********************************************************************}
procedure TPLXDlg3.WMInitDialog(var Msg:TMessage);
var
ThePrinter:pWOPrinter;
DeviceName:Array[0..40] of Char;
begin
TDialog.WMInitDialog(Msg);
ThePrinter := New(pWOPrinter,Init(hInstance,@Self));
ThePrinter^.GetPrinterParms;
ThePrinter^.DCCreated;
StrCopy(DeviceName,ThePrinter^.deviceName);
ThePrinter^.DeleteContext;
Dispose(ThePrinter,Done);
SetDlgItemText(HWindow,503,DeviceName);
end;
procedure TPLXDlg3.IDSetup(var Msg:TMessage);
var
ThePrinter:pWOPrinter;
begin
ThePrinter := New(pWOPrinter,Init(hInstance,@Self));
ThePrinter^.prnDeviceMode(hWindow);
dispose(ThePrinter,Done);
PPLXWindow(Parent)^.EnumerateFaces;
PPLXWindow(Parent)^.EnumerateSizes;
end;
procedure TPLXDlg3.IDOKPrt(var Msg:TMessage);
begin
EndDlg(1);
SendMessage(PPLXWindow(Parent)^.HWindow,wm_User+um_FilePrint,Msg.wParam,Msg.LParam);
end;
{***********************************************************************}
procedure TPLXDlg4.WMInitDialog(var Msg:TMessage);
var
Indx : Integer;
Font : PFontItem;
pTextItem:PChar;
begin
TDialog.WMInitDialog(Msg);
for indx := 0 to (Faces^.GetCount -1) do
begin
Font := Faces^.At(indx);
pTextItem := Font^.LogFont.lfFaceName;
SendDlgItemMsg(id_D4LB1,lb_AddString,word(0),LongInt(pTextItem));
end;
IF pPLXWindow(Parent)^.FontSelection <> 9999 then
SendDlgItemMsg(id_D4Lb1,lb_SetCurSel,
pPLXWindow(Parent)^.FontSelection,0);
end;
procedure TPLXDlg4.IDD4Lb1(var Msg:TMessage);
var
Idx : Integer;
Buf:Array[0..5] of Char;
Ptr : PChar;
ErrCode:Integer;
begin
case Msg.lParamHi of
lbn_SelChange,lbn_DblClk:
begin
Ptr := Buf;
Idx := SendDlgItemMsg(id_D4Lb1,lb_GetCurSel,0,0);
PPLXWindow(Parent)^.SetFontSelection(Idx);
loadsizes;
Exit;
end;
end;
end;
procedure TPLXDlg4.IDD4Lb2(var Msg:TMessage);
var
Idx : Integer;
Buf:Array[0..5] of Char;
Ptr : PChar;
ErrCode:Integer;
begin
case Msg.lParamHi of
lbn_SelChange,lbn_DblClk:
begin
Ptr := @Buf;
Idx := SendDlgItemMsg(id_D4Lb2,lb_GetCurSel,0,0);
SendDlgItemMsg(id_D4Lb2,lb_GetText,Idx,LongInt(Ptr));
val(Ptr,FontSize,ErrCode);
PPLXWindow(Parent)^.SetFontSize(FontSize);
EndDlg(Idx);
Exit;
end;
end;
end;
procedure TPLXDlg4.LoadSizes;
var
pTextItem:PChar;
Buf:Array[0..5] of Char;
Indx:Integer;
FontItem:PFontItem;
Item:PIntObj;
PStk :PStack;
Indx2:Integer;
Res,Res2:Integer;
Height:Integer;
LPY:Integer;
begin
LPY := PPLXWindow(Parent)^.GetLogPixY;
FontItem := Faces^.At(PPLXWindow(Parent)^.GetFontSelection);
PStk := Sizes^.At(PPLXWindow(Parent)^.GetFontSelection);
Indx2 := 0;
Indx := 6;
pTextItem := Buf;
Res := FontItem^.FontType and Raster_FontType; {0 = vector font}
Res2 := FontItem^.FontType and Device_FontType; {0 = GDI font}
SendDlgItemMsg(id_D4Lb2,lb_ResetContent,word(0),LongInt(pTextItem));
if Res = 0 then
begin
Str(Indx:3,Buf);
while Indx < 20 do
begin
SendDlgItemMsg(id_D4Lb2,lb_AddString,word(0),LongInt(pTextItem));
Indx := Indx + 2;
Str(Indx:3,Buf);
end;
end
else
for Indx2 := 0 to PStk^.Count-1 do
begin
Item := PStk^.At(Indx2);
Height := Item^.Int;
Str(Round(Height * 72 / LPY):3,Buf);
SendDlgItemMsg(id_D4Lb2,lb_AddString,word(0),LongInt(pTextItem));
end;
end;
{***********************************************************************}
function tPLXPrinter.DoHeader:Boolean;
var
indx : Integer;
FI : PFontItem;
szSize:Array[0..7] of Char;
LogFont:TLogFont;
TM:TTextMetric;
Buf1:Array[0..100] of Char;
szDateTime:Array[0..79] of Char;
szPageNumber:Array[0..5] of Char;
Ruler : Array[0..210] of Char;
Format:FormatRec;
pFormat:pFormatRec;
begin
pFormat :=@Format;
PPLXWindow(Application^.MainWindow)^.GetFormatFlags(pFormat);
if Format.ShowLineNum = 1 then
StrCopy(Ruler,' ')
else
StrCopy(Ruler,'');
StrCat(Ruler,' |...+....1....+....2....+....3....+....4....+....5');
StrCat(Ruler,'....+....6....+....7....+....8....+....9....+....0');
StrCat(Ruler,'....+....1....+....2....+....3....+....4....+....5');
StrCat(Ruler,'....+....6....+....7....+....8....+....9....+....0');
GetTextMetrics(hPrintDC,TM);
ResetPos;
StrCopy(Buf1,'');
GetDateTime(szDateTime);
if Format.ShowFName <> 0 then
StrCopy(Buf1,HeadLine1);
if Format.ShowDTStamp <> 0 then
StrCat(StrCat(Buf1,' '),szDateTime);
Str(PageNumber:3,szPageNumber);
if Format.ShowPageNum <> 0 then
StrCat(StrCat(Buf1,' page:'),szPageNumber);
if StrLen(Buf1) <> 0 then
print(Buf1);
SetMarginL(Margin.left); {Set margin = 0 inch}
NewLine;
if Format.ShowRuler <> 0 then
PrintLine(Ruler);
end;
function tPLXPrinter.SetHeader1(NewHeadLine1:PChar):Boolean;
begin
StrCopy(HeadLine1,NewHeadLine1);
SetHeader1 := True;
end;
{*********************************************************************}
{*** M A I N L I N E }
{*********************************************************************}
var
PLXApp : TPLXApplication;
begin
PLXApp.Init('Font Preview');
PLXApp.Run;
PLXApp.Done;
end.