Andy Belton Ответов: 1

У меня есть программа, которая больше не работает (продолжение)


#ifdef DEBUG_PRINTER
//---------------------------------------------------------------------------

void __fastcall LogDebugTxt(AnsiString Txt)
{
если (!FileExists("D:\AGBdebug.txt"))
DebugHandle = Мастер Создания Файлов("D:\AGBdebug.txt");
еще
DebugHandle = FileOpen("D:\AGBdebug.txt",fmOpenReadWrite);
FileSeek(DebugHandle,0,2);
FileWrite(DebugHandle,Txt.c_str(),Txt.Length());
// если (файл*. txt По != '\Н')
FileWrite(DebugHandle,"\r\n",2);
FileClose(DebugHandle);
}
#endif
//---------------------------------------------------------------------------

AnsiString __fastcall GetPrinterName()
{
int pi = Printer()->PrinterIndex;
#ifdef DEBUG_PRINTER
LogDebugTxt(NowtStr);
LogDebugTxt("запуск отладочного теста");
LogDebugTxt("----------------");
TStrings* prns = Printer()->принтеры;
LogDebugTxt("PrinterCount =" + AnsiString(prns->Count));
LogDebugTxt("PrinterIndex =" + IntToStr(pi));
LogDebugTxt(NowtStr);
LogDebugTxt("получить массив строк принтера");
s_Bfr = Printer()->принтеры[0].С текстом();
LogDebugTxt(NowtStr);
LogDebugTxt("список содержимого массива");
LogDebugTxt("--- начало списка ---");
LogDebugTxt(s_Bfr);
LogDebugTxt("--- конец списка ---");
LogDebugTxt(NowtStr);
LogDebugTxt("изолировать имя принтера");

в то время как (pi > 0)
{ // Удаление записей перед индексированным целевым объектом
s_Bfr = s_Bfr.SubString(s_Bfr.Pos("\r") + 1,s_Bfr.Length());
пи--;
}
pi = s_Bfr.Pos("\r");
if (pi) // удалите все, что следует за ним
s_Bfr.SetLength(pi - 1);
s_Bfr = s_Bfr.Отделка();
LogDebugTxt(s_Bfr);
LogDebugTxt("--------------");
LogDebugTxt("Debug test end");
#else // код версии без отладки
s_Bfr = Printer()->принтеры[0].С текстом();
в то время как (pi > 0)
{
s_Bfr = s_Bfr.SubString(s_Bfr.Pos("\r") + 1,s_Bfr.Length());
пи--;
}
pi = s_Bfr.Pos("\r");
если (Пи)
s_Bfr.SetLength(pi - 1);
#endif
вернуться s_Bfr.Отделка();
}
//---------------------------------------------------------------------------

Что я уже пробовал:

Теперь эта проблема устранена, и я очень благодарен тем, кто внес свой вклад. Отображаемый список кодов-это используемый отладочный код. Все прекрасно работает на всех целевых платформах.

Обратите внимание, что функция LogDebugTxt сохраняет файл журнала нормально закрытым, так что в случае фатального сбоя данные журнала не будут потеряны.

Еще раз благодарю вас за вашу помощь в этом вопросе. AGB

Richard MacCutchan

О, и мы должны угадать, какой вопрос Вы имеете в виду?

ZurdoDev

После 13 догадок я чувствую, что у меня почти получилось. Но только промахнулся.

0x01AA

Проверьте размер принтеров.

TStrings* prns= Printer()->Printers;
LogDebugTxt("Count= " + AnsiString(prns->Count));


И проверьте также whter Printer()->PrinterIndex находится в допустимом диапазоне. Скорее всего, не выбран DefaultPrinter и значение PrinterIndex == -1

ZurdoDev

В чем именно заключается ваш вопрос?

jeron1

Вы должны обновить свой первоначальный вопрос с любыми изменениями, которые вы внесли, и/или новой информацией, которая у вас может быть. Этот поток будет выдвинут наверх, когда вы это сделаете, поэтому нет необходимости в потоках "вопрос ... (продолжение)".

1 Ответов

Рейтинг:
1

0x01AA

Это скорее предположение, чем ответ, потому что слишком многое неясно. Другое дело, что я действительно отвечаю на него с точки зрения c++ Builder 6, потому что на первый взгляд (вы упомянули AnsiString а также Printer()->Printers) похоже, что это очень похоже.

Взять в связи

Printer()->PrinterIndex
может быть '-1', что означает, что в Builder это принтер по умолчанию. И в этом случае вы не можете получить имя принтера с помощью Printer()->Printers[p].GetText(); потому что это закончится тем, что индекс выйдет из диапазона или, как правило, Борланд нарушит доступ.

Следующая проблема, с которой я обычно сталкиваюсь в среде Builder: в случае, если принтер по умолчанию не назначен (что, с другой стороны, очень редко происходит в W10), вы можете получить проблемы.

Наконец, доступ к информации о принтере должен осуществляться осторожно. Пример:
TStrings* prns= Printer()->Printers;
if (prns == NULL)
{
  // This should never happen
  throw (*new Exception("Printer()->Printer returned NULL"));
}

LogDebugTxt("Available printers, no of printers is: " + AnsiString(prns->Count));
for (int ix= 0; ix < prns->Count; ix++)
{
  LogDebugTxt(AnsiString(ix) + prns[ix]);
}

LogDebugTxt("Current Printer Index= " + AnsiString(Printer()->PrinterIndex));


Я надеюсь, что это поможет и что я не совсем ошибаюсь. Не стесняйтесь переспрашивать.


Maciej Los

5ed!

0x01AA

Спасибо Мацей что дал мне пять за догадку ;)

Maciej Los

;)

0x01AA

По крайней мере, я участвую в поддержке некоторых устаревших приложений, реализованных с помощью borland stuff :)
Кстати. Знаете ли вы, что случилось с Сергеем (SAK), я думаю, что он тоже работал с этим материалом delphi/builder, но теперь он, кажется, очень долго находится в автономном режиме.

Maciej Los

Извините за поздний ответ... Ну, я давно не видел Сергея. Надеюсь, с ним все в порядке. Я думал о нем несколько раз, но так и не решился написать ему несколько слов.

Richard MacCutchan

Я подозреваю, что он нашел работу, которая занимает все его время.

Maciej Los

Он сменил работу в ноябре 2016 года, но перестал отвечать на вопросы QA на рубеже 2018 и 2019 годов... Это должно быть что-то другое... Или он не обновил профиль в LinkedIn. :)