Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2015, 17:31   #11
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Да, спасибо я воспользуюсь Вашим советом
и переделаю код (пока он работает)

Код:
procedure TFMain.tLoadImageTimer(Sender: TObject);
var
  LImageStream: TMemoryStream;
  L_PNG: TPNGObject;
  L_BMP: TBitmap;
  L_JPG: TJPEGImage;
  LNumString, LTypeImage: integer;
begin
  tLoadImage.Enabled := false;
  SQL_Service(0, Format(C_sel_image, [ibdsMain.FieldByName('ID').AsInteger]));
  dbViewImage.RowCount := 0;
  LNumString := 0;
  PrArr_Image := nil;
  if not(ibqEmpty1.IsEmpty) then
  begin
    dbViewImage.RowCount := ibqEmpty1.RecordCount;
    setLength(PrArr_Image, ibqEmpty1.RecordCount);
    dbViewImage.DefaultDrawing := false;
    while not (ibqEmpty1.Eof) do
    begin
      try
        LImageStream := TMemoryStream.Create;
        L_PNG := TPNGObject.Create;
        L_BMP := TBitmap.Create;
        L_JPG := TJPEGImage.Create;
        TBlobField(ibqEmpty1.FieldByName('IMAGE')).SaveToStream(LImageStream);
        LTypeImage := DETERMINATE_TYPE_FILE(LImageStream);
        LImageStream.Seek(0, soFromBeginning);
        case LTypeImage of
          0: Message_Program(3);
          1:
            begin
              L_BMP.LoadFromStream(LImageStream);
              dbViewImage.Canvas.Draw(0, LNumString, L_BMP);
            end;
          3:
            begin
              L_JPG.LoadFromStream(LImageStream);
              dbViewImage.Canvas.Draw(0, LNumString, L_JPG);
            end;
          4:
            begin
              L_PNG.LoadFromStream(LImageStream);
              L_PNG.Draw(dbViewImage.Canvas, dbViewImage.CellRect(0, LNumString));
            end;
        end;
      finally
        LImageStream.Free;
        L_BMP.Free;
        L_PNG.Free;
        L_JPG.Free;
      end;
      inc(LNumString);
      ibqEmpty1.Next;
    end;
  end
  else dbViewImage.DefaultDrawing := true;
end;
но т.к. картинок для одной записи может много, и все они не помещаются на одной прокрутке Scroll в DrawGrid. То возможно будет, как вы говорили, сначало в кеш их скидывать (допустим в динамический массив), а потом в событии OnDrawCell, изымать их из массива
Но перед сохранением картинок в массив, их нужно преобразовать в один формат

Последний раз редактировалось KBO; 14.07.2015 в 17:39.
KBO вне форума Ответить с цитированием
Старый 14.07.2015, 18:00   #12
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
Лампочка

Мне не на чем проверить, но что если так?:
Код:
procedure TFMain.tLoadImageTimer(Sender: TObject);
var
  LImageStream: TMemoryStream;
  LImage: TGraphic;
  LNumString, LTypeImage: integer;
begin
  tLoadImage.Enabled := false;
  SQL_Service(0, Format(C_sel_image, [ibdsMain.FieldByName('ID').AsInteger]));
  dbViewImage.RowCount := 0;
  LNumString := 0;
  PrArr_Image := nil;
  if not(ibqEmpty1.IsEmpty) then
  begin
    dbViewImage.RowCount := ibqEmpty1.RecordCount;
    setLength(PrArr_Image, ibqEmpty1.RecordCount);
    dbViewImage.DefaultDrawing := false;
    while not (ibqEmpty1.Eof) do
    begin
      try
        LImageStream := TMemoryStream.Create;
        TBlobField(ibqEmpty1.FieldByName('IMAGE')).SaveToStream(LImageStream);
        LTypeImage := DETERMINATE_TYPE_FILE(LImageStream);
        LImageStream.Position:=0; // LImageStream.Seek(0, soFromBeginning);
        case LTypeImage of
          0: Message_Program(3);
          1: LImage:=TBitmap.Create;
          3: LImage:=TJPEGImage.Create;
          4: LImage:=TPNGObject.Create;
          else Message_Program(3); // TODO: ?
        end;
        LImage.LoadFromStream(LImageStream); // TODO: LImage<>Nil ?
        dbViewImage.Canvas.Draw(0, LNumString, LImage); // TODO: LImage<>Nil ?
      finally
        LImageStream.Free;
        LImage.Free; // TODO: LImage<>Nil ?
      end;
      inc(LNumString);
      ibqEmpty1.Next;
    end;
  end
  else dbViewImage.DefaultDrawing := true;
end;
И всё же не понимаю для чего там таймер. Не должно там настолько тормозить.
ResourceSpace вне форума Ответить с цитированием
Старый 16.07.2015, 16:12   #13
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Я все же решил в таймере заполнять динамический массив картинками, а в

Код:
procedure TFMain.dbViewImageDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  LImage: TJPEGImage;
begin
  if Length(PrArr_Image) > 0 then
  begin
    LImage := TJPEGImage.Create;
    LImage.Assign(PrArr_Image[ARow]);
    dbViewImage.Canvas.Draw(0, ARow, LImage);
    LImage.Free;
  end;
end;
их выводить (так более правильнее будет, все на своем месте).
Только вот проблема все картинки "bmp" и "jpg" (кроме "png") почему-то вставляются в самую верхнюю клетку DrawGrid`а игнорируя то, что "ARow" изменяется от 0 до 1 (у меня в массиве PrArr_Image 2 картинки всего)

Последний раз редактировалось KBO; 16.07.2015 в 16:15.
KBO вне форума Ответить с цитированием
Старый 16.07.2015, 16:33   #14
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Код:
dbViewImage.Canvas.Draw(0, ARow, LImage);
Цитата:
что "ARow" изменяется от 0 до 1
Ну и правильно, выходит вы рисуете в координатах {0,0} и {0,1}. Это же в пикселях. Попробуйте рисовать StrechDraw в прямоугольнике Rect который в параметрах приходит. Ну или на Rect.Top поменяйте.
ResourceSpace вне форума Ответить с цитированием
Старый 16.07.2015, 16:59   #15
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Спасибо получилось!

Код:
dbViewImage.Canvas.StretchDraw(Rect, LImage);
KBO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при выводе Pasha_Sh Общие вопросы Delphi 7 27.03.2015 19:52
Вывод картинок в цикле БД MySQL sevalery PHP 2 09.07.2011 23:02
Очищается форма :( kerbeross JavaScript, Ajax 1 23.03.2011 22:12
Кракозябры при выводе Syltan HTML и CSS 4 11.12.2010 19:59