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

Итак, дело было вечером - делать было нечего.... Бесплатный (пробный) курс на Я.Практикуме подтолкнул зафиксировать полученные знания хоть как-нибудь, так родилась идея создания Калькулятора Лазерной Резки (далее КЛР), аплодисменты в студию!! Видео на ютубе "Учим python за 7 часов! Уроки Python Полный курс обучения программированию на python с нуля" канала Python Hub Studio придало уверенность.

Вот что получилось по коду:

while True:
    
    length = int(input('Длинна мм = '))           # в миллиметрах       длинна
    width = int(input('Ширина мм = '))           # в миллиметрах       ширина
    t = int(input('Толщина мм = '))                # в миллиметрах       толщина
    number_of_pieces = int(input('Кол-во деталей шт = '))   # кол-во деталей шт
    rezka = int(input('Длинна резки м/п = '))                                     # в метрах            резка длинна
    vstavki = int(input('Кол-во вставок шт = '))             # кол-во вставок при резке
    gibov = int(input('Кол-во гибов шт = '))                # кол-во шт           гибов

    metal_square= (length* width *0.000001)*number_of_pieces
    print(f'Площадь металла:{metal_square} м^2')

    metal_massa= length * width * t * number_of_pieces * 0.0000078
    print(f'Масса маталла: {metal_massa} кг')

    metal_money = metal_massa * 350
    print(f'Стоимость металла: {int(metal_money)} рублей')

    t_list=[ 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 20]
    price_list_100=[27, 36, 57, 64, 76, 87, 111, 154, 191, 224, 360, 519]
    price_list_101=[20, 28, 43, 50, 58, 68, 84, 125, 144, 186, 298, 432]
    for i in range(len(t_list)):
        if t == t_list[i] and rezka <= 100:
            rezka_price= price_list_100[i]
        elif t == t_list[i] and rezka >100:
            rezka_price= price_list_101[i]

    rezka_money = rezka * rezka_price
    if rezka_money < 5000:
        rezka_money = 5000
    print(f'Стоимость лазерной резки: {rezka_money} рублей')

    vstavki_money = vstavki * 10
    print(f'Стоимость вставок: {vstavki_money} рублей')

    
    if gibov <20:
        gibov_price = 200
    else:
        gibov_price = 100   
    gibov_money = gibov * gibov_price
    print(f'Стоимость гибки: {gibov_money} рублей')    
    print(f'ЕСЛИ МЕТАЛЛ НАШ: {metal_money + rezka_money + vstavki_money + gibov_money}')
    print(f'ЕСЛИ МЕТАЛЛ СВОЙ: {rezka_money + vstavki_money + gibov_money}')

Вот что получилось по выводу:

Заказы на нашем производстве стали просчитываться в 3 раза быстрее!! но пересмотрев курс на ютубе и на Я.Практикуме, пришло понимание что надо осваивать функции и похоже что мой КЛР ждет v2.0

На этот раз вот что получилось по коду:

t_list=[ 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 20]

price_list_100=[27, 36, 57, 64, 76, 87, 111, 154, 191, 224, 360, 519]

price_list_101=[20, 28, 43, 50, 58, 68, 84, 125, 144, 186, 298, 432]

def metal_params():
    global metal_cost
    length = int(input('Длинна мм = '))
    width = int(input('Ширина мм = '))
    global t
    t = int(input('Толщина мм = '))
    number_of_pieces = int(input('Кол-во деталей шт = '))
    global metal_cost
    metal_cost = length * width * t * number_of_pieces * 0.0000078 * 350
    return f'Площадь металла: {(length* width *0.000001)*number_of_pieces} м^2 \nМасса маталла:{length * width * t * number_of_pieces * 0.0000078} кг \nСтоимость металла:{metal_cost} рублей'

def cutting_cost():
    cutting_length = int(input('Длинна резки м/п = '))
    for i in range(len(t_list)):
        if t == t_list[i] and cutting_length <= 100:
            cutting_price= price_list_100[i]
        elif t == t_list[i] and cutting_length >100:
            cutting_price= price_list_101[i]
    global cutting_money
    cutting_money = cutting_length * cutting_price
    if cutting_money < 5000:
        cutting_money = 5000
    return f'Стоимость лазерной резки: {cutting_money} рублей'

