Страницы

Поиск по вопросам

среда, 12 февраля 2020 г.

SQL-запрос для массового заполнения таблицы

#sql #запрос


Приветствую, мне надо прописать одну картинку для товаров с id от 1 до 1261

Команда

INSERT INTO `catalogue_productimage` (`id`, `original`, `caption`, `display_order`,
`date_created`, `product_id`)
VALUES (1, 'images/products/2016/09/none.png', '', 0, '2016-09-29 11:07:36', 1);


делает нужное для товара с id 1. Не в ручную же 1261 такой запрос создавать, подскажите,
как автоматизировать.
    


Ответы

Ответ 1



Предполагаю, что у вас есть некая таблица продуктов в которой уже существуют записи с такими id и вы хотите в связанную с ней таблицу изображений вставить указанные строки. Если так, то вы можете написать что то вроде: INSERT INTO `catalogue_productimage` (`id`, `original`, `caption`, `display_order`, `date_created`, `product_id`) select id, 'images/products/2016/09/none.png', '', 0, '2016-09-29 11:07:36', id from products where id between 1 and 1261 Если такой таблицы нет, то можно воспользоваться самой же таблицей catalogue_productimage. Для этого вставляем в нее вашу первую запись, а последующие вставляем несколькими запросами вроде таких (если в таблице изначально только 1 запись): INSERT INTO `catalogue_productimage` (`id`, `original`, `caption`, `display_order`, `date_created`, `product_id`) select id+1, original, caption, display_order, date_created, id+1 from catalogue_productimage; INSERT INTO `catalogue_productimage` (`id`, `original`, `caption`, `display_order`, `date_created`, `product_id`) select id+2, original, caption, display_order, date_created, id+2 from catalogue_productimage; INSERT INTO `catalogue_productimage` (`id`, `original`, `caption`, `display_order`, `date_created`, `product_id`) select id+4, original, caption, display_order, date_created, id+4 from catalogue_productimage; Фокус в том, что каждый последующий запрос создает в 2 раза больше записей, чем предыдущий, таким образом что бы дойти до значений около 1261 нам понадобится не более 11 таких запросов. Запросы отличаются друг от друга только прибавлением к ID очередной степени двойки. В последнем запросе нам надо будет ограничить максимальный id, запрос тогда получит условие where id<=1261-1024.

потеря значения поля C#

#c_sharp


    namespace DZ_4
{
    class Program
    {
        static void Main(string[] args)
        {
            TeamLeader pr1 = new TeamLeader();
            pr1.Condition();//проверяем состояние стройки: построен или нет фундамент
            Basement bsm = new Basement();
            bsm.Installation();
            pr1.Condition();//проверяем состояние стройки: построен или нет фундамент
(ОПЯТЬ ВОЗВРАЩАЕТ, ЧТО ФУНДАМЕНТ НЕ ПОСТРОЕН)
        }

        class TeamLeader
        {
            public void Condition()//метод для проверки состояния строительства
            {
                House b = new House();
                b.Condition();//метод для проверки постройки фундамента
            }
        }

        class House : TeamLeader
        {
            private int Bsement { get; set; }

            public new void Condition()
            {
                if (Bsement == 1)
                {
                    Console.WriteLine("Фундамент построен");
                }
                else
                {
                    Console.WriteLine("Фундамент не построен");
                }
            }

            public void Result(int b)
            {
                Bsement = b;
            }
        }

