Contributor: BRAD STOWERS
{ NOTE DCR AND DEMO located at the END of this unit }
{-----------------------------------------------------------------------------}
{ A component to wrap the Win95 PageSetupDlg common dialog API function. }
{ Borland seems to have forgotten this new common dialog in Delphi 2.0. }
{ Copyright 1996, Brad Stowers. All Rights Reserved. }
{ This component can be freely used and distributed in commercial and private }
{ environments, provided this notice is not modified in any way and there is }
{ no charge for it other than nominal handling fees. Contact me directly for }
{ modifications to this agreement. }
{-----------------------------------------------------------------------------}
{ Feel free to contact me if you have any questions, comments or suggestions }
{ at bstowers@pobox.com or 72733,3374 on CompuServe. }
{ The lateset version will always be available on the web at: }
{ http://www.pobox.com/~bstowers/delphi/ }
{-----------------------------------------------------------------------------}
{ Date last modified: 08/27/96 }
{-----------------------------------------------------------------------------}
{ ----------------------------------------------------------------------------}
{ TPageSetupDialog v1.00 }
{ ----------------------------------------------------------------------------}
{ Description: }
{ A component to wrap the PageSetupDlg API function that Borland forgot. }
{ It is a common dialog available on the Win95 platform, so it can not be }
{ used with Delphi 1.0. }
{ ----------------------------------------------------------------------------}
{ Revision History: }
{ 1.00: + Initial release. }
{ ----------------------------------------------------------------------------}
unit PgSetup;
interface
{$IFNDEF WIN32}
 ERROR! This unit only available for Delphi 2.0!!!
{$ENDIF}
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 CommDlg, DsgnIntf;
type
 TPageSetupOption = (
 poDefaultMinMargins, poDisableMargins, poDisableOrientation,
 poDisablePagePainting, poDisablePaper, poDisablePrinter, poNoWarning, poShowHelp
 );
 TPageSetupOptions = set of TPageSetupOption;
 TPSPaperType = (ptPaper, ptEnvelope);
 TPSPaperOrientation = (poPortrait, poLandscape);
 TPSPrinterType = (ptDotMatrix, ptHPPCL);
 TPSPaintWhat = (pwFullPage, pwMinimumMargins, pwMargins,
 pwGreekText, pwEnvStamp, pwYAFullPage);
 TPSMeasurements = (pmMillimeters, pmInches);
 TPSPrinterEvent = procedure(Sender: TObject; Wnd: HWND) of object;
 { PPSDlgData is simply redeclared as PPageSetupDlg (COMMDLG.PAS) to prevent compile }
 { errors in units that have this event. They won't compile unless you add CommDlg }
 { to their units. This circumvents the problem. }
 PPSDlgData = ^TPSDlgData;
 TPSDlgData = TPageSetupDlg;
 { PaperSize: See DEVMODE help topic, dmPaperSize member. DMPAPER_* constants. }
 TPSInitPaintPageEvent = function(Sender: TObject; PaperSize: short;
 PaperType: TPSPaperType; PaperOrientation: TPSPaperOrientation;
 PrinterType: TPSPrinterType; pSetupData: PPSDlgData): boolean of object;
 TPSPaintPageEvent = function(Sender: TObject; PaintWhat: TPSPaintWhat;
 Canvas: TCanvas; Rect: TRect): boolean of object;
 TPageSetupDialog = class(TCommonDialog)
 private
 FOptions: TPageSetupOptions;
 FCustomData: LPARAM;
 FPaperSize: TPoint;
 FMinimumMargins: TRect;
 FMargins: TRect;
 FMeasurements: TPSMeasurements;
 FOnPrinter: TPSPrinterEvent;
 FOnInitPaintPage: TPSInitPaintPageEvent;
 FOnPaintPage: TPSPaintPageEvent;
 function DoPrinter(Wnd: HWND): boolean;
 function DoExecute(Func: pointer): boolean;
 protected
 function Printer(Wnd: HWND): boolean; virtual;
 public
 constructor Create(AOwner: TComponent); override;
 destructor Destroy; override;
 function Execute: boolean; virtual;
 { It is the user's responsibility to clean up this pointer if necessary. }
 property CustomData: LPARAM
 read FCustomData
 write FCustomData;
 { These should be published, but need Property Editors for TPoint and TRect. As }
 { best I can tell, there is no way to do that, since they need RTTI, and that is }
 { not available for record types. Bummer. }
 { Also, all of these rects return sizes that need to be divided by 1000. For }
 { example, PaperSize.X would be 8500 for 8.5 inch paper. Maybe I should make a }
 { TSingleRect and TSinglePoint and return the actual single value, but the API }
 { returns them to me that way, and I'm lazy by default. :) }
 property PaperSize: TPoint
 read FPaperSize
 write FPaperSize;
 property MinimumMargins: TRect
 read FMinimumMargins
 write FMinimumMargins;
 property Margins: TRect
 read FMargins
 write FMargins;
 published
 property Options: TPageSetupOptions
 read FOptions
 write FOptions
 default [poDefaultMinMargins, poShowHelp];
 property Measurements: TPSMeasurements
 read FMeasurements
 write FMeasurements
 default pmInches;
 { Events }
 property OnPrinter: TPSPrinterEvent
 read FOnPrinter
 write FOnPrinter;
 property OnInitPaintPage: TPSInitPaintPageEvent
 read FOnInitPaintPage
 write FOnInitPaintPage;
 property OnPaintPage: TPSPaintPageEvent
 read FOnPaintPage
 write FOnPaintPage;
 end;
procedure Register;
implementation
uses Printers;
const
 IDPRINTERBTN = 0402ドル;
{ Private globals }
var
 HelpMsg: Integer;
 HookCtl3D: boolean;
{ Center the given window on the screen }
procedure CenterWindow(Wnd: HWnd);
var
 Rect: TRect;
begin
 GetWindowRect(Wnd, Rect);
 SetWindowPos(Wnd, 0,
 (GetSystemMetrics(SM_CXSCREEN) - Rect.Right + Rect.Left) div 2,
 (GetSystemMetrics(SM_CYSCREEN) - Rect.Bottom + Rect.Top) div 3,
 0, 0, SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOZORDER);
end;
{ Generic dialog hook. Centers the dialog on the screen in response to
 the WM_INITDIALOG message }
function DialogHook(Wnd: HWnd; Msg: UINT; WParam: WPARAM; LParam: LPARAM): UINT; stdcall;
begin
 Result := 0;
 case Msg of
 WM_INITDIALOG:
 begin
 if HookCtl3D then
 begin
 Subclass3DDlg(Wnd, CTL3D_ALL);
 SetAutoSubClass(True);
 end;
 CenterWindow(Wnd);
 Result := 1;
 end;
 WM_DESTROY:
 if HookCtl3D then SetAutoSubClass(False);
 end;
end;
var
 PageSetupDialog: TPageSetupDialog;
function PageSetupDialogHook(Wnd: HWnd; Msg: UINT; WParam: WPARAM;
 LParam: LPARAM): UINT; stdcall;
const
 PagePaintWhat: array[WM_PSD_FULLPAGERECT..
 WM_PSD_YAFULLPAGERECT] of TPSPaintWhat = (
 pwFullPage, pwMinimumMargins, pwMargins,
 pwGreekText, pwEnvStamp, pwYAFullPage
 );
 PRINTER_MASK = 00000002ドル;
 ORIENT_MASK = 00000004ドル;
 PAPER_MASK = 00000008ドル;
var
 PaperData: word;
 Paper: TPSPaperType;
 Orient: TPSPaperOrientation;
 Printer: TPSPrinterType;
 PaintRect: TRect;
 PaintCanvas: TCanvas;
begin
 if (Msg = WM_COMMAND) and (LongRec(WParam).Lo = IDPRINTERBTN) and
 (LongRec(WParam).Hi = BN_CLICKED) then begin
 // if hander is assigned, use it. If not, let system do it.
 Result := ord(PageSetupDialog.DoPrinter(Wnd));
 end else begin
 if assigned(PageSetupDialog.FOnInitPaintPage) and
 assigned(PageSetupDialog.FOnPaintPage) then begin
 case Msg of
 WM_PSD_PAGESETUPDLG:
 begin
 PaperData := HiWord(WParam);
 if (PaperData AND PAPER_MASK> 0) then
 Paper := ptEnvelope
 else
 Paper := ptPaper;
 if (PaperData AND ORIENT_MASK> 0) then
 Orient := poPortrait
 else
 Orient := poLandscape;
 if (PaperData AND PAPER_MASK> 0) then
 Printer := ptHPPCL
 else
 Printer := ptDotMatrix;
 Result := Ord(PageSetupDialog.FOnInitPaintPage(PageSetupDialog,
 LoWord(WParam), Paper, Orient, Printer, PPSDlgData(LParam)));
 end;
 WM_PSD_FULLPAGERECT,
 WM_PSD_MINMARGINRECT,
 WM_PSD_MARGINRECT,
 WM_PSD_GREEKTEXTRECT,
 WM_PSD_ENVSTAMPRECT,
 WM_PSD_YAFULLPAGERECT:
 begin
 if LParam  0 then
 PaintRect := PRect(LParam)^
 else
 PaintRect := Rect(0,0,0,0);
 PaintCanvas := TCanvas.Create;
 PaintCanvas.Handle := HDC(WParam);
 try
 Result := Ord(PageSetupDialog.FOnPaintPage(PageSetupDialog,
 PagePaintWhat[Msg], PaintCanvas, PaintRect));
 finally
 PaintCanvas.Free; { This better not be deleting the DC! }
 end;
 end;
 else
 Result := DialogHook(Wnd, Msg, wParam, lParam);
 end;
 end else
 Result := DialogHook(Wnd, Msg, wParam, lParam);
 end;
end;
constructor TPageSetupDialog.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FOptions := [poDefaultMinMargins, poShowHelp];
 FOnPrinter := NIL;
 FOnInitPaintPage := NIL;
 FOnPaintPage := NIL;
 FCustomData := 0;
 FPaperSize := Point(0,0);
 FMinimumMargins := Rect(0,0,0,0);
 FMargins := Rect(1000,1000,1000,1000);
 FMeasurements := pmInches;
end;
destructor TPageSetupDialog.Destroy;
begin
 inherited Destroy;
end;
procedure GetPrinter(var DeviceMode, DeviceNames: THandle);
var
 Device, Driver, Port: array[0..79] of char;
 DevNames: PDevNames;
 Offset: PChar;
begin
 Printer.GetPrinter(Device, Driver, Port, DeviceMode);
 if DeviceMode  0 then
 begin
 DeviceNames := GlobalAlloc(GHND, SizeOf(TDevNames) +
 StrLen(Device) + StrLen(Driver) + StrLen(Port) + 3);
 DevNames := PDevNames(GlobalLock(DeviceNames));
 try
 Offset := PChar(DevNames) + SizeOf(TDevnames);
 with DevNames^ do
 begin
 wDriverOffset := Longint(Offset) - Longint(DevNames);
 Offset := StrECopy(Offset, Driver) + 1;
 wDeviceOffset := Longint(Offset) - Longint(DevNames);
 Offset := StrECopy(Offset, Device) + 1;
 wOutputOffset := Longint(Offset) - Longint(DevNames);;
 StrCopy(Offset, Port);
 end;
 finally
 GlobalUnlock(DeviceNames);
 end;
 end;
end;
procedure SetPrinter(DeviceMode, DeviceNames: THandle);
var
 DevNames: PDevNames;
begin
 DevNames := PDevNames(GlobalLock(DeviceNames));
 try
 with DevNames^ do
 Printer.SetPrinter(PChar(DevNames) + wDeviceOffset,
 PChar(DevNames) + wDriverOffset,
 PChar(DevNames) + wOutputOffset, DeviceMode);
 finally
 GlobalUnlock(DeviceNames);
 GlobalFree(DeviceNames);
 end;
end;
function CopyData(Handle: THandle): THandle;
var
 Src, Dest: PChar;
 Size: Integer;
begin
 if Handle  0 then
 begin
 Size := GlobalSize(Handle);
 Result := GlobalAlloc(GHND, Size);
 if Result  0 then
 try
 Src := GlobalLock(Handle);
 Dest := GlobalLock(Result);
 if (Src  nil) and (Dest  nil) then Move(Src^, Dest^, Size);
 finally
 GlobalUnlock(Handle);
 GlobalUnlock(Result);
 end
 end
 else Result := 0;
end;
function TPageSetupDialog.DoExecute(Func: pointer): boolean;
const
 PageSetupOptions: array [TPageSetupOption] of DWORD = (
 PSD_DEFAULTMINMARGINS, PSD_DISABLEMARGINS, PSD_DISABLEORIENTATION,
 PSD_DISABLEPAGEPAINTING, PSD_DISABLEPAPER, PSD_DISABLEPRINTER,
 PSD_NOWARNING, PSD_SHOWHELP
 );
 PageSetupMeasurements: array [TPSMeasurements] of DWORD = (
 PSD_INHUNDREDTHSOFMILLIMETERS, PSD_INTHOUSANDTHSOFINCHES
 );
var
 Option: TPageSetupOption;
 PageSetup: TPageSetupDlg;
 SavePageSetupDialog: TPageSetupDialog;
 DevHandle: THandle;
begin
 FillChar(PageSetup, SizeOf(PageSetup), 0);
 with PageSetup do
 try
 lStructSize := SizeOf(TPageSetupDlg);
 hInstance := System.HInstance;
 Flags := PSD_MARGINS;
 if assigned(FOnPrinter) or assigned(FOnInitPaintPage) or assigned(FOnPaintPage) then begin
 Flags := Flags or PSD_ENABLEPAGESETUPHOOK;
 lpfnPageSetupHook := PageSetupDialogHook;
 end;
 for Option := Low(Option) to High(Option) do
 if Option in FOptions then
 Flags := Flags OR PageSetupOptions[Option];
 Flags := Flags OR PageSetupMeasurements[FMeasurements];
{ if not assigned(FOnPrinter) then
 Flags := Flags OR PSD_DISABLEPRINTER;}
 if assigned(FOnInitPaintPage) and assigned(FOnPaintPage) then begin
 Flags := Flags OR PSD_ENABLEPAGEPAINTHOOK;
 lpfnPagePaintHook := PageSetupDialogHook;
 end;
 hWndOwner := Application.Handle;
 GetPrinter(DevHandle, hDevNames);
 hDevMode := CopyData(DevHandle);
 HookCtl3D := Ctl3D;
 lCustData := FCustomData;
 ptPaperSize := FPaperSize;
 rtMinMargin := FMinimumMargins;
 rtMargin := FMargins;
 SavePageSetupDialog := PageSetupDialog;
 PageSetupDialog := Self;
 Result := TaskModalDialog(Func, PageSetup);
 PageSetupDialog := SavePageSetupDialog;
 if Result then begin
 FPaperSize := ptPaperSize;
 FMinimumMargins := rtMinMargin;
 FMargins := rtMargin;
 SetPrinter(hDevMode, hDevNames);
 end else begin
 if hDevMode  0 then GlobalFree(hDevMode);
 if hDevNames  0 then GlobalFree(hDevNames);
 end;
 finally
 { Nothing yet }
 end;
end;
function TPageSetupDialog.Execute: boolean;
begin
 Result := DoExecute(@PageSetupDlg);
end;
function TPageSetupDialog.Printer(Wnd: HWND): boolean;
begin
 Result := assigned(FOnPrinter);
 if Result then
 FOnPrinter(Self, Wnd);
end;
function TPageSetupDialog.DoPrinter(Wnd: HWND): boolean;
begin
 try
 Result := Printer(Wnd);
 except
 Result := FALSE;
 Application.HandleException(Self);
 end;
end;
procedure Register;
begin
 { You may prefer it on the Dialogs page, I like it on Win95 because it is }
 { only available on Win95. }
 RegisterComponents('Win95', [TPageSetupDialog]);
end;
{ Initialization and cleanup }
procedure InitGlobals;
begin
 HelpMsg := RegisterWindowMessage(HelpMsgString);
end;
initialization
 InitGlobals;
finalization
 { Nothing }
end.
{ the following contains additional files that should be included with this
 file. To extract, you need XX3402 available with the SWAG distribution.
 1. Cut the text below out, and save to a file .. filename.xx
 2. Use XX3402 : xx3402 d filename.xx
 3. The decoded file should be created in the same directory.
 4. If the file is a archive file, use the proper archive program to
 extract the members.
{ ------------------ CUT ----------------------}
*XX3402-000488-130396--72--85-52265-----PGSETUP.DCR--1-OF--1
+++++0++++1zzk++zzw+++++++++++++++++++++++06+E++E++++Dzz+U-I+3++EE-5+2I+
Ik-3+3E+JE-E+2E+GE--+2k+Hk-5++++++++++++2-+7-+++++++++++8++++-U++++M++++
+E+2+++++++U+E+++++++++++++++++++++++++++++++6+++6++++0+U+0+++++U+0++60+
++1+kA++U60+++++zk++zk+++Dzz+Dw+++1z+Dw+zzw++Dzzzk+nAnAnAnAnAnAnAnAnAnAn
AnAnAnAnAnAnA++++++++++++nAnADzzzzzzzzzz+nAnADzzzzzzzzzz+nAnADzzzzzzzzzz
+nAnADzzzzzzzzzz+nAnADzzzzzk++zz+nAnADzzzzxivi1z+nAnADU+++1a++Xz+nAnAD-i
PivUyDzz+nAnADU+++1a++Xz+nAnADzzzzVivi1z+nAnADzzzzy+++Xz+nAnADzzzzzzzzzz
+nAnADzzzzzzzzzz+nAnADzzzzzzw++++nAnADzzzzzzwDTr+nAnADzzzzzzw5xkAnAnADzz
zzzzwDQ1AnAnADzzzzzzw5+nAnAnA+++++++++AnAnAnAnAnAnAnAnAnAnAnAnAnAnAnAnAn
AnA+
***** END OF BLOCK 1 *****
*XX3402-002427-270896--72--85-39530--------DEMO.ZIP--1-OF--1
I2g1--E++++6+5lq4m28GpP-V++++9c++++6++++N4JhPmtYQ56f8AdD9ofAJIV7nQqrtiLW
tGchHWratJ7EQAgjmWrK+P30wn791-ImwlHIkGmxUgFWRMJeY9lV9JV9hIeEUdNSY4hk9MWL
Z7eSaETGtpVEY7CNb3WGaNybtkbIaNaMYpaJOcoitJmIaZWG0X7C6kFge+vMPYBB17J-dLZ+
gRGw31qEDE-EGkA23+++++U+UrMP6HdGJDQt+U++rkE+++Y+++-JPaZoAGtYNaq3YwyCon+E
lhpY2uRBmpM06F+QQZdl+PIfEBexhJqeLR4GW2Gel+arxPMKWFotvZ7s4cuw1Gz+UGAGNwvU
C5yOde0xK7fAn4wyTz5wOM3Uv9uRxY4jyyo6UA+PxwlUn5XIBxFtBA5LEjzJo+AKusyona+V
m+oSAGcs0m2QPcFUh4wD4JxWvchD6MPKD9YU84EfC28l66mOxnmokXsKanV9C-QsMipFG1+J
ZtWgpY8zqv0nS2OKMeqzOvH4QgOn2EgNVyp3C0BomHs4S0hgZQXOhBxB3Pp-2HMvIxzl2IoQ
5rBmbTIfFHOkD7OEJ+ew2nBzkH4a6nY9wst5hXVADAmju48hjKyZ2r7q-tX--AplO8cngo9f
dYtcZsPGePooWy9mgfO5MgkRbrn4tq+TQJd-u1z-zlZhZuRSc1GcEttLROlnFb16u2s77R2a
QeO6fkVBudkLJH3T0n3D1Y3K3H12Bl8UnhkEc6HYzT953M+nMl0G3MI40aK-sOyZ9P+xHsNA
DdZcEWUi-HKJNOZX4H9SwpUj7NIBRgKTGgjCorzoh8ETyIqeIr65xSyUO5Ze1HO0dKcgOmPT
xMmXi3ZWs04XRCxq0+mmXGYK7uDoZ77ifjppkLWsSpAbuEMtOcKg+ArRRBgo+3oeZqPl+PNn
b6cCdaHDHjw-PVhXj1fN2f2Po8UDCAo5R6DOFVzLseN9DIvG1MDrOubwyv39fmUF5d7FKU2T
pyfqgfPYZNIDugEWYxrnGrND0k1k3p-9+kEI++++0+-pRVgVfDRcut+3++1x2U++0E+++3Ji
OLEl9b-VQxpMrKwPBklz1t1zURU554ySaqHPEqDocL5G9ZW04949h+Xu6BzlP0ouuG1dsbV3
zzSFiUyTnwuGTakMNVExWG6dwYS8Z77fuS2BzLQkqBrNrN5Ocop2V1n75PfR5M-feKCnQ1qs
ECT214YoLfcrLWcO1NJkXYajfQXaAa8GoRsOLblZP2eT2maIaPYS8ljvSCUh9tvSyr7oUHeb
nqUqFdxbB91-1VRAWclqbWJN4Qb+0yXosmHh17UskLhT2TqxvkEFjwkk97uwifWoYvQHKhsX
eyvEycZVDQ56MgcOiV1YG66L1sUxMfTqkfH90k+XwXnMJrVn-7AKNJ1k5STS4rp+uwJcXLnM
7dy98Gda1cAawL+PwNRhl3xPl4Cw8rG4kO+mDoAvZbxWWzbGGhFSS4ZoOyJ0uUhVNp8vxg7K
OaNBV53igL7pe4FoinR45OAZrgjd5lXtvUDQ-rz9bSEuMUjPEHWXl-o7GVOahsJ9qHLLluZE
WjU5-L30WQ8-5BSnRO3pQ2eq-b3EdSd8oKdSewc8WsILFn+OXIzIXATR6nUqFe5EXnXt3+S7
srciT4ZYCFj+ICUvkM2e-UCs6X4OwaRXzpJ6qUMIDapg1xQuDc6nKdiV9I8JKLYbD-M8Dn+u
D6IMuHnN+7a1Xs2lbp9+SIF8ky4v2vMutNmvsJjId1FHa3OEAyL1RpTkEtwCxwSeHA3sfgUe
8YlnJCfZu0l6viugT0cIxVz9nGZGOfAREqIQVv+mvk3B1yRhfIYaPI1vdzQMtMG9buC4af4F
eTqVm26i59o6W+WzpvaKgNxHOTfydwDyMT6BgTy4QXPr8p8bJqI2zqvOiuuojsJbQ90zjxzP
g4n3wuvYSRwhOmD+Ed6-PEYe2n9Bov6cE4ke4pPpMtgrttXsdXBL9JSyDTXtluMr1zsu2tAp
3FoPWYju20UDz4vqUXq3lxoSv-Lap5DScs8grC07u4n0wYxXwXI+iKb+oMAa42z1shYnOjFt
YZ040kyFGSa67dMs8SAVmeqZswn3Uih86Q4bd7Xr4kKKfAvAm3Vj-RpHy9VIhXSMaZ-q8iNC
kMX8sKAWto959e92vuneILLguu7QbjdDPY0Tr5myIiBtEhCd0kx3uuJGY347Hd2jLVElqYVe
W2a4efS9f7l8DEjVmxWKTWZrFPhM1RvaJAoAS8eyUGYCw-HVLm+g-AIvBffXWm4llUO2LY7g
lM6oxo1qgJ980WtpXGjEBMNY3d7oOyCdM272G47A0a7MaflMAZchMMMS-2mJo9RP1Io27EFj
HkfAMaoL6esoClAIFo650o5ucCU8LOtwC9AjnwSbHoyIlt9YGlhs5QhB0s4wQ9XO+olG5x67
6IrMGhgA8mLDsZKi37hvJ-qSQcBJuGUguVzPrArvEuCAtIoXxEsNqQ48ARF3BfVF--g8S2Lc
aQ7EUYBt8GhCJJuuhP68vBdugXjVd0KTJfZNyP1SaReShAkMcKtuwRcWug3zn3i2BDU0hh7G
izctDZtVjCYVwsnxIW5nNCv2y0SUQ1qL5jwp24fjMH35mU+by6N6hMTSUR83wuffFCN+rj6P
vzyDnRUH2+2RG4Vrd+SiAVau4chHTFRsDUq8MtLXZq-FQorRq0Wt-RQBnBPFzye6hNjwlhry
Qlx+BNvZLoecuytp7bB8mXap8cKqO1gix-PeByMCfNIl7n9JtPb6AhGCfrbEjiRp3jlIs-75
nlp9JmTYjvc2EaYRHAC1d+xkZf1yvKecur693H2pnxccnVN7O92qhrESou8XSb49qxLk0fIJ
4kcjWwPGNIcgenh0NJA+QPi8+ZcGReUGgXf+FDw036mDFE7fKRkLbXzzTfiKgitvaK8zosDI
byYYr8Od3TTU7dpSzjuy-zjRFfHdqmxSVrw-I2g-+VE93+++++U+T5MP6Ed9Jg42++++iU++
++U++++++++++E+U+9O-+++++4FZPKwiN5-mI2g-+VE93+++++U+UrMP6HdGJDQt+U++rkE+
++Y++++++++++E+U+9O-eU+++3JiOLEl9aFaPJ-9+E6I0lE++++6+5Jq4m4gxqXfY+I++DoG
+++7++++++++++2+6+0qUEc1++-JPaZoAGtkMLBEGkI4++++++A++k0Y++++kEU+++++
***** END OF BLOCK 1 *****


AltStyle によって変換されたページ (->オリジナル) /