Hallo,
ich habe im alten Borland C++Builder 6 ein Projekt mit Hilfe der Tnt
Unicode Controls auf
Unicode umgebaut. Anschließend hab ich festgestellt, das beim Drucken immer die Titel der Druckaufträge durch Fragezeichen ersetzt werden, was kein Wunder ist, da die Printers.pas ja immer noch mit AnsiString/AnsiChar arbeitet. Also die Klasse TPrinter in eine neue
Unit kopiert und ebenfalls umgestrickt (heißt jetzt TPrinterW), was trotz meiner bescheidenen Delphi-Kenntnisse relativ problemlos war. Nicht problemlos ist allerdings eine Funktion aus TPrinterSetupDialog - ich hab kein Plan, was ich da falsch mache.
Hier die originale Funktion aus der dialogs.pas vom BCB6 (PChar = PAnsiChar):
Delphi-Quellcode:
procedure GetPrinter(var DeviceMode, DeviceNames: THandle);
var
Device, Driver, Port: array[0..1023] 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;
Und hier meine WideString-Variante (die W-Funktionen sind aus TntWideStrUtils):
Delphi-Quellcode:
procedure TPrinterSetupDialogW.GetPrinter(var DeviceMode, DeviceNames: THandle);
var
Device, Driver, Port: array[0..1023] of WideChar;
DevNames: PDevNames;
Offset: PWideChar;
begin
PrinterW.GetPrinter(Device, Driver, Port, DeviceMode);
if DeviceMode <> 0 then
begin
DeviceNames := GlobalAlloc(GHND, SizeOf(TDevNames) +
(WStrLen(Device) + WStrLen(Driver) + WStrLen(Port) + 3) * sizeof(WideChar));
DevNames := PDevNames(GlobalLock(DeviceNames));
try
Offset := PWideChar(PByte(DevNames)) + SizeOf(TDevnames);
with DevNames^ do
begin
wDriverOffset := (Longint(Offset) - Longint(DevNames)) div 2;
Offset := WStrECopy(Offset, Driver) + 1;
wDeviceOffset := (Longint(Offset) - Longint(DevNames)) div 2;
Offset := WStrECopy(Offset, Device) + 1;
wOutputOffset := (Longint(Offset) - Longint(DevNames)) div 2;
WStrCopy(Offset, Port);
end;
finally
GlobalUnlock(DeviceNames);
end;
end;
end;
Das wird anstandslos kompiliert, aber beim ausführen ploppt jedesmal das CPU-Fenster auf. Der Fehler liegt
IMHO irgendwo nach dem "try". Kann mir da jemand helfen?
Vielen Dank!