Не присваивает инвентарный номер последнему листу

Автор Гость, 12.12.06, 07:42:56

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Гость

У меня возникла следующая проблема: при работе с основной надписью (stamp) в многолистовом документе не сохраняются данные на последнем листе.
При этом:
-первый лист обрабатывается даже если он один
-в процессе выполнения показывает что последний лист обрабатывается
-обработка происходит в созданном COM-объекте
-число листов определяет верно
-указатель на штамп получаю через GetStampEx(n), где n-номер листа начиная с 1
-все листы кроме последнего обратываются корректно

Заранее спасибо за помощь.

Гость

Привожу код функции где все происходит, может это прольет свет...

function ChangeLiteraInCDW(const stWillLitera, stInvNumber, stDateSdachi, stCDWFileName : String; OnlyLitera : boolean) : boolean;
const
  Kompas : TGUID = '{E36BC97C-39D6-4402-9C25-C7008A217E02}';
var
  iKompas : KompasObject;
  iDoc : ksDocument2D;
  iStamp : ksStamp;
  v : Variant;
  iItemParam : ksTextItemParam;
  iItemFont : ksTextItemFont;
  spec : ksSpecification;
  therdKillKompas : TKillerKompas;
  i, j : integer;
begin
  Result := false;
  if not FileExists(stCDWFileName) then
    raise Exception.Create('Файл '+stCDWFileName+' не найден!');
  try
    KillKompas2; //процедура убивает компас

    //поток убивает зависший компас
    therdKillKompas:=TKillerKompas.Create(true);
    therdKillKompas.Priority:=tpLowest;
    therdKillKompas.Resume;

    v := CreateComObject(CLASS_Application);
    iKompas := IUnknown(v) as KompasObject;
    iDoc :=  iKompas.Document2D as ksDocument2D;

    iDoc.ksOpenDocument(stCDWFileName, false);

    therdKillKompas.Terminate;
  except on E : Exception do
    try
      fMain.mReport.Lines.Add('Ошибка при запуске КОМПАСа, перезапуск приложения!');
      KillKompas2;

      therdKillKompas:=TKillerKompas.Create(true);
      therdKillKompas.Priority:=tpLowest;
      therdKillKompas.Resume;

      v := CreateComObject(CLASS_Application);
      iKompas := IUnknown(v) as KompasObject;

      iDoc :=  iKompas.Document2D as ksDocument2D;
      iDoc.ksOpenDocument(stCDWFileName, false);

      therdKillKompas.Terminate;
    except on E : Exception do
      begin
        //
        fMain.mReport.Lines.Add(stCDWFileName+' - Документ небыл обработан из-за ошибки приложения!!! '+e.Message);
        ShowMessage(stCDWFileName+#13+#10+'Документ небыл обработан из-за ошибки приложения!!!'+#13+#10+e.Message);
        //
        exit;
      end;
  end;

  end;
//
  try
  therdKillKompas:=TKillerKompas.Create(true);
  therdKillKompas.Priority:=tpLowest;
  therdKillKompas.Resume;
  //
  spec:=ksSpecification(iDoc.GetSpecification);
  spec.ksDeleteSpcDescription(0);
  except
    on e:Exception do
      begin
        fMain.mReport.Lines.Add(stCDWFileName+' - Документ небыл обработан из-за ошибки приложения!!! '+e.Message);
        ShowMessage(stCDWFileName+#13+#10+'Документ небыл обработан из-за ошибки приложения!!!'+#13+#10+e.Message);
        exit;
      end;
  end;
//
  try

    j := iDoc.ksGetDocumentPagesCount;
    fMain.mReport.Lines.Add(IntToStr(j));

  //вот тут идет обработка штампа(основной надписи) 
  for i := 1 to j do
    begin //for
      fMain.mReport.Lines.Add('Лист №'+inttostr(i));
      iStamp := ksStamp(iDoc.GetStampEx(i));
      if iStamp.ksOpenStamp <> 1 then begin
        iDoc.ksCloseDocument;
        //
        fMain.mReport.Lines.Add(stCDWFileName+' - Документ небыл обработан из-за ошибки приложения!!! ');
        ShowMessage(stCDWFileName+#13+#10+'Документ небыл обработан из-за ошибки приложения!!!'+#13+#10);
        //
        exit;
      end;

      iItemParam := iKompas.GetParamStruct(ko_TextItemParam) as ksTextItemParam;
      iItemParam.Init;

      iItemFont := iItemParam.GetItemFont as ksTextItemFont;
      iItemFont.SetBitVectorValue(NEW_LINE, true);

      if  (stWillLitera = 'Р') or
        (stWillLitera = 'Э') or
        (stWillLitera = 'Т') or
        (stWillLitera = 'О') or
        (stWillLitera = 'О1') or
        (stWillLitera = 'О2') then begin
        if iStamp.ksColumnNumber(40) = 1 then begin
          iItemParam.s := stWillLitera;
          iStamp.ksTextLine(iItemParam);
          //ячейка 40
          //41 и 42 - пустые
          iStamp.ksColumnNumber(41);
          iItemParam.s := '';
          iStamp.ksTextLine(iItemParam);
          iStamp.ksColumnNumber(42);
          iItemParam.s := '';
          iStamp.ksTextLine(iItemParam);
        end;
      end else if stWillLitera = 'А' then begin
        //ячейка 41
        //40 и 42 - пустые
        if iStamp.ksColumnNumber(41) = 1 then begin
          iItemParam.s := stWillLitera;
          iStamp.ksTextLine(iItemParam);
          //ячейка 40
          //41 и 42 - пустые
          iStamp.ksColumnNumber(40);
          iItemParam.s := '';
          iStamp.ksTextLine(iItemParam);
          iStamp.ksColumnNumber(42);
          iItemParam.s := '';
          iStamp.ksTextLine(iItemParam);
        end;
      end else if stWillLitera = 'Б' then begin

        //ячейка 42
        //40 и 41 - пустые
        if iStamp.ksColumnNumber(42) = 1 then begin
          iItemParam.s := stWillLitera;
          iStamp.ksTextLine(iItemParam);
          //ячейка 40
          //41 и 42 - пустые
          iStamp.ksColumnNumber(40);
          iItemParam.s := '';
          iStamp.ksTextLine(iItemParam);
          iStamp.ksColumnNumber(41);
          iItemParam.s := '';
          iStamp.ksTextLine(iItemParam);
        end;
      end;

      if not onlylitera then
      begin

      //Инвентарный номер
      if iStamp.ksColumnNumber(19) = 1 then begin
          iItemParam.s := stInvNumber;
          iStamp.ksTextLine(iItemParam);
          fMain.mReport.Lines.Add(stInvNumber);
      end;
      //Дата сдачи

      if iStamp.ksColumnNumber(201) = 1 then begin
          iItemParam.s := stDateSdachi;
          iStamp.ksTextLine(iItemParam);
          fMain.mReport.Lines.Add(stDateSdachi);
      end;

      end;

      iStamp.ksCloseStamp;

      if iDoc.ksSaveDocument(stCDWFileName) then
      fMain.mReport.Lines.Add('сохранил');
      fMain.mReport.Lines.Add(inttostr(iStamp.SheetNumb));
    end; //for

      Result := true;
      //
      therdKillKompas.Terminate;
  except
    on E : Exception do begin
      try iDoc.ksCloseDocument; except end;
      fMain.mReport.Lines.Add(stCDWFileName+' - Документ небыл обработан из-за ошибки приложения!!! '+e.Message);
      ShowMessage(stCDWFileName+#13+#10+'Документ небыл обработан из-за ошибки приложения!!!'+#13+#10+e.Message);
    end;
  end;
 
  KillKompas2;
end;

tearnn

По прежнему актуально, ничего не поменялось за 7 лет?