def insert_cost():
    global insert_money
    insert_money = int(input('Кол-во вставок шт = ')) * 10
    return f'Стоимость вставок: {insert_money} рублей'

def bending_cost():
    bending_count = int(input('Кол-во гибов шт = '))
    if bending_count <20:
        bending_price = 200
    else:
        bending_price = 100
    global bending_money
    bending_money = bending_count * bending_price
    return f'Стоимость гибки: {bending_money} рублей'




def cost_out():
    metal = metal_params()
    cutting = cutting_cost()
    insert = insert_cost()
    bending = bending_cost()
    print (f'{metal}\n{cutting}\n{insert}\n{bending}')
    print (f'Если металл наш:{metal_cost + cutting_money + insert_money + bending_money} \nЕсли метал НЕ наш: {cutting_money + insert_money + bending_money}')

while True:
    cost_out()

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

Постепенно образовалась проблема следующего характера - никто не мог пользоваться этой программой, кроме меня. И заморачиваться установкой Python-а на комп ради одного калькулятора - так себе затея. Было решено - калькулятор в массы!! В этом оч помог краткий курс от https://python-scripts.com/ и тот же курс с канала Python Hub Studio прекрасно дополнил это дело по библиотекам TKINTER + pyinstaller, которые могут сделать из простого кода полноценное, самостоятельное приложение с расширением .exe! То есть, да, оно работает на любом компьютере как обыная прога.

Вот так пришло время КЛР V 3.0, код стал таким:

import tkinter as tk

# вводные данные из таблицы по стоимости лазерной резки
t_list = [1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 20]
price_list_100 = [27, 36, 57, 64, 76, 87, 111, 154, 191, 224, 360, 519]
price_list_101 = [20, 28, 43, 50, 58, 68, 84, 125, 144, 186, 298, 432]


# функция по просчету площади, массы, стоимости металла
def metal_params():
    metal_square = (int(ent_length.get()) * int(ent_width.get())
                    * 0.000001) * int(ent_number_of_pieces.get())
    lbl_metal_square["text"] = f"Площадь металла: {metal_square} m^2"
    metal_massa = int(ent_length.get()) * int(ent_width.get()) * \
                  int(ent_t.get()) * int(ent_number_of_pieces.get()) * 0.0000078
    lbl_metal_massa["text"] = f"Масса маталла: {metal_massa} кг"
    global metal_money
    metal_money = metal_massa * 100
    lbl_metal_money["text"] = f'Стоимость металла: {int(metal_money)} рублей'


# функция по просчету стоимости резки 
def cutting_cost():
    cutting_length = int(ent_rezka.get())
    for i in range(len(t_list)):
        if int(ent_t.get()) == t_list[i] and cutting_length <= 100:
            cutting_price = price_list_100[i]
        elif int(ent_t.get()) == t_list[i] and cutting_length > 100:
            cutting_price = price_list_101[i]
    global cutting_money
    cutting_money = cutting_length * cutting_price
    if cutting_money < 5000:
        cutting_money = 5000
    lbl_cutting_money["text"] = f'Стоимость лазерной резки: {cutting_money} рублей'


# функция по просчету стоимости вставок
def insert_cost():
    global insert_money
    insert_money = int(ent_vstavki.get()) * 5
    lbl_insert_money["text"] = f'Стоимость вставок: {insert_money} рублей'


# функция по просчету стоимости гибки 
def bending_cost():
    bending_count = int(ent_gibov.get())
    if bending_count < 20:
        bending_price = 200
    else:
        bending_price = 100
    global bending_money
    bending_money = bending_count * bending_price
    lbl_bending_money["text"] = f'Стоимость гибки: {bending_money} рублей'


# функция вызывает другие функции и считает итоговую стоимость, это команда для кнопки в приложении 
def cost_out():
    metal_params()
    cutting_cost()
    insert_cost()
    bending_cost()
    lbl_out_cost["text"] = f'Если металл наш: {metal_money + cutting_money + insert_money + bending_money}'
    lbl_out_cost2["text"] = f'Если метал НЕ наш: {cutting_money + insert_money + bending_money}'


