我们不需要纸了么?

如今科技越来越发达,纸对人们来说似乎已经不再是必需品,在一些高科技的领域更是如此,比如软件的开发和设计。我们先来看一个简单有趣的小视频。


男主一次次地向妻子炫耀高科技,最后被妻子用高科技堵在了门口。

虽然这只是国外的一个小广告,不过还是对我们有很多的启发。在软件开发的原型设计中,我们不需要纸了么?

不,我们仍然需要纸。为什么?

首先,速度快。

建立一个纸质原型,对于大多数人来说都是可以快速完成的。在同样的时间中,从制作原型的数量上看,我们可以轻易的得出一个结论那就是:Axure < Justinmind < Mockplus < 纸质原型。面对纸和笔,你几乎不需要任何的学习成本,也可以不受电脑硬件的限制,从容自如地画原型。

修改和重建一个纸质原型亦是如此,在《熊先生做原型之初级原型设计流程》中就曾提到过这一点,演示 -> 讨论 -> 修改 -> 演示是一个无限循环。在初期的设计中,媒介越简单,修改就越容易,而最简单的工具就是纸笔。你甚至可以在方案被否定的时候毫无犹豫地扔掉手中的纸质原型,因为它们的成本是极低的,无论是时间还是精力,花费都是很有限的。

其次,视角广。

产品设计的初级阶段几乎是不需要考虑细节,而这种奔放的姿态也只能是靠纸笔来实现了。当你使用软件工具的时候,无论是什么工具,你总会有意无意地去修改那些细节。即使是极力克制自己,你还是不能在讨论的过程中控制你的同事。所以,与其控制自己控制他们,不如抛开其它的工具,做一个“没有”细节的设计。


那么,如何去做好一个纸质原型?

1. 准备工具

纸质原型用到的工具很少很简单,但并不意味着你什么都不需要。首先,纸笔必须到位。不需要多精致或者多贵重,但是必须实用方便。然后一定要记得带上你最重要的工具,就是你的脑子,那个能凭空创造出来无限可能的脑子。无论是设计还是其它的工作,请保持头脑清醒。

与设计的其他阶段不同,在纸质原型设计中,头脑风暴的时间可能会更多,因为这个本身这就是一个创造无限可能的阶段。如果在设计的最初阶段,就把思维锁定了,那么这次的产品设计将注定是没有亮点和新意的。

2. 建立规则

奔放地构思不是杂乱无章地罗列。你和你的小伙伴们至少应该有这样一个共识:一张纸用来表示什么?一种状态?一个页面?还是一次交互?当你想到一个点子的时候,你是要在这张纸上添加?还是用另外一张纸来表示?

这看上去似乎与之前说的放开手脚相悖,其实不然。无规矩不成方圆。一旦事情陷入混乱,即便是时间成本很低的纸质原型,也很难从头完整地复制下你所有的想法。而且,作为一个有素养的优秀团队,合理的规则标准是必不可少的。


虽然纸质原型也存在这一些弊端,比如精度极低、相对不易保存,但是作为软件开发、原型设计的初级阶段,仍然必不可少。也许有一天,更先进的工具代替了这个过程,但我相信纸质原型的核心理念,对于创新和创造的追求永远不会从开发和设计中消失。

