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

Требуется приложение на на все смартфоны


Рекомендуемые сообщения

8 часов назад, Sashar333 сказал:

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

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

Ссылка на комментарий
  • Ответов 92
  • Создана
  • Последний ответ

Топ авторов темы

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

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

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

Ссылка на комментарий
В 01.05.2020 в 10:18, Sashar333 сказал:

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

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

Ссылка на комментарий

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

1655311801_.png.9dbc95859667bdb6d433c00967062e3a.png

Ссылка на комментарий

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

115935006_.png.80a035b95235a3c52568f27a700188a7.png

Ссылка на комментарий

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

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

Ссылка на комментарий

пока все... напишите что должен делать TSMC_Cutting... там у вас слишком много непонятного кода... подозреваю что можно раз в 20 сократить, если понять что должен делать класс... я не понял...

Ссылка на комментарий
В 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 - возвращает все нужные данные для обработки пользователем

 

Ссылка на комментарий
В 03.05.2020 в 06:22, slav_z сказал:

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

1655311801_.png.9dbc95859667bdb6d433c00967062e3a.png

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

Ссылка на комментарий
3 часа назад, Sashar333 сказал:

точнее при смене значения в переменной BitmapSizeWitdh

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

 

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

Изменено пользователем slav_z
не увидел
Ссылка на комментарий

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

1504395607_.png.1badab0e9e84ae95adf424c6fb3b7b02.png

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

2044738464_.png.431b2262ed9cae228201348d33ffaa95.png

Ссылка на комментарий
11 часов назад, slav_z сказал:

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

 

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

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

Ссылка на комментарий
11 часов назад, slav_z сказал:

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

Все верно! Слабое подобие для примерного просчета

Ссылка на комментарий
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". Исправил, пока больше вылетов не было!!! Ура

Ссылка на комментарий

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

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

Ссылка на комментарий
8 часов назад, Sashar333 сказал:

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

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

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

Ссылка на комментарий
8 часов назад, Sashar333 сказал:

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

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

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

1483695273_.png.3c8879c7c0ec21d7dec3a8e019541d62.png

Ссылка на комментарий
11 часов назад, slav_z сказал:

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

Ссылка на комментарий
15 часов назад, slav_z сказал:

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

хочу...

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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