# создали окно и название окна
window = tk.Tk()
window.title('Калькулятор заказов в мастерской')
window.resizable(width=False, height=False)

# создали рамку frm_data в которой разместили ярлыки и поля ввода
frm_data = tk.Frame(master=window)
lbl_length = tk.Label(master=frm_data, text='Длинна мм = ')
lbl_width = tk.Label(master=frm_data, text='Ширина мм = ')
lbl_t = tk.Label(master=frm_data, text='Толщина мм = ')
lbl_number_of_pieces = tk.Label(master=frm_data, text='Кол-во деталей шт = ')
lbl_rezka = tk.Label(master=frm_data, text='Длинна резки м/п = ')
lbl_vstavki = tk.Label(master=frm_data, text='Кол-во вставок шт = ')
lbl_gibov = tk.Label(master=frm_data, text='Кол-во гибов шт = ')

# поля ввода для каждого ярлыка
ent_length = tk.Entry(master=frm_data, width=10)
ent_width = tk.Entry(master=frm_data, width=10)
ent_t = tk.Entry(master=frm_data, width=10)
ent_number_of_pieces = tk.Entry(master=frm_data, width=10)
ent_rezka = tk.Entry(master=frm_data, width=10)
ent_vstavki = tk.Entry(master=frm_data, width=10)
ent_gibov = tk.Entry(master=frm_data, width=10)

# указываем положение ярлыков в рамке
lbl_length.grid(row=0, column=0, sticky="e")
lbl_width.grid(row=1, column=0, sticky="e")
lbl_t.grid(row=2, column=0, sticky="e")
lbl_number_of_pieces.grid(row=3, column=0, sticky="e")
lbl_rezka.grid(row=4, column=0, sticky="e")
lbl_vstavki.grid(row=5, column=0, sticky="e")
lbl_gibov.grid(row=6, column=0, sticky="e")

# указываем положение полей ввода в рамке
ent_length.grid(row=0, column=1, sticky="w")
ent_width.grid(row=1, column=1, sticky="w")
ent_t.grid(row=2, column=1, sticky="w")
ent_number_of_pieces.grid(row=3, column=1, sticky="w")
ent_rezka.grid(row=4, column=1, sticky="w")
ent_vstavki.grid(row=5, column=1, sticky="w")
ent_gibov.grid(row=6, column=1, sticky="w")

# обьявляем кнопку
btn_go = tk.Button(master=window, text='Посчитать', command=cost_out)

# рамка с результатами вычислений
frm_result = tk.Frame(master=window, width=1000)
# ярлыки в которых результаты вычислений
lbl_metal_square = tk.Label(master=frm_result, text='Площадь металла: ')
lbl_metal_massa = tk.Label(master=frm_result, text='Масса маталла: ')
lbl_metal_money = tk.Label(master=frm_result, text='Стоимость металла: ')
lbl_cutting_money = tk.Label(
    master=frm_result, text='Стоимость лазерной резки: ')
lbl_insert_money = tk.Label(master=frm_result, text='Стоимость вставок: ')
lbl_bending_money = tk.Label(master=frm_result, text='Стоимость гибки: ')
lbl_out_cost = tk.Label(master=frm_result, text='Если металл наш: ')
lbl_out_cost2 = tk.Label(master=frm_result, text='Если металл НЕ наш: ')
# указываем положение результатов в рамке результатов
lbl_metal_square.grid(row=0, column=0)
lbl_metal_massa.grid(row=1, column=0)
lbl_metal_money.grid(row=2, column=0)
lbl_cutting_money.grid(row=3, column=0)
lbl_insert_money.grid(row=4, column=0)
lbl_bending_money.grid(row=5, column=0)
lbl_out_cost.grid(row=6, column=0)
lbl_out_cost2.grid(row=7, column=0)

# указываем положение рамки и кнопки в общем окне
frm_data.grid(row=0, column=0, padx=10)
btn_go.grid(row=0, column=1, padx=10)
frm_result.grid(row=0, column=2, padx=10)