        class Basement : House
        {
            public void Installation()//отрисовка фундамента
            {
                Console.WriteLine("Солнце всходит - пора за работу!");
                System.Threading.Thread.Sleep(4000);

                Console.BackgroundColor = ConsoleColor.DarkBlue;
                Console.Clear();
                for (int i = 0; i <= 50; i++)
                {
                    Console.Write("_");
                    System.Threading.Thread.Sleep(40);
                }
                Console.WriteLine();
                for (int i = 0; i <= 5; i++)
                {
                    Console.Write("I");
                    for (int j = 0; j <= 48; j++)
                    {
                        Console.Write(" ");
                    }
                    Console.WriteLine("I");
                    System.Threading.Thread.Sleep(40);
                }

                System.Threading.Thread.Sleep(100);
                Console.BackgroundColor = ConsoleColor.Blue;
                for (int i = 0; i <= 50; i++)
                {
                    Console.Write("-");
                    System.Threading.Thread.Sleep(40);
                }
                Console.WriteLine();
                Console.WriteLine("Стоп!");
                Result(1);//передаем флажок об окончании строительства
            }
        }        
    }
}


При повторном вызове метода Condition() экземпляра TeamLeader pr1, после отрисовки
фундамента и установки флажка об окончании строительства, метод опять возвращает 0,
то есть "фундамент не построен". В чем загвоздка и как это исправить?
    


Ответы

Ответ 1



