1.  How can I change the printer tray?
 
1.  Printer tray can be changed using the following code (tested with Delphi 5):

procedure ChangePrinterTray ( Tray: Short );
var
  ADevice, ADriver, APort: array [0..255] of Char;
  ADeviceMode: THandle;
  DevMode: PDeviceMode;
begin
  // retrieve current settings
  Printer.GetPrinter( ADevice, ADriver, APort, ADeviceMode );
  // if we have a DeviceMode
  if ADeviceMode <> 0 then
   begin
    GlobalUnlock( ADeviceMode );  // unlock it
    DevMode := GlobalLock( ADeviceMode );  // get a pointer to current printer settings
    DevMode.dmDefaultSource := Tray;  // apply new seting
    DevMode.dmFields := DevMode.dmFields or DM_DEFAULTSOURCE;  // set the flag of what we will update
    GlobalUnlock( ADeviceMode );  // unlock devicemode
    Printer.SetPrinter( ADevice, ADriver, APort, ADeviceMode );  // apply new settings
  end;

end;

A similar approach can be used to change any other setting you like.