<think>我们正在处理一个关于Delphi设置打印机默认盒的问题。根据用户的需求,我们需要在Delphi中设置打印机的默认盒。参考引用[1]中提到了通过修改打印服务器属性来定义张格式,但用户需要的是设置默认盒(即张来源)。在Delphi中,我们可以使用TPrinter对象来操作打印机设置。具体来说,可以通过设置Printer.PrinterIndex选择打印机,然后通过Printer.GetPrinter获取打印机信息,再修改TDeviceMode结构中的dmDefaultSource字段(表示默认张来源)并应用。步骤:1.获取打印机的设备句柄和DEVMODE结构。2.修改DEVMODE中的dmDefaultSource字段(盒代码)。3.应用修改后的DEVMODE。4.注意:盒代码因打印机同而同,需要查询打印机手册或使用常量(如DMBIN_UPPER表示上层盒)。由于设置默认盒通常需要管理员权限,并且可能影响所有应用程序,所以通常建议在打印作业的DEVMODE中设置,而是修改默认设置(修改默认设置可能需要调用WinAPI的SetPrinter函数)。但是,用户要求设置默认盒,我们可以尝试通过以下两种方式:方式一:在打印前为当前打印作业设置张来源(只影响本次打印)。方式二:修改打印机的默认设置(影响所有应用程序,需要管理员权限)。由于用户没有明确是本次作业还是永久设置,这里我们分别给出两种方法的示例。方法一:设置当前打印作业的张来源(使用TPrinter)我们可以通过修改Printer的打印作业的DEVMODE来设置张来源。方法二:修改打印机的默认设置(使用WinAPISetPrinter)由于方法二需要较高的权限且操作复杂,我们首先给出方法一的示例。方法一示例代码(设置当前打印作业):注意:在打印之前设置张来源。方法二:修改打印机默认设置(使用SetPrinter)此方法更复杂,需要获取打印机的句柄,然后更新打印机的DEVMODE。由于用户问题中提到了“默认盒”,我们理解为修改打印机的默认设置。因此,我们将重点放在方法二上。步骤:1.打开打印机(获取打印机句柄)。2.获取当前打印机的DEVMODE(通过GetPrinter函数)。3.修改DEVMODE中的dmDefaultSource字段。4.设置dmFields包含DM_DEFAULTSOURCE标志。5.调用SetPrinter函数更新打印机的默认设置。注意:dmDefaultSource的取值可以参考Windows单元中的常量,例如:DMBIN_UPPER=1;//上层盒DMBIN_LOWER =2;//下层盒...(其他盒常量)具体代码实现如下(需要Windows单元和Printers单元):```usesWinSpool,Windows,Printers; procedureSetPrinterDefaultBin(Bin:Integer);varhPrinter:THandle;pDevMode:PDeviceMode;pPrinterInfo:PByte;dwNeeded,dwRet: DWORD;Device,Driver,Port:array[0..255]of Char; beginPrinter.PrinterIndex :=Printer.PrinterIndex;//确保Printer对象初始化Printer.GetPrinter(Device, Driver, Port, hPrinter);ifhPrinter =0thenRaiseLastOSError;//第一步:获取当前DEVMODE的大小dwNeeded:= DocumentProperties(0,hPrinter,Device,nil,nil,0);ifdwNeeded <=0thenRaiseLastOSError;//分配内存GetMem(pPrinterInfo, dwNeeded);try//获取PRINTER_INFO_2结构,其中包含DEVMODEifnot GetPrinter(hPrinter,2, pPrinterInfo,dwNeeded,@dwNeeded) thenRaiseLastOSError;//获取DEVMODE指针pDevMode:= PPrinterInfo2(pPrinterInfo)^.pDevMode;ifpDevMode =nil thenbegin//如果没有DEVMODE,我们需要创建一个GetMem(pDevMode, dwNeeded);try//获取当前DEVMODEifDocumentProperties(0, hPrinter, Device, pDevMode, nil, DM_OUT_BUFFER)<0 thenRaiseLastOSError;//设置新的张来源pDevMode^.dmFields :=pDevMode^.dmFieldsor DM_DEFAULTSOURCE;pDevMode^.dmDefaultSource :=Bin;//更新打印机设置PPrinterInfo2(pPrinterInfo)^.pDevMode :=pDevMode;ifnot SetPrinter(hPrinter,2, pPrinterInfo,0) thenRaiseLastOSError;finallyFreeMem(pDevMode);end;endelsebegin//已经有DEVMODE,直接修改//注意:如果打印机驱动程序支持修改默认设置,可能会失败pDevMode^.dmFields :=pDevMode^.dmFieldsor DM_DEFAULTSOURCE;pDevMode^.dmDefaultSource :=Bin;//更新打印机设置if notSetPrinter(hPrinter,2,pPrinterInfo,0)thenRaiseLastOSError;end;finallyFreeMem(pPrinterInfo);end; end; ```调用示例:SetPrinterDefaultBin(DMBIN_UPPER);//设置为上层盒注意:此操作需要管理员权限,并且可能会影响所有使用该打印机的应用程序。由于同打印机的盒代码可能同,建议查阅打印机手册或使用EnumForms函数枚举打印机支持的盒。另外,用户也可以考虑使用打印对话框让用户选择盒,这可以通过TPrinterDialog或PageSetupDialog来实现。相关问题:1.如何获取打印机支持的盒列表?2.在Delphi中如何设置打印作业的张来源(只针对当前作业)?3.如何通过代码选择打印机?下面我们将逐一回答用户的问题,并生成相关问题。</think>### Delphi设置打印机默认盒方法 在Delphi中设置打印机默认盒需要通过Windows API操作打印机设备模式(`DEVMODE`),主要步骤如下: #### 核心步骤 1. **获取打印机句柄** 使用`OpenPrinter`函数获取目标打印机的句柄: ```pascal var hPrinter: THandle; Device, Driver, Port: array[0..255] of Char; begin Printer.PrinterIndex := Printer.PrinterIndex; // 初始化打印机对象 Printer.GetPrinter(Device, Driver, Port, hPrinter); // 获取设备信息 end; ``` 2. **修改DEVMODE结构** 通过`DocumentProperties`获取当前`DEVMODE`并修改盒设置: ```pascal var pDevMode: PDeviceMode; dmSize: DWORD; begin // 获取DEVMODE所需缓冲区大小 dmSize := DocumentProperties(0, hPrinter, Device, nil, nil, 0); GetMem(pDevMode, dmSize); // 获取当前DEVMODE配置 DocumentProperties(0, hPrinter, Device, pDevMode, pDevMode, DM_OUT_BUFFER); // 设置盒代码 (示例: DMBIN_UPPER=1 上层盒) pDevMode^.dmDefaultSource := DMBIN_UPPER; pDevMode^.dmFields := pDevMode^.dmFields or DM_DEFAULTSOURCE; end; ``` 3. **保存设置到打印机** 使用`SetPrinter`应用修改后的配置: ```pascal var PrinterInfo: PPrinterInfo2; InfoSize: DWORD; begin GetPrinter(hPrinter, 2, nil, 0, @InfoSize); // 获取缓冲区大小 GetMem(PrinterInfo, InfoSize); GetPrinter(hPrinter, 2, PrinterInfo, InfoSize, @InfoSize); PrinterInfo^.pDevMode := pDevMode; // 关联新DEVMODE SetPrinter(hPrinter, 2, PrinterInfo, 0); // 提交修改 FreeMem(PrinterInfo); FreeMem(pDevMode); ClosePrinter(hPrinter); // 关闭句柄 end; ``` #### 关键说明 1. **盒代码常量** 常用盒常量定义在`WinSpool`单元: ```pascal const DMBIN_UPPER = 1; // 上层盒 DMBIN_LOWER = 2; // 下层盒 DMBIN_MANUAL = 4; // 手动送 DMBIN_ENVELOPE = 5; // 信封盒 ``` 2. **权限要求** 修改打印机默认设置需要**管理员权限**,否则`SetPrinter`可能返回错误`ERROR_ACCESS_DENIED`。 3. **影响范围** 此操作会修改打印机的**全局默认设置**,影响所有应用程序的打印行为。 #### 替代方案(仅当前任务) 若只需为当前打印任务设置盒: ```pascal Printer.PrinterIndex := Printer.PrinterIndex; Printer.PaperSource := psUpper; // 使用TPaperSource枚举 Printer.BeginDoc; Printer.EndDoc; ``` --- ### 相关问题 1. 如何获取打印机支持的盒列表? 2. Delphi中如何动态选择打印机? 3. 打印时如何指定自定义张大小? 4. 如何处理`SetPrinter`返回的权限错误? 5. 同打印机型号的盒代码差异如何解决? [^1]: 关于打印机配置的底层操作需要直接调用Windows API [^2]: 盒代码常量定义在Windows SDK的WinGDI.h中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值