Я бы сделал так: Прораб и дом — отдельные сущности. Прорабу могут дать задание заняться домом. Фундамент тоже не является домом, никак. Дом включает в себя фундамент. Не дело главной программы создавать фундамент. И не дело фундамента устанавливать самого себя в дом. Это выливается в такой код: static void Main(string[] args) { House house = new House(); TeamLeader pr1 = new TeamLeader(); pr1.WorkOnHouse(house); bool hasBasement = house.Basement != null; if (hasBasement) Console.WriteLine("Фундамент есть"); else Console.WriteLine("Фундамента нет"); pr1.ConstructBasement(); hasBasement = house.Basement != null; if (hasBasement) Console.WriteLine("Фундамент есть"); else Console.WriteLine("Фундамента нет"); } Теперь прораб. class TeamLeader { House house; // текущая стройка // посылаем на объект public WorkOnHouse(House house) { this.house = house; } public ConstructBasement() { if (house == null) throw new InvalidOperationException("Сначала направьте на стройку"); if (house.Basement != null) throw new InvalidOperationException("Да есть уже фундамент, чё совсем ку-ку?"); Basement basement = new Basement(); basement.Construct(); // строим house.Basement = basement; } } Теперь дом. Он простой как... угол дома! class House { public Basement Basement { get; set; } // тут будут другие части дома } Ну и фундамент. class Basement { bool IsConstructed { get; private set; } = false; public void Construct() { Console.WriteLine("Солнце всходит - пора за работу!"); // и так далее Console.WriteLine("Стоп!"); IsConstructed = true; // Result(1); // это не нужно, не дело фундамента ставить флаги } }

Ответ 2



Тут у вас ничего не теряется просто ОБЪЕКТЫ bsm и pr1 никак не связаны, и как следствие изменения в одном никак не отображается на другом. Кроме того у вас довольно странная архитектура наследования - фундамент наследует зданию, а прораб включает в себя здание (наверное в качестве третей ноги). Тут пожалуй для фундамента следует использовать композицию, а прораба переработать в интерфейс.

Кастомные блоки на сайте

#html #css #вёрстка #svg


Как сделать что-то вроде такого? 
Ну или в форме трапеции или в форме сферы ну или в любой другой форме.

Есть ли способ проверить наведение :hover ровно по краям, а не прямоугольником.

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


Ответы

Ответ 1



Пример 1 с боковыми белыми блоками :after и :before: .intro { position: relative; min-height: 200px; height: 100%; width: 100%; background: transparent url(https://images.unsplash.com/photo-1432821596592-e2c18b78144f?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&s=3f9c78df0edb464244bbabb04d1797d8) top center no-repeat; background-size: 100%; transition: all .27s ease-in-out; } .intro:hover { -webkit-background-size: 110%; background-size: 110%; } /* Для верхнего блока */ .intro_t:before, .intro_t:after { content: ''; display: block; position: absolute; bottom: 0; width: 0; height: 0; } /* Для нижнего блока */ .intro_b:before, .intro_b:after { content: ''; display: block; position: absolute; top: 0; width: 0; height: 0; } .intro_t:before { left: 0; width: 50%; right: 50%; margin-left: 0px; border-bottom: 50px solid #fff; border-right: 50px solid transparent; } .intro_t:after { right: 0; width: 50%; left: 50%; margin-right: 0px; border-bottom: 50px solid #fff; border-left: 50px solid transparent; } .intro_b:before { left: 0; width: 50%; right: 50%; margin-left: 0px; border-top: 50px solid #fff; border-right: 50px solid transparent; } .intro_b:after { right: 0; width: 50%; left: 50%; margin-right: 0px; border-top: 50px solid #fff; border-left: 50px solid transparent; } /* Доп.стили */ body, html { margin: 0; padding: 0; background: #fff; } *, *:before, *:after { box-sizing: border-box; } .some__content { padding: 2rem; }
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Modi, est.
Пример 2 с clip-path: .intro { display: inline-block; vertical-align: top; padding: 0; width: 100%; min-height: 250px; background: url(https://images.unsplash.com/photo-1464822759023-fed622ff2c3b?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&s=61282cfeed75871385c84c2a44a8e594) bottom no-repeat; background-size: 100%; transition: all .27s ease-in-out; } .intro:hover { -webkit-background-size: 110%; background-size: 110%; } .clip-wrap-1 { -webkit-clip-path: polygon(0 0, 100% 0, 100% 200px, 60% 200px, 50% 250px, 40% 200px, 0% 200px); clip-path: polygon(0 0, 100% 0, 100% 20%, 60% 20%, 50% 30%, 40% 20%, 0% 20%); } .clip-wrap-2 { -webkit-clip-path: polygon(0 0, 40% 0%, 50% 50px, 60% 0%, 100% 0%, 100% 200px, 0% 200px); clip-path: polygon(0 0, 40% 0%, 50% 10%, 60% 0%, 100% 0%, 100% 20%, 0% 20%); } /* Доп.стили */ body, html { margin: 0; padding: 0; background: #fff; } *, *:before, *:after { box-sizing: border-box; } .some__content { padding: 2rem; }
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Modi, est.


Ответ 2



Такие треугольники удобно делать через CSS. Вот пример кода с сайта htmlbook.ru для понимания работы с треугольниками в CSS: .block { background: green; border-radius: 10px; padding: 20px; position: relative; color: #fff; } .block::after { content: ''; position: absolute; /* Абсолютное позиционирование */ left: 20px; bottom: -20px; /* Положение треугольника */ border: 10px solid transparent; /* Прозрачные границы */ border-top: 10px solid green; /* Добавляем треугольник */ } Свойствами position (top, bottom, left, right) можно управлять положением кастомного треугольника.

Закрыть Form1, открыть Form2

#c_sharp #winforms


Да-да-да, понимаю, тема "заезжая", но сколько я не рыл, ни где толком не объясняется
почему все скрывают/показывают форму так:

Form2 frm = new Form2();
this.Hide();
frm.Show();


Таким способом, активная форма не закрывается, а скрывается, правильно? 

Как правильно закрыть Form1 и открыть Form2?
    


Ответы

Ответ 1



В проекте WinForms есть два вида форм - главная и дочерние. Разница между ними в том, что главная форма по сути и является приложением, поэтому при ее закрытии происходит выход из приложения. Одним из решений является скрытие главной формы, вместо закрытия. Этот вариант уже написан в вопросе. Он обычно применяется, когда главная форма так или иначе используется в дальнейшем. Если первая форма в дальнейшем не используется, то можно использовать 2 варианта: 1. Правим Program.cs По умолчанию содержимое файла Program.cs выглядит так: using System; using System.Windows.Forms; namespace WindowsFormsApplication4 { static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } } Как вы можете заметить, Form1 запускается как приложение и, при завершении работы формы, произойдет выход из Main и приложения. Чтобы этого не произошло, можно прописать последовательность запуска форм: Application.Run(new Form1()); Application.Run(new Form2()); Application.Run(new Form3()); Тогда при закрытии первой формы, будет вызвана вторая и так до последней. Недостаток - сложно передавать данные между формами. Да можно определить поля в классе Program, конструкторы с параметрами в формах и передавать данные через эти поля и параметры конструкторов, но что делать если нужно вернуться в одну из предыдущих форм? Пилить сложную логику переходов в Main - не сама лучшая идея, мягко говоря. 2. Переходим от форм к контролам В WinForms есть замечательный класс UserControl. Это фактически пустой контрол, который вы можете наполнить любым содержимым как и форму. После того, как набор таких контролов подготовлен, вам остается только разместить их на форме с параметром Dock = DockStyle.Fill и управляя значением свойства Conrol.Visible, показывать тот контрол, который вам нужен в данный момент. Если не хотите держать контрол в памяти, ни кто не мешает просто создавать его в нужный момент и отображать, а после использования и переключения на новый контрол, отписаться от событий, вызвать Dispose(), удалить все ссылки и отдать его на растерзание сборщику мусора. Только выигрыш от этого невелик, особенно если вдруг надумаете снова его показать. Забыл написать про еще один недостаток переключения между формами через Main. Каждая новая форма будет открываться немного в другом месте, может для защиты от программ-автокликеров это и хорошо, но меня, как пользователя, такое поведение раздражает, и думаю что не только меня. Ещё можно не передавать форму в Application.Run и запустить его без параметров. Тогда даже закрытие всех форм не приведёт к закрытию приложения. Чтобы выйти окончательно необходимо будет вызвать Application.Exit – Lunar Whisper Тоже хороший вариант, если необходимо использовать разные формы в процессе работы.

Ответ 2



this.Close(); frm.Show(); Так вроде

Загрузка изображения в буфер

#java #изображения


Помогите найти ошибку

package com.example.test;

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;


public class LoadImage {

          /**  подгружаем картику    */

     public static BufferedImage loadImage() throws IOException{

         return ImageIO.read(new File ("1.bmp"));


    }
      /**  Переводим в матрицу   */
    public static void  convertToMatrix(BufferedImage image){

        int w = image.getWidth();
        int h = image.getHeight();

        System.out.println(w);
        System.out.println(h);

    }

}




package com.example.test;
public static void main(String[] args) {
 try {
        LoadImage.convertToMatrix(LoadImage.loadImage());
    } catch (Throwable e) {
        e.printStackTrace();
    }


}


Вот код ошибки:

javax.imageio.IIOException: Can't read input file!
    at javax.imageio.ImageIO.read(ImageIO.java:1301)
    at com.example.test.LoadImage.loadImage(LoadImage.java:16)
    at com.example.test.Test.main(Test.java:10)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

Process finished with exit code 0


Я так понимаю, оно не видит картинку?
    


Ответы

Ответ 1



Вам же всё написал компилятор. IOException - проверяемое исключение. Вы обязаны либо обернуть его в try/catch либо дописать в функцию throws Exception. В данном примере 2 вариант не походит, поэтому пишите как-то так: public static void main(String[] args) { try { LoadImage.convertToMatrix(LoadImage.loadImage()); } catch (Throwable e){ e.printStackTrace(); } }

Ответ 2



В дополнение к предыдущему ответу. IDE - это штука, не только помогающая писать код. Она ещё и обучает, и в режиме реального времени отвечает на вопросы уровня того, что был задан в первой редакции. Например, так: Вы можете самостоятельно попробовать оба варианта исправления, посмотреть как они делаются (код будет сгенерирован автоматически) и к чему приведут. javax.imageio.IIOException: Can't read input file! Я так понимаю, оно не видит картинку? Сложно как-то по-другому интерпретировать это сообщение...

Как правильно определить правую границу формы?

#c_sharp #winforms


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

if (PointToClient(p).X >= 0){/*код*/ }


Но когда я пытаюсь сделать так:

int w = ActiveForm.Size.Width;
if (PointToClient(p).X <= w){/*код*/ }


элемент всё равно уходит за правую границу. Т. е. Size.Width - это не правая граница
формы.

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


Ответы

Ответ 1



В качестве ответа могу предложить простое, «в лоб», но всё же решение в виде SLN. Там просто на форме бегает панелька, отталкиваясь от краев формы и верхней панели и проверяя, не выходят ли координаты контрола (панели) за установленные границы. Сам код: using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.Threading; namespace RightMargin { /// /// Description of MainForm. /// public partial class MainForm : Form { public bool MoveActive { get; set; } public int deltaX { get; set; } public int deltaY { get; set; } public MainForm() { InitializeComponent(); MoveActive = false; deltaX = 1; deltaY = 1; } void buttonCloseClick(object sender, EventArgs e) { MoveActive = false; Close(); } void ButtonStartClick(object sender, EventArgs e) { MoveActive = true; while (MoveActive) { int newX = boxPanel.Left + deltaX; int newY = boxPanel.Top + deltaY; int maxX = ActiveForm.ClientSize.Width - boxPanel.Size.Width - 1; int maxY = ActiveForm.ClientSize.Height - boxPanel.Size.Height - 1; //Проверка координат if (newX < 0) { newX = 0; deltaX = -deltaX; } if (newY < panelMenu.Size.Height) { newY = panelMenu.Size.Height; deltaY = -deltaY; } if (newX > maxX) { newX = maxX; deltaX = -deltaX; } if (newY > maxY) { newY = maxY; deltaY = -deltaY; } boxPanel.Left = newX; boxPanel.Top = newY; //Thread.Sleep(2); Application.DoEvents(); } } void ButtonStopClick(object sender, EventArgs e) { MoveActive = false; } } }

Ответ 2



Ваш вопрос относится больше к математике, чем программированию. Но так как одно без другого не работает, распишу подробно. Поехали. Положение контрола на форме и формы на экране задается положением левого верхнего угла и свойством Control.Location (красная точка на рисунке ниже). Положение остальных углов может быть вычислено добавлением длины и/или ширины контрола, которые заданы в свойстве Control.Size, к координатам Control.Location. Таким образом, чтобы контрол всегда целиком оставался в границах родительского контрола (форма тоже контрол), значения координат Control.Location не должны выходить за границу зеленой области на рисунке. Размеры этой области несложно вычислить из размеров контрола и родительского контрола. Остается учесть только один момент. У контрола может быть задан определенный стиль рамки, особенно это важно для формы. Свойство Control.Size задает внешние размеры контрола, поэтому если использовать их для определения доступной области рисования, то дочерний контрол будет попадать под рамку или шапку формы. Это не тот результат который хочется видеть. Для учета размеров оформления контрола, рамок, шапки и т.д., определено свойство Control.ClientSize, которое содержит актуальный размер области, доступной для отрисовки дочерних элементов (внимательно читаем подписи на рисунке).

Ответ 3



Правая граница определяется верно. Просто вы проверяете видимость одной конкретной точки — верхнего левого угла элемента управления. В придачу, проверка ещё и не строгая, захватывающая один пиксель за пределами правой границы (так как координаты лежат в диапазоне 0 ≤ x < (width) из-за отсчёта с нуля). Наконец, имеет смысл проверять положение левой границы элемента относительно нуля, а положение правой — относительно ширины формы.

Кончилась ли for break'ом

#c_sharp #циклы


Можно ли как-нибудь после выполнения for, проверить, закончился ли цикл сам или его
прервал break?
    


Ответы

Ответ 1



Ввести переменную и перед break ее взводить.