TImage не отображается при добавлении дополнительного изображения в TTabSheet во время выполнения - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть настольная программа с модальным значением (FirearmForm), имеющим TPageControl с 5 TTabSheet с.

На TabSheet 3 я рисую BMP-файлы, которые хранятся в база данных (SQL сервер). Следующий код выполняется в событии OnShow на вкладке. Он отлично рисует все изображения.

Есть кнопка для добавления новой записи с новым изображением. Я нажимаю кнопку, получаю модальную форму, чтобы выбрать пи c, и добавляю ее в базу данных без проблем. Я автоматически закрываю эту модальную форму. Затем я вызываю метод Refresh для TabSheet, содержащего изображения.

Работая в режиме отладки, я вижу, что он использует код, показанный для перестройки изображений, включая только что загруженное новое изображение. НО .... Табличный лист продолжает отображать исходные изображения только , так же, как когда Табличный лист был "показан" в первый раз. Если я щелкну другой TabSheet, а затем вернусь к листу, содержащему изображения, код выполняется снова, но новое изображение не отображается (оригиналы по-прежнему отображаются). Если я перейду на другую вкладку второй раз, а затем вернусь на вкладку изображений, новые изображения (и все остальные) будут отображаться правильно.

Что я делаю не так? Есть идеи, почему мне нужно дважды прогнать этот код, прежде чем он будет работать как нужно?

Я пробовал несколько разных методов построения TImage s, и результаты всегда одинаковы. Есть идеи от кого-то умнее меня?

PS .. Я пробовал Create метод TImage как (self) и с именем формы ... тот же эффект.

procedure TFirearmForm.tsInPicturesShow(Sender: TObject);
var
  wkFileName, wkAName : string;
  wkPic : tPicture;
  wkJPG : tJPEGImage;
  wkBMP : tBitMap;
  wkImg : tImage;
  I, x, wkTop, wkLeft : integer;
  wkComp : tComponent;

begin

  with dm.qryDocuments do begin
    close;
    sql.Text := 'select d.*, di.DocumentBitMap from documents d ' +
      'join DocumentImages di on ' +
        'di.CompanyId=d.CompanyId and ' +
        'di.DocumentId=d.DocumentId ' +
      'where ' +
      'd.companyid=' + quotedstr(dm.gCompanyId) + ' and ' +
      'd.adnumber='  + quotedstr(dm.gADNumber);
    open;

    I := 0;
    wkTop := 32;
    wkLeft := 46;

    while not eof do begin
      inc(i);
      wkAName := 'InImage' + fieldbyname('DocumentId').AsString;

      wkComp := FirearmForm.pcFirearm.findcomponent(wkAName);
      if assigned(wkComp) then begin
        next;
        continue;
      end;

      wkImg := TImage.Create(FirearmForm.pcFirearm);

      wkImg.Parent  := tsInPictures;
      wkImg.Left    := wkLeft;
      wkImg.Top     := wkTop;
      wkImg.Name    := wkAName;
      wkImg.Picture.assign(fieldbyname('DocumentBitMap') as tBlobField);
      wkImg.Visible := True;

      wkLeft := wkLeft + 184;
      if i > 2 then begin
        if i mod 6 = 0 then begin
          wkTop := wkTop + 180;
          wkLeft := 46;
        end;
      end;

      next;
    end;
  end;

//  FirearmForm.pcFirearm.ActivePageIndex :=2;

end;

1 Ответ

0 голосов
/ 10 февраля 2020

@ Реми .. запись действительно есть в базе данных. Я программирую в течение 35 лет и знаю, как передать re c в БД. Я не понимаю ваш второй комментарий. Когда я использую указатель «self», он по-прежнему демонстрирует то же поведение ... в двух щелчках мыши, и отображается нормально.

...