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

Sashar333

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

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

  • Посещение

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

  1. В 03.05.2020 в 06:22, slav_z сказал:

    начнем с самого простого... с  сортировки массива... вверху ваш код, внизу - как бы сделал я...  вас спасает только то, что ваш массив содержит всего 2 элемента... ваша сортировка называется "метод пузырька" и не самая удачная реализация...

    1655311801_.png.9dbc95859667bdb6d433c00967062e3a.png

    Спасибо! Заменил!

  2. В 03.05.2020 в 06:37, slav_z сказал:

    - объект GetInfoCut создается у вас при каждом нажатии на кнопку...  разрушаете вы его в FormDestroy() - только последний экземпляр объекта...
    - объект GetInfoCut используется только в этом методе, больше нигде... поэтому объявлять его в классе нет необходимости...  прям здесь создайте и здесь же разрушьте (уберите его объявление в классе и вызов GetInfoCut.Free в FormDestroy() )...

    115935006_.png.80a035b95235a3c52568f27a700188a7.png

    Здравствуйте! Так не пойдет, GetInfoCut хранит массивы координат и размеров прямоугольников, и пользователь, кнопками Previous и Next, "бегает" по массиву :  

    Делаю так:image.thumb.png.ed86e0aab8a9fc98970ed375cb16936f.png

    и так:image.png.349d9578778dc82aa08485e0a1d2cbc2.png

    но если запустить программу, нажать StartCutting, поменять значение с 1500 на 2000, нажать StartCutting, поменять с 2000 на 3000, нажать StartCutting

    то вылетает ошибка:image.png.aa079a94a349f9e7f103dbbe06f22f75.png

     

    GetInfoCut.SetArrayFromUser(ListDetails) - загружает(передает) массив с размерами в переменную в класс, которая вычисляется в GetInfoCut.Execute;

    GetInfoCut.SetFlagsAndParametersCut(StrToInt(Edit2.Text),StrToInt(Edit3.Text),20) - устанавливаются параметры обработки(Ширина листа и длина):

    image.png.000bdfdf79a7286bef6c9692fbcf45fd.png

    GetInfoCut.SortList - сортировка для увеличения КПД вычислителя

    GetInfoCut.Execute - запуск вычислителя

    Procedure TSMC_Cutting.SetFlagsBreaksAndWillNotFit(var Detail:TDetail) - установка флагов типа boolean (Detail.WillNotFit - деталь в принципе не влезет в установленные ширину и длину, Detail.Breaks - деталь не влезет в определенный момент вычисления в "остаток", при нужде Breaks восстанавливает флаг, WillNotFit - не изменим!)

    function ArrayDetailsNotFree(ArrayDetails:array of TDetail):boolean - проверка на наличие не просчитанных деталей, исключая WillNotFit

    function max(y,x,y2,x2:double):double - вычисление максимального числа (КИМ - коэффициент использования материала)

    function TSMC_Cutting.GetDetailCuttingResult(numList,LayoutWitdh,LayoutLength,LenghtLayoutMax:integer;var Detail:TDetail;StockAllowance:integer):TDetailCuttingResult- главное вычисление расположения детали из цикла в определенный габарит, тут лучше ничего не трогать)) два года придумывал. Тут же вычисляются координаты для рисования и сохраняются в конце в ResutlForUser.ArrayForPaint

    function TSMC_Cutting.CuttingDetails(NumberSheet,LayoutWitdh,LayoutLength,LenghtLayoutMax:integer;var ArrayDetails:array of TDetail;StockAllowance:integer) - главная рекурсивная функция по деталям и вычисляемым остаткам листа, вызывает предыдущую функцию три раза, тут лучше тоже ничего не менять.

    function StopFitDetails(ArrayDetails:array of TDetail):boolean - проверка на отсутствие деталей для вычисления, исключая WillNotFit

    procedure SetBreaksToTrue(var ArrayDetails:array of TDetail); - обнуляем флаг на true для всех деталей, когда вычисляем НЕ из остатка а с цельного листа

    Function TSMC_Cutting.Execute:TResultForUser - возвращает все нужные данные для обработки пользователем

     

  3. 8 часов назад, slav_z сказал:

    не хотелось бы сильно вникать в вашу задачу, если работает, то очень хорошо... правильно/не правильно - это непростой вопрос... просто посмотреть код и принять верное архитектурное решение невозможно...  надо полностью разобраться в вашей задаче.... но времени сейчас просто нет на это...

    Не надо вникать во все)) проверьте, пожалуйста, правильно работы одного класса TSMC_Cutting, все равно иногда то зависает то вылетает, буду очень признателен...

  4. 20 часов назад, slav_z сказал:

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

    Вот, вроде все получилось, посмотрите пожалуйста, правильно я мысль Вашу понял?

    GECTOR NEW.7z

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

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

    Здравствуйте! Что то я запутываюсь, Вы не могли бы посмотреть, в правильном я направлении иду? Пока после кнопки "ButtonStartCutting" приложение не закрыть, но все же... хотя бы в общих чертах...

    GECTOR NEW.7z

  6. В 24.04.2020 в 19:17, slav_z сказал:

    вашему "вычислителю" должно быть все равно:

    -откуда и как были получены исходные данные (скачаны по http, получены по почте, загружены из файла и т.п.)

    -каков формат исходных данных (xls, json и т.д)

    -как будет использован результат вычисления (показан пользователю в UI (на форме), отправлен как ответ http, записан в файл)

    его работа - что-то посчитать и отдать результат...

     

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

    А как лучше сделать передачу данных от пользователя(ГабаритY, ГабаритX, Кол-во) в вычислитель?

    Вычислитель обрабатывает отсортированный(сортирует по убыванию и ставит в флаги в массиве) массив, при этом он меняет в нем Кол-во, и флаги(что бы понимать когда остановиться)... и создает массив координат(для Bitmap)

    Сделать поток который будет преобразовывать полученные данные(в каком виде лучше?) в массив, а потом поток для сортировки, а потом поток для координат?

    Или передать уже готовый массив в поток, это вообще возможно?

     

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

    fg

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

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

    gek.zip 63 \u043a\u0411 · 3 загрузки

    Сделал по Вашему примеру проверку статуса, но почему то работает через раз. Допустим, по умолчанию стоит номер 11249, нажимаем Search, все выводит. Как меняем на 11250 то ошибку выдает. А если изначально поставить 11250 то работает нормально, можете проверить пожалуйста... 

    GECTOR NEW.7z

  8. В 24.04.2020 в 19:17, slav_z сказал:

    вашему "вычислителю" должно быть все равно:

    -откуда и как были получены исходные данные (скачаны по http, получены по почте, загружены из файла и т.п.)

    -каков формат исходных данных (xls, json и т.д)

    -как будет использован результат вычисления (показан пользователю в UI (на форме), отправлен как ответ http, записан в файл)

    его работа - что-то посчитать и отдать результат...

    советы: разбивайте программу на логические модули, минимизируйте зависимости между ними (представьте что у вас несколько разработчиков которые говнокодят каждый свою задачу в проекте, и сильносвязанный код этого просто не позволит вам сделать), не используйте русские буквы в тексте программы (даже для комментариев...  я как то смотрел исходники какого то японца - там все было на иероглифах - мне его комментарии не помогли), и про транскрипцию тоже забудьте (русские слова английскими буквами)... почитайте про декларативное программирование, когда реализуете какой-то общий алгоритм уберите подальше все детали реализации (условия, циклы, работа с массивами)... что делает ваша функция function DetIn() ? - по названию должно быть понятно..  не используйте сокращения в названиях переменных...   type TVSE=record - ну что это такое?

    ОТДЕЛИТЕ логику программы от пользовательского интерфейса (не пишите логику программы в модуле формы - это беда программистов delphi) - вы должны иметь возможность легко заменить одну форму другой - это всего лишь объект для общения с пользователем... очень тяжелый совет: попробуйте написать ваше приложение как консольное...  а потом добавить в него GUI...

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

    ....я могу дать еще 1000 советов.... но сейчас вам от них станет только хуже...

    Спасибо! В общем все понятно, знакомо и одновременно сложно. Нужны учитель и практика. Вот я и хочу, что-бы мне это приложение переписали грамотно, а потом изучить сам код. Пока изучаю gek.zip...

  9. В 24.04.2020 в 18:24, Slym сказал:

    Так у тебя уже все есть... кроме отправки почты (а с ней не все так просто как кажется, все борются со спамом)
    Компонуй и получай свой гонорар :)
     

    Так да! Только там все на олдскульном все написано, на моем родном)), так то все работает, но глючит и зависает, вылетает и т.д.. Надо это все как то грамотным языком переписать

  10. 13 часов назад, #WAMACO сказал:

    Scale устройства учитываете?

    Что возвращает такая функция:

    
    function GetScreenScale: Single;
    var ScreenService: IFMXScreenService;
    begin
      Result := 1;
      if TPlatformServices.Current.SupportsPlatformService (IFMXScreenService, IInterface(ScreenService)) then
        Result := ScreenService.GetScreenScale;
    end;

     

    В общем вставил картинку в этот bitmap в начале приложения, типа логотипа, там, видимо все автоматом настроилось, а потом уже выводит в нормальном масштабе!

    Сапсибо!

  11. 12 минут назад, Slym сказал:

    1. Говорят - сначала сделай "какнибудь" - оптимизацию оставь на потом
    2. А книжку почитай... ООП там всякие... инкапсуляция там, переиспользование кода...

    по вашему списку
    1. Список счетов (желательно с оповещением статусов, типа как на СМС на ватсапе приходят)

    Кто их делать будет? Бекенд? На чем написан? или его нет?

    2. Онлайн каталог номенклатуры (калькулятор с разными расчетами, примерно как в Apk, думаю надо будет подробно объяснять как и что)
    Онлайн каталог ты получил выше...

    3. Раскрой листа (алгоритм я же сделал, просто внедрить): ввод списка с числами (габаритY, габаритX, кол-во) , показать изображение работы алгоритма:
    Прежде чем внедрять нужно понять к чему? Нафега клиенту твой алгоритм? Он не тебе материал экономит, а себе деньги... Сущьность какая? Заказ? список деталей? детали круглые/квадратные/в форме котиков?
    Кто раскрой делать будет? Клиент - ему это нафиг ненадо, хоть 1 деталь на лист. Бекенд? Админский фронтэнд? На чем написан? или его нет?

    4. Контакты (просто текстовая информация с ссылками)

    Тупо вывести на экран как Hello world...

    5. Отзыв (отправка текста мне на почту)

    Кто почту отправлять будет? Бекенд? На чем написан? или его нет?

    6. Загрузка файлы xls (прайс)

    Кто и главное куда (база) парсить будет? Бекенд? На чем написан? или его нет?

    Рано тебе клиентское приложение делать - я тебя бекенда нет по 1,3,5,6 пунктам...

    и того 2 или даже 3 программы: бекенд, клиентская часть, и одминка для приемщика заказа
    причем править имеющийся бекенд сайта тебе править низя :) иначе ты бы послушался и не парсил html а запилил нормальный JSON в нужном формате

     

    1-2 Понял

    По списку:

    1. Список делает пользователь(П) путем ввода номера счета от 1 до 20000+. 

    str.Add('numberOrder='+Form1.Edit1.Text);
    str.Add('dateOrder='+copy(datetoStr(now),0,2));
    str.Add('monthOrder='+copy(datetoStr(now),4,2));
    str.Add('yearOrder='+copy(datetoStr(now),7,4));
    tt:=TStringList.Create();
    tt.LoadFromStream(net.Post('https://gector-spb.ru/checkZakaz.php',str).ContentStream,TEncoding.UTF8);

    даты поиска счета задается пользователем, по умолчанию (now-30 : now)

    2. Есть

    3. Задача рассчитать сколько надо листа и сообшть-показать их пользователю(П). П вводит толщину, ширину и длину расчетного листа, т.е. всего один расчетный габарит, допустим 20х2000х6000 или 2х1250х2500 или 10х1500х3000,

    как правило максимум 2000х6000 и вводит список прямоугольников: 250х130 -10шт, 160х500 - 10шт и т.д., условно бесконечное коли-во. Фигурные не требуется!

    Алгоритм рассчитывает сколько надо листов которые указаны в начале расчета, т.е. клиент зная кол-во листов сможет их указать в калькуляторе и узнать сколько будет он стоить

    Вот кусок моего рабочего алгоритма (отдельный unit.pas): 

    function DetIn(numList,vy,vx,nebolee:integer;var det:tmasdet;prip:integer):tDetin;
    var i,newposy,newposx:integer;
        tmp:tmasdet;
        kol,kimY,kimX,kimY2,kimX2:double;
        revers:boolean;
    begin
    kol:=0;result.Влезло:=0;result.остY:=vy;result.испX:=0;
    revers:=false;newposx:=posx;newposy:=posy;
    kimy:=0;kimx:=0;
    if vx<=0 then
     begin
     if (det.gy+prip)<=nebolee then
       begin
         kol:=trunc(vy/(det.gx+prip));
         if kol>det.kol then kol:=det.kol;
         kimX:=kol*((det.gy+prip)*(det.gX+prip));
         kimX:=kimX/(Vy*(det.gY+prip));
       end
         else kimx:=0;
     if (det.gx+prip)<=nebolee then
       begin
         kol:=trunc(vy/(det.gy+prip));
        if kol>det.kol then kol:=det.kol;
        kimY:=kol*((det.gy+prip)*(det.gX+prip));
        kimY:=kimY/(Vy*(det.gX+prip));
       end
         else kimy:=0;
       if (kimy=0)and(kimx=0) then det.влезает:=false;
     end;
    if vx>0 then
     begin
     if ((det.gy+prip)<=vx) then
     begin
     kol:=trunc(vy/(det.gx+prip));
     if kol>det.kol then kol:=det.kol;
     kimX:=kol*((det.gy+prip)*(det.gX+prip));
     kimX:=kimX/(Vy*Vx);
     end else kimX:=0;
      if ((det.gx+prip)<=vx) then
      begin
      kol:=trunc(vy/(det.gy+prip));
      if kol>det.kol then kol:=det.kol;
      kimY:=kol*((det.gy+prip)*(det.gX+prip));
      kimY:=kimY/(Vy*Vx)
      end
      else kimY:=0;
       if ((det.gy+prip)<=vy) then
       begin
       kol:=trunc(vx/(det.gx+prip));
       if kol>det.kol then kol:=det.kol;
       kimX2:=kol*((det.gy+prip)*(det.gX+prip));
       kimX2:=kimX2/(Vy*Vx)
       end
       else kimX2:=0;
        if ((det.gx+prip)<=vy) then
        begin ....

     

    вызывается так:VSE:=play(StrToInt(Edit9.Text),StrToInt(Edit10.Text),masdet,i);

    где

    type tmasdet=record
        gy,gx,kol:integer;
        влезает:boolean;
        НИКАК:boolean;
      end;

     var  masdet:array of tmasdet;

      type TVSE=record
        ширина:integer;
        припуск:byte;
        КолЛист:array of integer; - тут кол-во требуемых листов
        МассивДляРис:array of trismas; - координаты в мм всей раскладки
        МассивДет0:array of tmasdet;
        МПРезки:integer; длина все контуров всех прямоугольников

     

    4. Да

    5. Просто анонимное письмо из Memo мне на почту

    6. Прайс просто скачать на устройство в папку download, и сразу открыть для просмотра, если это возможно устройством

    net.Get('https://gector-spb.ru/assets/files/price.xls',resultStream);
     

    НИКАКИХ ЗАКАЗОМ ПРИЕМОВ ЗАКАЗОМ ОТ КЛИЕНТА ПРИНИМАТЬ Не НАДО!

    это как визитная карточка с каталогом, списком счетов и калькулятором

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

     

     

  12. 50 минут назад, slav_z сказал:

    fg

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

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

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

    ну вот же, работает! все просто наверно))

    хотя говорят что лучше ListView(без тормозов) или нет!? там и поиск с верху можно выставить..

    а для чего много pas файлов, почему все в одном не сделать, удобство или что ?

     

     

  13. 20 минут назад, #WAMACO сказал:

    Выложите хотя бы тех.задание сюда, что нужно сделать, народ посмотрит и сразу прикинет, сможет Вам написать программу или нет...

    Так сверху все сообщил, если что еще надо скажите, задавайте вопросы... + свой apk выложил того что требуется (могу код выложить свой)

    1. Список счетов (желательно с оповещением статусов, типа как на СМС на ватсапе приходят)

    2. Онлайн каталог номенклатуры (калькулятор с разными расчетами, примерно как в Apk, думаю надо будет подробно объяснять как и что)

    3. Раскрой листа (алгоритм я же сделал, просто внедрить): ввод списка с числами (габаритY, габаритX, кол-во) , показать изображение работы алгоритма:

    4. Контакты (просто текстовая информация с ссылками)

    5. Отзыв (отправка текста мне на почту)

    6. Загрузка файлы xls (прайс)

    пока все вроде

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