# шоб все заработало
window.mainloop()

ввод и вывод стал выглядеть так:

+ если меняется один параметр , появилась возможность поменять его значение "на лету", а не вбивать все данные заново
+ если меняется один параметр , появилась возможность поменять его значение "на лету", а не вбивать все данные заново

Сейчас учу тему по ООП, хз делать V 4.0 или что то более масштабное сообразить?... Кто дочитал до конца - красавчик.

Респект автору канала Python Hub Studio, Я.Практикуму и всем кто выкладывает образовательные материалы по программированию. Земной поклон вам, сделаю вам скидку при просчете заказа :-)

Комментарии (33)


  1. rudinandrey
    00.00.0000 00:00
    +1

    а еще проще можно было бы сделать на веб-странице, и еще проще можно было бы это сделать вообще на статической странице .html на языке JavaScript

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


    1. Alexufo
      00.00.0000 00:00

      Ага, вместо дистрибутивов ставь ноду ,обеспечивай доступность жаваскрипта. Следи за сертификатами. Безопасностью. Совет на 5 баллов)

      На codepen код выкладывается и ссылкой шарится.


    1. konst90
      00.00.0000 00:00
      +8

      Я бы вообще в Excel или Гугл-таблицах сделал. Задачка-то примитивная.


      1. ValeriyPu
        00.00.0000 00:00

        А почему не веб сервис с "нарисуйте где резать красной линией толщиной 4"?


        1. konst90
          00.00.0000 00:00
          +2

          По принципу разумной достаточности. В Экселе эта штука пишется за десять минут при наличии базовых навыков, отредактирует её при необходимости любой офисный работник, и работать оно будет без подъёма сервера.


          1. HerrDirektor
            00.00.0000 00:00
            +1

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


      1. kolchasik Автор
        00.00.0000 00:00
        -1

        да, ты прав! в гугл.табицах это было бы проще и удобней! но как это помогло бы в закреплении знаний в python.....


        1. konst90
          00.00.0000 00:00
          +1

          Да, здесь надо разделить задачи. Как освоение Питона - пример хороший. Как практически нужная штука - нет, в бизнесе (смотрим заголовок) такие решения скорее вредны чем полезны.


    1. sunnybear
      00.00.0000 00:00

      Можно через сниппет кода, закладку в браузере


  1. blueboar2
    00.00.0000 00:00
    +2

    У вас "Маталла" вместо "Металла" на скриншоте


  1. longclaps
    00.00.0000 00:00
    +3

        t_list=[ 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 20]
        price_list_100=[27, 36, 57, 64, 76, 87, 111, 154, 191, 224, 360, 519]
        price_list_101=[20, 28, 43, 50, 58, 68, 84, 125, 144, 186, 298, 432]
        for i in range(len(t_list)):
            if t == t_list[i] and rezka <= 100:
                rezka_price= price_list_100[i]
            elif t == t_list[i] and rezka >100:
                rezka_price= price_list_101[i]

    аплодисменты в студию!!

    Надо бы вам разузнать о словарях, а то как-то неловко получается.

    Я.Практикум, зачем так халтурите?


  1. avshkol
    00.00.0000 00:00

    Для того, чтобы этот код стал питоновским, заменить: for i in range(len(t_list)):

    на

    for i, t_list_item in enumerate(t_list):

    И вынести константы:

    REZKA_LIMIT = 100

    CUTTING_LIMIT = 5000


  1. HemulGM
    00.00.0000 00:00
    +10

    Вот твоя "программа" на Делфи, которую я написал за 10 минут и в 60 строк кода

    var
      Form4: TForm4;
      t_list: TArray<Integer> = [1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 20];
      price_list_100: TArray<Integer> = [27, 36, 57, 64, 76, 87, 111, 154, 191, 224, 360, 519];
      price_list_101: TArray<Integer> = [20, 28, 43, 50, 58, 68, 84, 125, 144, 186, 298, 432];
    
    implementation
    
    {$R *.fmx}
    
    procedure TForm4.metal_params;
    begin
      var metal_square :=(StrToFloat(ent_length.Text) * StrToFloat(ent_width.Text) * 0.000001) * StrToFloat(ent_number_of_pieces.Text);
      lbl_metal_square.Text := 'Площадь металла: ' + FloatToStr(metal_square) + ' m^2';
      var metal_massa := StrToFloat(ent_length.Text) * StrToFloat(ent_width.Text) * StrToFloat(ent_t.Text) * StrToFloat(ent_number_of_pieces.Text) * 0.0000078;
      lbl_metal_massa.Text := 'Масса металла: ' + FloatToStr(metal_massa) + ' кг';
      metal_money := metal_massa * 100;
      lbl_metal_money.Text := 'Стоимость металла: ' + CurrToStr(Round(metal_money)) + ' рублей';
    end;
    
    procedure TForm4.cutting_cost;
    begin
      var cutting_price := 0;
      var cutting_length := StrToFloat(ent_rezka.Text);
      for var i := 0 to Length(t_list) - 1 do
        if (StrToInt(ent_t.Text) = t_list[i]) and (cutting_length <= 100) then
          cutting_price := price_list_100[i]
        else if (StrToInt(ent_t.Text) = t_list[i]) and (cutting_length > 100) then
          cutting_price := price_list_101[i];
      cutting_money := cutting_length * cutting_price;
      if cutting_money < 5000 then cutting_money := 5000;
      lbl_cutting_money.Text := 'Стоимость лазерной резки: ' + CurrToStr(cutting_money) + ' рублей';
    end;
    
    procedure TForm4.insert_cost;
    begin
      insert_money := StrToFloat(ent_vstavki.Text) * 5;
      lbl_insert_money.Text := 'Стоимость вставок: ' + CurrToStr(insert_money) + ' рублей';
    end;
    
    procedure TForm4.bending_cost;
    begin
      var bending_price := 0.0;
      var bending_count := StrToFloat(ent_gibov.Text);
      if bending_count < 20 then bending_price := 200 else bending_price := 100;
      bending_money := bending_count * bending_price;
      lbl_bending_money.Text := 'Стоимость гибки: ' + CurrToStr(bending_money) + ' рублей';
    end;
    
    procedure TForm4.cost_out;
    begin
      metal_params();
      cutting_cost();
      insert_cost();
      bending_cost();
      lbl_out_cost.Text := 'Если металл наш: ' + IntToStr(Round(metal_money + cutting_money + insert_money + bending_money));
      lbl_out_cost2.Text := 'Если метал НЕ наш: ' + IntToStr(Round(cutting_money + insert_money + bending_money));
    end;
    
    procedure TForm4.btn_goClick(Sender: TObject);
    begin
      cost_out;
    end;

    Плюс, она не требует зависимостей и прям сейчас могу нажать кнопу и собрать её под Андроид, иОС, мак или линукс. Более я не писал ни строчки


    1. Bigata
      00.00.0000 00:00

      Брависсимо! Жаль не могу лайк поставить


      1. HemulGM
        00.00.0000 00:00
        +1

        После небольшого кол-ва кликов мышкой, мы получаем вот такое

        А ну и я ещё немного оптимизировал и улучшил код
        function TForm4.GetMetalCost(ALength, AWidth, ADepth, ANoP: Int64; out AMetalSquare, AMetalMassa: Extended): Extended;
        begin
          AMetalSquare := (ALength * AWidth * 0.000001) * ANoP;
          AMetalMassa := ALength * AWidth * ADepth * ANoP * 0.0000078;
          Result := AMetalMassa * 100;
        end;
        
        function TForm4.GetCuttingCost(ACuttingLength, ANoP: Int64): Int64;
        begin
          Result := 0;
          if FPriceList.ContainsKey(ANoP) then Result := ACuttingLength * FPriceList.Items[ANoP][Ord(ACuttingLength > 100)];
          if Result < 5000 then Result := 5000;
        end;
        
        function TForm4.GetInsertCost(AInsertCount: Int64): Int64;
        begin
          Result := AInsertCount * 5;
        end;
        
        function TForm4.GetBendingCost(ABendingCount: Int64): Int64;
        begin
          Result := IfThen(ABendingCount < 20, ABendingCount * 200, ABendingCount * 100);
        end;
        
        procedure TForm4.ButtonCalcClick(Sender: TObject);
        begin
          var ALength := StrToInt64(EditLength.Text);
          var AWidth := StrToInt64(EditWidth.Text);
          var ADepth := StrToInt64(EditDepth.Text);
          var ANoP := StrToInt64(EditNumberOfPieces.Text);
          var ACuttingLength := StrToInt64(EditCutting.Text);
          var AInsertCount := StrToInt64(EditInsert.Text);
          var ABendingCount := StrToInt64(EditBending.Text);
        
          var AMetalSquare: Extended;
          var AMetalMassa: Extended;
        
          try
            var MetalCost := GetMetalCost(ALength, AWidth, ADepth, ANoP, AMetalSquare, AMetalMassa);
            var CuttingCost := GetCuttingCost(ACuttingLength, ANoP);
            var InsertCost := GetInsertCost(AInsertCount);
            var BendingCost := GetBendingCost(ABendingCount);
        
            LabelDate.Text := FormatDateTime('dd.mm.yyyy h:NN:ss', Now);
            lbl_metal_money.Text := Format('%d рублей', [Round(MetalCost)]);
            lbl_metal_square.Text := Format('%f m^2', [AMetalSquare]);
            lbl_metal_massa.Text := Format('%f кг', [AMetalMassa]);
            lbl_cutting_money.Text := Format('%d рублей', [CuttingCost]);
            lbl_insert_money.Text := Format('%d рублей', [InsertCost]);
            lbl_bending_money.Text := Format('%d рублей', [BendingCost]);
            lbl_out_cost.Text := Format('%d р.', [Round(MetalCost + CuttingCost + InsertCost + BendingCost)]);
            lbl_out_cost2.Text := Format('%d р.', [CuttingCost + InsertCost + BendingCost]);
          except
            ShowMessage('Ошибка расчетов');
          end;
        end;

        Теперь он устойчив к ошибкам ввода и считает огромные числа

        Если нужно, я могу скинуть проект. Для его сборки достаточно поставить бесплатную версию среды Delphi. Открыть проект и нажать кнопку "Play". Сейчас в релизе ехе выходит 8мб


        1. Bigata
          00.00.0000 00:00

          да я к тому, что Вы быстро набросали прогу, хотя сам проверить не могу (не спец в Delphi), но почти уверен что можно запустить после компиляции достаточно легко на ... На винде?


          1. HemulGM
            00.00.0000 00:00

            На чем угодно можно запустить (собрать). Выглядеть будет одинаково. И работать


        1. falconandy
          00.00.0000 00:00
          +1

          Можно еще для подобных простых утилит использовать Terminal UI — например так примерно будет выглядеть с библиотекой tview для Go:



          Размер бинарника будет примерно 3-4мб.


          1. HemulGM
            00.00.0000 00:00

            Ну, если собрать на vcl, а не на fmx, как я. Это ограничит, конечно, виндой, но бинарник будет весь мб 2. Или меньше. Но при этом выглядеть могут примерно так же. Может чуть хуже


    1. vbra2022
      00.00.0000 00:00
      +2

      Делфи жив!


    1. erzi
      00.00.0000 00:00
      -1

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


      1. HemulGM
        00.00.0000 00:00
        +2

        А в чем сложность собрать? Кнопку одну нажать только надо) Ладно, две кнопки. Одну чтоб выбрать платформу, вторую, чтоб собрать приложение)


    1. UndefinedRef
      00.00.0000 00:00

      После вашего поста тоже захотел переписать на близкую к душе кроссплатформенную технологию.

      Поэтому вот приложение на Avalonia, которое запускается на Windows, Linux, MacOS, Android, IOS и WebAssembler (запускается в браузере)

      Исходный код на гитхаб для посмотреть


      1. HemulGM
        00.00.0000 00:00

        Столько кода ради 7 полей и одного вычисления. Собственно я как раз для обратного показывал пример. ВебАсм мы кстати тоже ждём для Делфи. А пока, если надо для веб, то через отдельный фреймворк. Но принцип тот же - меньше лишнего кода. Основное сосредоточение на функциональной части, а не на том как и где отображать


        1. UndefinedRef
          00.00.0000 00:00

          Да там большинство кода это шаблон.Но всё равно кода можно намного меньше было, просто я не стал всё писать в Code-behind в MVVM freandly фреймоворке.
          Столько кода, потому что вычисления вынесены в отдельный сервис, а сама приложение разбито на Model, ViewModel и View. Поэтому View такое жирное, т.к. живёт само по себе. И в принципе его без проблем можно оторвать от всего остального и безболезненно переписать.
          А сами ViewModel и Model там из нескольких строк состоят (равному количеству полей конечно же). Зато очень всё удобно и масштабируемо и хорошо разделяет ответственность. Конечно в данном конкретном случае это овернженеринг, но например к этому с 1 тычка прикручивается генератор PDF отчётов (с помощью PDF.Quest), т.к. модель отдельно существует.

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


          1. HemulGM
            00.00.0000 00:00

            У меня, на самом деле, пропущен только Model этап и контроллер не отделен от View model. Но это сделать, если надо можно легко. И так же все масштабировать. В делфи по умолчанию используется MVC/MVVM (там тонкая грань). Просто тогда ещё не было таких понятий, но уже принцип был похожий.

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

            Так что с масштабированием проблем тоже нет.

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

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

            Помимо всего этого, есть такая штука, как "стили". Что является не просто скиндвижком, а системой, которая позволяет применить вариант отображения для любого отображаемого контрола. Т.е. мы можем создать стиль кнопки, которая содержит внутри себя ещё кнопку или даже текстовое поле и применить этот стиль к кнопке в окне или вообще к любому контроля и он будет отображаться так, как мы сделали стиль. Можем создать стиль, в который поместим прямоугольник, настроим его цвет и другие параметры, настроим анимацию при наведении или нажатии, поместим текст и картинку слева и можем применить этот стиль к чему угодно. Да хоть модем кнопку отражать как таблицу (толку правда от такого мало). И все это опять же без кода. Как видим, так и настраиваем. Все применяется в дизайнтайме (в режиме реального времени).

            Ну и это только верхушка айсберга)

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


          1. HemulGM
            00.00.0000 00:00

            Или вот ещё, например, смена скина всего содержимого с эффектом. Нашел только ссылку на ВК видео Видео в вк


    1. CadMan77
      00.00.0000 00:00

      Хочу уметь также, но с Делфи опыта нет. Как на VBnet писать приложение с возможностью сборки по Вин и Андроид (если конечно возможно)? FMX это что-то, что позволяет вот это все?
      UPDATE:
      Вопрос снят.
      Нашел - FireMonkey Cross-Platform Framework.


  1. dndred
    00.00.0000 00:00
    +2

    Сейчас учу тему по ООП, хз делать V 4.0 или что то более масштабное сообразить

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

    ООП штука хорошая, но слишком большая. Советую для начала посмотреть что такое dataclass, а потом, перечитав тему Функции, переделать код ещё раз:

    1. Нужно разделить всё на две части - одна исключительно рисует форму и получае данные, а другая считает площадь и стоимость.

    2. Взаимодействие между ними должно сводиться к одной строчке: estimate = cost_out(order). 3. Ключеное слово global не использовать.

    4. В рассчётной части не должно быть ни одной русской буквы, кроме комментариев.

    Changes requested :-)


  1. MostwOnted7
    00.00.0000 00:00

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


  1. GeVulpe
    00.00.0000 00:00

    А где ООП учите?


    1. kolchasik Автор
      00.00.0000 00:00

      Ютуб- наглядный помошник #1


  1. velipre_xella
    00.00.0000 00:00

    Когда-то пытался стать оператором на лазерной резке TCL-3030, а сейчас в айтишке, и зп больше 100. Не думал, что до такого в родном екб доживу. Поставил автору лайк за статью, и+ в карму, - за замах.