Tên truyền cho IndexOf
phải phù hợp chính xác với những gì trong Printer.Printers
để hoạt động. Nếu chúng không phải là chính xác, bao gồm CASE, IndexOf
sẽ trả về -1
, có nghĩa là "sử dụng máy in mặc định".
Ví dụ cụ thể, sử dụng IndexOf('hp laserjet')
sẽ trả về -1 nếu tên máy in thực tế là HP LaserJet
hoặc hp laserjet 5
.
Nếu bạn không chỉ định tên chính xác, bạn có thể thực hiện so khớp từng phần bằng cách lặp lại danh sách. Rất khó có hệ thống điển hình có quá nhiều máy in sẵn có để đạt hiệu quả cao; chúng tôi có một vài chục, và nó là tốt.
Đây là tình huống chúng tôi có: Văn phòng của chúng tôi được chia thành ba bộ phận cơ bản (Tài chính, Quản trị và Dịch vụ khách hàng). Mỗi máy in có một máy in khác nhau chứa các nhãn mã nguồn cấp dữ liệu (dot matrix), nhưng chúng tôi có các ứng dụng chạy trong tất cả các phòng ban. Thay vì có ứng dụng biết bộ phận nào đang chạy để chọn máy in nhãn, chúng tôi chỉ cung cấp tên máy in có chứa từ Labels
- Fiscal Labels
, Admin Labels
, v.v. Sau đó chúng tôi có thể tìm máy in phù hợp với vòng lặp:
function GetLabelPrinterIndex: Integer;
var
i: Integer;
begin
for i := 0 to Printer.Printers.Count - 1 do
if AnsiContainsText(Printer.Printers[i], `Labels`) then
begin
Exit(i);
end;
Result := -1;
end;
Lưu ý: Tôi muốn xóa tiền tố VCL
khỏi các tham chiếu của bạn; điều đó có nghĩa là mã của bạn sẽ không có sẵn trên các nền tảng. Nếu bạn chỉ cần đảm bảo rằng Printers
nằm trong mệnh đề sử dụng, bạn có thể sử dụng chỉ Printers.Printer
và thay đổi nền tảng đích (VCL Win32/64, FMX 32/64, OSX) sẽ điều chỉnh mệnh đề sử dụng cho bạn dựa trên cấu hình xây dựng.
Nguồn
2013-11-29 01:39:37