Aleksandr N
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Имеется интересная ситуация. Определяем стандартным образом способ подачи бумаги FillChar(BinValues, SizeOf(BinValues), 0); BinCount := DeviceCapabilities(CurrentDevice, CurrentPort, DC_BINS, @BinValues[0], nil); if BinCount > 0 then begin GetMem(BinNames, BinCount * 24 * sizeof(char)); GetMem(BinValues, BinCount * 24 * sizeof(char)); try DeviceCapabilities(CurrentDevice, CurrentPort, DC_BINNAMES, Pointer(BinNames), nil); DeviceCapabilities(CurrentDevice, CurrentPort, DC_BINS, Pointer(BinValues), nil); FBins := TStringList.Create; for I := 0 to BinCount - 1 do begin BinName := BinNames^[I]; FBins.AddObject(BinName, TObject(BinValues^[I])); end; finally FreeMem(BinNames, BinCount * 24 * sizeof(char)); FreeMem(BinValues, BinCount * 24 * sizeof(char)); end; end; Имеется некий принтер в драйверах которого способы подачи бумаги определены как: "Автоматическое устройство подачи" и "Ручное устройство подачи". При данном способе определения, программа выдаёт только 24 символа: Пытался вместо параметра "24" поставить "40". В одном случае это ни к чему не приводило, в другом из этого получилось: Вся проблема в том, что при этом программа либо выдаёт ошибку, либо молча вышибается. Поставив это между try except - программа ошибок на экран не выдаёт, но ведёт себя крайне неадекватно. Вопрос: можно что-то в этом коде исправить чтобы выдавался весь текст. Как я предполагаю в этом случае ошибок быть не должно. Или может есть другой способ определения способа подачи бумаги. P.S. Поставить нормальный драйвер принтера не предлагать - я обратился в ветку по программированию... Во многих других модулях так-же. Такая-же история с компонентом печати от "Девок" где этот параметр определяется иначе. Но суть это не изменило... Вот их код: BinCount := DeviceCapabilities(CurrentDevice, CurrentPort, DC_BINS, nil, nil); if BinCount > 0 then begin BinValues := AllocMem(BinSize * BinCount); try if DeviceCapabilities(CurrentDevice, CurrentPort, DC_BINS, PChar(BinValues), nil) <> -1 then begin BinNames := AllocMem(BinNameSize * BinCount); try if DeviceCapabilities(CurrentDevice, CurrentPort, DC_BINNAMES, PChar(BinNames), nil) <> -1 then begin FBins := TStringList.Create; for I := 0 to BinCount - 1 do begin BinName := BinNames^[I]; FBins.AddObject(BinName, TObject(BinValues^[I])); end; end; finally FreeMem(BinNames, BinNameSize * BinCount); end; end; finally FreeMem(BinValues, BinSize * BinCount); end; end; |