Перейти к содержанию
Fire Monkey от А до Я

Sashar333

Пользователи
  • Постов

    108
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Sashar333

  1. 14 часов назад, OnePeople сказал:

     DialogService: IFMXDialogService;
     FMargin, FMinMargin: TRect;
     FPaperSize: TPointf;
     FUnits: TPageMeasureUnits;
     FOptions : TPageSetupDialogOptions;
    begin


      if TPlatformServices.Current.SupportsPlatformService(IFMXDialogService, DialogService) then
        DialogService.PageSetupGetDefaults(FMargin, FMinMargin, FPaperSize, FUnits, FOptions);

    Text8.Text := FMinMargin.Left.ToString + ' ' + FMinMargin.Top.ToString;

    А так сколько показывает?

    Всегда 6 7

  2. 2 часа назад, OnePeople сказал:

     uses PrinterAPI;

    var

    FkPrinter: TMyPrinter;

    begin

    FkPrinter:=TMyPrinter.Create(Printer.Printers[cbPrinters.ItemIndex].Device,true);
      OffsetX := FkPrinter.GetOffsetX;

      OffsetY := FkPrinter.GetOffsetY;

    Printer.Canvas.Offset := TPoint.Create(OffsetX , OffsetY );

    PrinterAPI.rar 4 \u043a\u0411 · 0 загрузок

    Сделал вот так:

    FkPrinter:=TMyPrinter.Create(Printer.ActivePrinter.Device,true);
    var OffsetX := FkPrinter.GetOffsetX;
    var OffsetY := FkPrinter.GetOffsetY;
    printer.Canvas.Offset := TPoint.Create(OffsetX , OffsetY);

     

    При выборе любого принтера (у меня их три), все Offset'ы = 0

    И печатает соответственно также ...

    Может еще есть варианты для пробы?

     

     

  3. 10 часов назад, haword сказал:

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

    у меня другая проблема была, у меня при печати текста было ощущение что весь текст на несколько градусов повернут что ли, и у буквы К вертикальная грань  сверху съезжала на 1 пиксель где то относительно низа. Но это было только при печати в pdf на macos.

    А как это смещение вычислить, сколько пикселей составляет это смещение?

    На разных принтерах оно разное?

    Требуется запуск печати двумя кнопками, без личных настроек пользователя:

    нажал кнопку печать - выбрал принтер - нажал кнопку ОК

  4. 12 часов назад, haword сказал:

    картинка ровная в image1 а на принтере косо? а так тоже криво? 

    Printer.Canvas.DrawBitmap(Image1.Bitmap, RectF(0,0, Image1.Bitmap.Width, Image1.Bitmap.Height) , RectF(0,0, Printer.PageWidth, Printer.PageHeight), 1);

     

     

    Не то что косо, происходит смещение, как-бы за границу видимости на листе.

    т.е. если если нарисовать вертикальную линию от 0,0 до 0,Printer.PageHeight, то она не напечатается у меня на принтере,

    а если, допустим, рисовать от 200,0 до 200,Printer.PageHeight то она печатается

    Мне требуется нарисовать таблицу максимальную по размерам листа, но она обрезается как на рисунке выше.

    Делал как в учебнике: 

    SrcRect := Image1.LocalRect;
    DestRect := TRectF.Create(0, 0, Printer.PageWidth, Printer.PageHeight);
    Printer.Canvas.DrawBitmap(Image1.Bitmap, SrcRect, DestRect, 1);

     

    или RectF(0,0, Image1.Bitmap.Width, Image1.Bitmap.Height) это совсем другое чем Image1.LocalRect ?

     

  5. В 23.12.2021 в 00:11, haword сказал:

    есть такой косяк у fmx. нельзя получить ширину этих полей у листа а соответственно печать немного кособочит. если есть возможность найдите (купите) fastreport fmx там они свои модули для печати написали и можно разобраться как работает. 

    как костыль, более-менее получается правильно когда сначала рисуешь на TBitmap потом копируешь картинку на канву принтера. НО! при этом появляется другой косяк, в fmx картинка не может быть больше 8000х8000 а у принтеров может быть разрешение и побольше. 

     

    Printer.Canvas.DrawBitmap(Image1.Bitmap, SrcRect, DestRect, 1);

    С bitmap'ом тоже так же печатает.

    Может существует максимальное для принтеров смещение (PHYSICALOFFSETX)?

     

  6. 8 часов назад, haword сказал:

    есть такой косяк у fmx. нельзя получить ширину этих полей у листа а соответственно печать немного кособочит. если есть возможность найдите (купите) fastreport fmx там они свои модули для печати написали и можно разобраться как работает. 

    как костыль, более-менее получается правильно когда сначала рисуешь на TBitmap потом копируешь картинку на канву принтера. НО! при этом появляется другой косяк, в fmx картинка не может быть больше 8000х8000 а у принтеров может быть разрешение и побольше. 

     

    Все понятно, всем спасибо!

     

  7. 14 часов назад, OnePeople сказал:

    Вы печатаете с начала листа, но существуют так называемые "аппаратные поля" или "физические поля", в зависимости от возможностей принтера: это область, недоступная для печати, вокруг бумаги; то есть, если вы нарисуете что-то в этой области, оно не будет напечатано - эти поля зависят от принтера, и в некоторых случаях можно получить значения этих полей с помощью вызова

        LeftSpace := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
        TopSpace := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);

    Про поля понял, спасибо!

    а где и как можно получить Printer.Handle?

    в FMX.Printer не могу найти его ...

     

  8. Здравствуйте!

    Подскажите пожалуйста в чем причина смещения изображения при печати по горизонтали относительно листа?

    procedure ThePrint(day : arraySheet; prn : TPrintDialog);
    var
      DestRect, Rect_cell, Rect_Size:TRectF;
      i,pageall:integer;
      textFill: tFillTextFlags;
      poses : TPoses;
      Col1 : boolean;
      COLROW : integer;
      sizeRow : Single;
      Image : TImage;
    begin
      textFill := [];
      COLROW := 63;

      Printer.ActivePrinter := Printer.Printers[1];
      Printer.ActivePrinter.SelectDPI(Printer.ActivePrinter.DPI[Printer.ActivePrinter.DPICount-1]);

      Printer.BeginDoc;

      sizeRow := Printer.PageHeight / COLROW;
      poses := getPosY(day, sizeRow);

      Printer.Canvas.BeginScene;
      Printer.Canvas.Font.Size := sizeRow * 0.8;
      Printer.Canvas.Font.Family := 'Times New Roman';
      Printer.Canvas.Fill.Color := TAlphaColorRec.Black;
      Printer.Canvas.Fill.Kind := TBrushKind.Solid;
      Col1 := true;

      var WCol := Printer.PageWidth / 2 - 10;
      var WColW := WCol / 3;

      for var s := 0 to Length(poses)-1 do
        begin
          if Col1 then
            DestRect := RectF(0, poses[s], WCol, poses[s] + sizeRow)
          else
            DestRect := RectF(WCol, poses[s], Printer.Canvas.Width, poses[s] + sizeRow);

          Printer.Canvas.Font.Style:= Printer.Canvas.Font.Style + [TFontStyle.fsBold];
          Printer.Canvas.FillText(DestRect,day[0].listSheme[s].name,True,1,textFill,TTextAlign.Center,TTextAlign.Center);
          Printer.Canvas.Font.Style:= Printer.Canvas.Font.Style - [TFontStyle.fsBold];

          for var p := 0 to Length(day[0].listSheme[s].listPosition) - 1 do
            begin
              var nameSize := day[0].listSheme[s].listPosition[p].t + 'x' + day[0].listSheme[s].listPosition[p].w + 'x' +
                          day[0].listSheme[s].listPosition[p].l + '=';
              if day[0].listSheme[s].listPosition[p].c.ToInteger > 1 then
                nameSize := nameSize + day[0].listSheme[s].listPosition[p].c + 'л';


              Rect_cell := RectF(10, poses[s] + (sizeRow * (p+1)), WCol-30, poses[s] + (sizeRow * (p+2)));
              Rect_Size := RectF(0, poses[s] + (sizeRow * (p+1)), WCol - WColW, poses[s] + (sizeRow * (p+2)));
              if not Col1 then
              begin
                Rect_cell.Left := Rect_cell.Left + WCol + 20;
                Rect_cell.Right := Rect_cell.Right + WCol + 10;
                Rect_Size.Left := Rect_Size.Left + WCol + 20;
                Rect_Size.Right := Rect_Size.Right + WCol + 10;
              end;
              Printer.Canvas.FillText(Rect_cell, day[0].listSheme[s].listPosition[p].pn + ')' + day[0].listSheme[s].listPosition[p].s,
                True,1,textFill,TTextAlign.Leading,TTextAlign.Center);
              Printer.Canvas.FillText(Rect_Size, nameSize, True,1,textFill,TTextAlign.Trailing,TTextAlign.Center);
            end;


          Col1 := not(Col1);
        end;
      for var row  := 1 to COLROW do
      begin

        Printer.Canvas.DrawLine(TPointF.Create(0, sizeRow * row), TPointF.Create(WCol, sizeRow * row), 0.5);
        Printer.Canvas.DrawLine(TPointF.Create(WCol + 20, sizeRow * row), TPointF.Create(Printer.Canvas.Width, sizeRow * row), 0.5);
      end;

      DestRect := RectF(0, 0, Printer.Canvas.Width, sizeRow);
      Printer.Canvas.FillText(DestRect, day[0].name, True, 1, textFill, TTextAlign.Center,TTextAlign.Center);


      Printer.Canvas.DrawLine(TPointF.Create(WCol, sizeRow), TPointF.Create(WCol, Printer.Canvas.Height), 1);
      Printer.Canvas.DrawLine(TPointF.Create(WCol + 20, sizeRow), TPointF.Create(WCol + 20, Printer.Canvas.Height), 1);
      Printer.Canvas.DrawLine(TPointF.Create(0, sizeRow), TPointF.Create(500, Printer.Canvas.Height), 1);
      Printer.Canvas.DrawLine(TPointF.Create(Printer.Canvas.Width, sizeRow), TPointF.Create(Printer.Canvas.Width, Printer.Canvas.Height), 1);
      Printer.Canvas.DrawLine(TPointF.Create(WCol-WColW+20, sizeRow), TPointF.Create(WCol-WColW+20, Printer.Canvas.Height), 1);
      Printer.Canvas.DrawLine(TPointF.Create(Printer.Canvas.Width-WColW+20, sizeRow), TPointF.Create(Printer.Canvas.Width-WColW+20, Printer.Canvas.Height), 1);

      Printer.Canvas.EndScene;

      Printer.EndDoc;
    end;

    ВОТ ЧТО ПОЛУЧАЕТСЯ:

    image.thumb.png.d43d86e8cbd7fa73f2e09c1061cb35c9.png

    Линия спецом под угол, что бы понять само смещение в лево относительно листа.

    Соответственно текст тоже видно на половину

    Написано на Delphi 11, FMX.Printer

    Заранее спасибо!

     

  9. В 24.04.2020 в 13:03, slav_z сказал:

    fg

    если б все было так просто...

    я приложил проект - загрузка вашего списка... работает под windows и android... под ios тоже будет (должно... возиться с маком и айфоном чета лень)

    gek.zip 63 \u043a\u0411 · 6 загрузок

      В 28.05.2020 в 09:22, Sashar333 сказал:

    тут правильно все сделано?

    вроде правильно... только ошибки в английских словах исправьте (Catolog)...  если тормоза есть -  это уже fmx (еще очень далеко до совершенства).....  тут или смириться или искать собственные пути отображения списков...

    Здравствуйте! А Вы можете написать тоже самое что и в ранее написанном Вами gek.zip, только на Java, для разбора в AndroidStudio? или тормоза там такие же могут возникнуть как и FMX, Вы не в курсе случайно?

    Заранее спасибо за ответ!

     

  10. 14 часов назад, slav_z сказал:

    загружаются стили в элементы списков (по-умолчанию они загружаются когда надо в первый раз нарисовать элемент...)  попробуйте использовать BeginUpdate перед созданием и EndUpdate после... (вообще всегда используйте эти методы при создании списков на экране)

    так используются они:image.png.cf2427e302441aa158e23ef0558d8344.png

    это с Вашего примера я взял, отлично все работает, но зависает, там порядка 400 элементов примерно ...

    в FormCreate создается поток:image.png.26471529ba17a05debe54965b8567aea.png

    при завершении вызывается создание списка image.png.4be9c5f31af24b635fd8ad7674a8d387.png

    тут правильно все сделано?

     

     

  11. В 24.04.2020 в 13:03, slav_z сказал:

    fg

    если б все было так просто...

    я приложил проект - загрузка вашего списка... работает под windows и android... под ios тоже будет (должно... возиться с маком и айфоном чета лень)

    gek.zip 63 \u043a\u0411 · 5 загрузок

    Здравствуйте! Подскажите пожалуйста, почему при первом переключении с начальной вкладки TTabControl на вкладку с заполненным ListView(в FormCreate) приложение подвисает на пару секунд и можно как то сделать чтобы не повисало? Так же происходит и при переключении на другие вкладки, где просто TImage и Label. А когда везде побываешь то перестает зависать. 

  12. В 03.05.2020 в 06:45, slav_z сказал:

    добавьте эту строку в исходник проекта... будете получать сообщения при выходе из программы если будут утечки памяти (под windows)...
    с ними надо сразу разбираться... нажмите на вашу кнопку два раза и получите сообщение об утечке памяти при выходе...

    1356729547_.png.ecc9cc6327859a96bb35c5d4fec7f57b.png1423598940_.png.614e2845a428764aaba2e4eb27337742.png

    Здравствуйте!

    Подскажите пожалуйста как понять и искать эти утечки памяти: image.png.c18b45719936ae348d2e2ecf38176816.png 

  13. 11 часов назад, slav_z сказал:

    хорошо! тогда обнуляйте ExceptionMessage вместе с break; т.к. на одной из предыдущих итерации сервер может вернуть не 200 (черт его знает)... и вообще проверка <>'Такой но...' должна выполняться только если сервер вернул 200.... кроме того надо выходить из цикла если пользователь закрывает программу во время вашей обработки (Thread.CheckTerminated кажется)...  иначе, пока ваш цикл полностью не отработает, программа не закроется...

    Спасибо! Я правильно Вас понял?: image.png.adcbcaf7b981317fd19ab826a8b2d86d.png

  14. 51 минуту назад, slav_z сказал:

    image.png.9d295fa5c380386e5c69e984825e0d40.png

    тут у вас две ошибки...

    посмотрите внимательно на код... одна такая ошибка у вас уже была (очистка stream перед КАЖДЫМ запросом)... 

    и как у вас будет здесь происходить обработка результата? в OnThreadTerminate вы попадете только после завершения цикла... если вам нужно передавать результат в форму на каждой итерации цикла то это так не будет...

    Понял, size вставить в цикл! Спасибо!

    Тут задача такая: выполнять запрос на сайт разные даты, начиная с сегодняшней, заканчивая = (сегодня минус OffsetDateDay дней), до тех пор пока не найдет этот счет (пока статус не покажет другой, отличимый от "Такой номер заказа не найден") или кончаться даты. Теперь вроде все работает как надо!

  15. Еще вопрос, добавил цикл по датам:image.png.9d295fa5c380386e5c69e984825e0d40.png

    , но почему как то не корректно показывает иногда, на сайте так:image.png.ad5e83852edf34c4e19a79315e11df10.png  

    а приложении так:image.png.f316e316e25be7d5fe86eaa98ec67e08.png

    а иногда даже так:image.png.b9b27af6687d0f5b497c8cf45da00214.png

    даже когда статусы одинаковые сайт показывает, допустим 11603 от 29.04.2020 и 10742 от 28.04.2020 , оба выполнены ?

  16. Вы можете еще подсказать, как лучше сделать заполнение пользователем размеров прямоугольников и кол-в. Я так понял что лучше ListView использовать, но как его настроить и добавить строчку с тремя Edit'ми и кнопкой "удалить строчку, не могу понять?

  17. 15 часов назад, slav_z сказал:

    не передавайте в эту процедуру TImage (TControl) передавайте TBitmap..  если передаете динамические массивы или записи в качестве параметров в процедуру пишите const....

    но в общем рисование так не делается...  создавать отдельный юнит для одной процедуры не стоит... другое дело если в нем будут все процедуры для рисования, но ваша процедура специфична и вряд ли будет вызываться из другого места в программе...

    1483695273_.png.3c8879c7c0ec21d7dec3a8e019541d62.png

    спасибо исправил, отдельный юнит это может потом еще что надумаю добавить каких процедур.

  18. 15 часов назад, slav_z сказал:

    хвалить вас еще рано... когда смотрите на свой код, ОН ВАМ ДОЛЖЕН НРАВИТЬСЯ... вы должны испытывать эстетическое  удовольствие... придерживайтесь стандартного форматирования - возможно ваш код завтра будет писать другой человек-программист... (я сам не везде придерживаюсь...   но советы же давать легко... "после меня хоть потоп" - тоже сказано не зря...  другое дело когда проект open source - за свой код не должно быть стыдно...) хороший код - красивый код... если хотите, напишу про распределение по юнитам и переменным...

    хочу...

  19. 11 часов назад, slav_z сказал:

    Здравствуйте! Да, изучал все это, алгоритмы не устроили кроме одного, который и реализовал(но не до конца еще). Потом, может быть, хотя и этого будет достаточно для наших клиентов, попрошу ребят из НИП Информатики помочь с более продвинутым алгоритмом...

  20. Скажите, теперь само написание кода нормальное я в правильном направлении иду, распределение кода по unit'ам и оформление классов и переменных в общем?

    Там осталось калькулятор металла сделать, отправку по почте сделать, и контактную информацию, но самое сложное именно вычисление и рисование...

  21. 7 часов назад, slav_z сказал:

    вот здесь у вас ошибка... вы пишите за пределы массива ArrayDetails... его размер = 2 (Length(ArrayDetails)=2)...  следующая строка после цикла for на второй итерации  обращается к 4-му элементу массива, которого нет... запись происходит в область памяти занятой другим объектом (возможно TCanvas вашего TImage.Bitmap)...

    1504395607_.png.1badab0e9e84ae95adf424c6fb3b7b02.png

    такие ошибки сложно найти и последствия от них непредсказуемы... поэтому, если делаете такие ошибки включите галочку в опциях проекта Range checking = true, тогда будете сразу получать ошибку ERangeError при обращении к элементам массива за его пределами...

    2044738464_.png.431b2262ed9cae228201348d33ffaa95.png

    Вот за это особое СПАСИБО! Ошибка моя, экспериментировал с циклом и забыл убрать "*3". Исправил, пока больше вылетов не было!!! Ура

  22. 11 часов назад, slav_z сказал:

    как ошибка выглядит?  BitmapSizeWitdh и BitmapSizeLength чему равны в этом случае ? ( у вас очепятка в слове Witdh...)

     

    а. вижу...  Image.Bitmap скорее всего = nil

    Спасибо! Опечатку исправил, с переменными все нормально происходит, Image.Bitmap рисует

×
×
  • Создать...