Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema al pasar función de D2007 a Berlín (https://www.clubdelphi.com/foros/showthread.php?t=93999)

newtron 13-06-2019 17:35:40

Problema al pasar función de D2007 a Berlín
 
Hola a tod@s.


Tengo esta función para activar/desactivar la función "duplex" de las impresoras:


Código Delphi [-]
Function funcSetDuplex(Duplex : Boolean): Boolean;
{This procedure sets the current printer in duplex or simplex}
var
Device, Driver, Port : array[0..255] of char; {0..80 may not handle long
ports}
hDMode : THandle;
pMode, PDMode : PDevMode;
begin
  Result := False; {Initialize result to False, may be unnecessary}
  printer.GetPrinter(Device, Driver, Port, hDMode);
  if hDMode <> 0 then begin {got handle to Device Mode}
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then begin {set duplex if capable}
      if DeviceCapabilitiesA(Device, Port, DC_DUPLEX, nil, nil) = 1 then begin
        Result := True; {Printer can do Duplex}
        {DeviceCapsA returns 1 if parameter accepts or 0 if not}
        pDMode^.dmFields := pDMode^.dmFields or dm_Duplex;
        if Duplex
          then pDMode^.dmDuplex := dmDup_VERTICAL
          else pDMode^.dmDuplex := dmDup_SIMPLEX;
      end
      else Result := False; {return false if printer can't do Duplex}
      GlobalUnlock(hDMode);
    end; {end got pDMode}
  end; {end got handle to DevMode}
end;


Esto con mi Delphi 2007 va perfectamente pero estoy intentando pasarla a Delphi Berlin y me da el siguiente error al compilar:


Incompatible types: 'PAnsiChar' and 'array[0..255] or Char


señalando la variable "Device" de la linea "if DeviceCapabilitiesA(Device, Port, DC_DUPLEX, nil, nil) = 1 then begin"


Imagino que habrá que hacer alguna conversión de tipos de variable pero la verdad es que no doy con la tecla.


¿Alguien me puede iluminar?


Gracias y un saludo

Casimiro Notevi 13-06-2019 18:25:42

¿Has probado: Device, Driver, Port : array[0..255] of ansichar; ?

newtron 13-06-2019 18:33:59

Cita:

Empezado por Casimiro Notevi (Mensaje 532401)
¿Has probado: Device, Driver, Port : array[0..255] of ansichar; ?


Si, y me dice:


Incompatible types: 'PWideChar' and 'array[0..255] of AnsiChar


Gracias y un saludo

Casimiro Notevi 13-06-2019 18:53:11

Lo otro es que sean pansichar, pero no sé qué tipos son cada uno de los parámetros.
A ver si alguien que use esas versiones modernas puede ayudar.

movorack 13-06-2019 21:31:47

Si, cambiaron los tipos de datos de los parámetros! Pues, de esta manera compila pero...

Código Delphi [-]
procedure TPrinter.GetPrinter(ADevice, ADriver, APort: PChar; var ADeviceMode: THandle);

function DeviceCapabilitiesA(pDriverName, pDeviceName, pPort: PAnsiChar;
  iIndex: Integer; pOutput: PAnsiChar; DevMode: PDeviceModeA): Integer; stdcall;

Function funcSetDuplex(Duplex: Boolean): Boolean;
var
  Device, DeviceName, Driver, Port: PWideChar;
  hDMode: THandle;
  pMode, PDMode: PDevMode;
begin
  {This procedure sets the current printer in duplex or simplex}
  Result := False; { Initialize result to False, may be unnecessary }
  printer.GetPrinter(Device, Driver, Port, hDMode);
  if hDMode <> 0 then
  begin { got handle to Device Mode }
    PDMode := GlobalLock(hDMode);
    if PDMode <> nil then
    begin { set duplex if capable }
      if DeviceCapabilitiesA(PAnsiChar(Device), PAnsiChar(DeviceName),
        PAnsiChar(Port), DC_DUPLEX, nil, nil) = 1 then
      begin
        Result := True; { Printer can do Duplex }
        { DeviceCapsA returns 1 if parameter accepts or 0 if not }
        PDMode^.dmFields := PDMode^.dmFields or dm_Duplex;
        if Duplex then
          PDMode^.dmDuplex := dmDup_VERTICAL
        else
          PDMode^.dmDuplex := dmDup_SIMPLEX;
      end
      else
        Result := False; { return false if printer can't do Duplex }
      GlobalUnlock(hDMode);
    end; { end got pDMode }
  end; { end got handle to DevMode }
end;

newtron 14-06-2019 09:30:26

Gracias a los dos por contestar.


movorack, disculpa pero no entiendo tu respuesta.


En la unidad WinSpool de mi Delphi Berlín la función está declarada de la siguiente forma:


Código Delphi [-]

{$EXTERNALSYM DeviceCapabilitiesA}
function DeviceCapabilitiesA(pDevice, pPort: LPCSTR; fwCapability: Word;
  pOutput: LPSTR; DevMode: PDeviceModeA): Integer; stdcall;


o sea, las variables están como tipo LPCSTR pero no sé cómo hacer la declaración y la llamada.


Saludos

Casimiro Notevi 14-06-2019 10:13:55

Mientras responde movorack...
Dices que la función es:
Código Delphi [-]
function DeviceCapabilitiesA(pDevice, pPort: LPCSTR; fwCapability: Word;   
    pOutput: LPSTR; DevMode: PDeviceModeA): Integer; stdcall;
Sin embargo, creo que la llamas con los parámetros cambiados de orden:
Código Delphi [-]
if DeviceCapabilitiesA(PAnsiChar(Device), PAnsiChar(DeviceName), 
          PAnsiChar(Port), DC_DUPLEX, nil, nil) = 1 then
Aparte de eso, lo mismo puede que funcione de la forma:
PAnsiChar(AnsiString())

newtron 14-06-2019 11:01:45

Casimiro.


Ese código era una propuesta de movorack, yo lo estaba poniendo en el orden correcto. Por otro lado con tu última propuesta "PAnsiChar(AnsiString())" si que ha funcionado. :)


Gracias a los dos y un saludo

movorack 14-06-2019 14:23:14

Hola, que mala costumbre la de nosotros los latinoamericanos de dormir mientras uds están trabajando :D

Lo que sucede es que en el Berlín que tengo instalado (Delphi Berlín 10.1 Update 2) están así:

Código Delphi [-]
{UNIT VCL.Printers}
procedure GetPrinter(ADevice, ADriver, APort: PChar; var ADeviceMode: THandle);

{UNIT WinApi.Windows}
{$EXTERNALSYM DeviceCapabilitiesA}
function DeviceCapabilitiesA(pDriverName, pDeviceName, pPort: LPCSTR;
  iIndex: Integer; pOutput: LPSTR; DevMode: PDeviceModeA): Integer; stdcall;

Pero, LPCSTR termina siendo del tipo PAnsiChar

Código Delphi [-]
{UNIT WinApi.Windows}
LPSTR = MarshaledAString;

{UNIT System}
_PAnsiChr = PAnsiChar;
MarshaledAString = _PAnsiChr;

y la duda es porque DeviceCapabilitiesA pide un parámetro llamado pDeviceName que en tu código original no veo.

newtron 15-06-2019 09:33:28

Cita:

Empezado por movorack (Mensaje 532413)
Hola, que mala costumbre la de nosotros los latinoamericanos de dormir mientras uds están trabajando :D


Aquí no trabajamos hombre, estamos todo el día de fiesta. :cool:


Pues es curioso porque mi versión es igualmente Berlín 10.1 Update 2 y se ve que esa función en particular la declara de forma diferente :confused:


De una forma o de otra lo solucioné con la propuesta de Casimiro.


Gracias y un saludo


La franja horaria es GMT +2. Ahora son las 06:17:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi