Дата | Видеоурок | Результат | |
---|---|---|---|
БД - Управление гостиницей Вид. Список форм. | + 16 | ||
Рисовать формочки. Разобраться с софтом. Что-то не нашел годного софта для прототипирования гуя. С этим еле разобрался и то там таблица кривая, табы кривые. Не добавляется второй таб, надо целый элемент еще добавлять. А где остальные уроки? Или я что-то пропутил? |
|||
БД - Управление гостиницей Модель. Карта отеля 3 | + 16 | ||
Ничему. Ничего. Так и не понял, почему "adults = '" + adults + "', " + в этот раз без this? В функции же нет входных параметров, чтобы их вот так просто использовать. Мне больше всего нравится писать контроллеры, которые соединяют 2 части. |
|||
БД - Управление гостиницей Модель. Карта отеля 2 | + 16 | ||
Рефакторить код. Узнал, когда надо сокращать код и переносить в отдельные функции. Загуглить смысл @ в запросе. На этот раз сказать нечего. |
|||
БД - Управление гостиницей Модель. Карта отеля 1 | + 16 | ||
Понял механизм получения данных в поля типа child, status и чтобы они были привязаны к объекту, когда он будет сгенерен конструктором и будет продолжать существовать на протяжении выполнения процесса. Ничего. Обычно я думал, что функции должны возвращать много полей, которые упакованы в массив. А тут поля внутри класса и можно присвоить им значения. Я теперь только понял смысл this. А ведь сколько уже подобных классов написали. И вроде бы все было понятно или казалось, что понятно. А как только я бы начал сам писать, то ничего было бы непонятно. |
|||
БД - Управление гостиницей Модель. Список заказов. | + 17 | ||
Ничему. Искать ошибки в запросах и скобках. Вроде все ясно. |
|||
БД - Управление гостиницей Модель. Статусы заказов. | + 16 | ||
Ничего. Ничего Зачем нужно делать this.till_day = till_day; Но используется " SET till_day = '" + till_day.ToString("yyyy-MM-dd") без this? В if (status != "waiting" || status != "confirm" || status != "deleted") return false; ошибка. Надо не И, а ИЛИ, как у меня. Программирование контроллеров даром не проходит, там с такими операциями чуть ли не в каждой строке встречаешсяю |
|||
БД - Управление гостиницей Модель. Бронирование. | + 16 | ||
Ничему. Ничего. Я тоже на работу ездил разными путями, даже если это дольше было. Стал замечать, что творческие люди (типа программистов) терпеть не могут повторяющиеся действия. Это сразу вызывает усталость. Я всегда меняю род деятельности. И в точку тоже смотрел или мышкой рисовал прямоугольники на рабочем столе. Я догадывался, что это мозги уже отключаются, но что-то быстро они отключаются. А еще я думал, что программисты сидят целый день и стучат по кнопкам как макаки. Ведь злой менагер ходит вокруг и подгоняет. Если бы работа была 4 часа в день, то тогда еще куда бы ни шло. |
|||
БД - Управление гостиницей Модель. Тестирование комнат. | + 16 | ||
1 Разбирать в цикле объект DataRow. 2 Писать тесты или точнее более менее начинать понимать, как их писать и как подлезть к их написанию. 3 Никогда не думал, что на тестах можно ставить точки останова и отлаживать их как прогу. 4 Находить ошибки в коде по заранее правильно написанным тестам. 5 Узнал про extract method. Все никак не мог понять, что это и как использовать. Понять логику тестов. Без предварительной подготовки понять чужую логику очень сложно. Найти ошибки в коде функций модели. Я сейчас в овощном состоянии. 15 минут прошло из 30, а для меня кажется уже час. Решил вот сразу написать, пока не забыл. Нашел, почему тест не проходит. Похоже весь смысл тестов теряется, потому что сама тестируемая функция содержит глюки. Нельзя написать заранее правильный тест, если тестируемая функция не была проверена руками первый раз и логика ее работы не подтвердилась логикой теста. Короче функция SelectRoom(long room_id) Result Message: Test method TestHotel.DBaseTest.TestRooms threw exception: System.ArgumentException: Column 'step' does not belong to table table. Строка 82 в коде той функции. this.step = int.Parse(room.Rows[0]["step"].ToString()); Я на нее смотрел как баран на ворота. Где тут что не так может быть? Рядом похожая строка такая же и все нормально. Стал смотреть, чего оно там про Step говорит. Может тип данных в самой структуре бд не тот? Вроде инт стоит. Поднял я глаза повыше на строку и тут до меня дошло.- step забыл написать. do room = sql.Select("SELECT id, room, beds, floor, info FROM room " Поэтому я сторонник выбирать *, если надо выбрать все поля. Вобщем сообщения об ошибках указывают совсем не туда, где эта ошибка есть. Надо смотреть на несколько строк назад. Да и само сообщение не очень информативное. Все же еще далеко даже до зачатков искусственного интеллекта, который бы ошибки показывал точнее. Никаких восстаний машин еще долго не будет. Вобщем за этот урок я довольно много узнал. Даже не ожидал. |
|||
БД - Управление гостиницей Модель. Удаление комнат. | + 16 | ||
Ничему. Ничего. Повторный проход дает свои результаты. |
|||
БД - Управление гостиницей Модель. Класс комнаты | + 16 | ||
Ничему Ничего. Тесты не понимаю. Чтобы написать правильный тест - надо написать правильный код и запрос к бд. Чтобы построить станок - нужен станок. |
|||
БД - Управление гостиницей Модель - Календарные праздники | + 16 | ||
Боле менее писать тесты, хотя мало что понятно. Искать ошибки в тестах или коде. Такое ощущение, что методика тестирования тестирует способность самому находить ошибки и исправлять их, потому что никаких сообщений об ошибках в синтаксисе sql не выходит и непонятно где я неправильно написал или опечатался, потому что в форматировании даты я забыл одну букву у и только случайно заметил. |
|||
БД - Управление гостиницей Модель - Календарный год | + 16 | ||
Алгоритм генерации календаря. На шарпе он оказался проще, чем на пхп. Найти ошибку в запросе теста. Ошибка была в лишнем пробеле COUNT(*). Тест не показывает неправильность синтаксиса запроса к бд. Пришлось в консоли тестировать. А ведь я моей точки зрения никакой разницы нет - с пробелом тут писать или без. Мне ощущается, что генерация календаря с поледущей записью в бд - это тупо и не должно делаться такого. |
|||
БД - Управление гостиницей Модель. Всё про Клиента | + 16 | ||
Узнал новое событие датагрида - клик на строке. Отыскать опечатки в запросе SelectClients(string find). Понять, какой тип должны возвращать все эти функции или не возвращать. Возникает уже сложность с запутыванием полей типа phone и функцией setphone(). Можно было и в сеттере делать проверки на корректность данных. Я так пологаю, что в следущих уроках эти запутывания будут устранены за счет дальнейшего разделения кода согласно паттерну мвц. 1. Слишком много полей для поиска, фильтр неправильно работает. Поле ид не нужно, оно не несет никакой информации. В правильном софте должен быть номер клиента или номер заказа. Фильтр должен работать только по имени, все остальное должно быть скрыто под продвинутым поиском. У меня 200 записей в таблице и оно не тормозит вообще. Хотя конечно 200 записей это смешно. Надо было сделать по-другому. После события от текстового поля запустить таймер и по истечении 500мс после последнего сброса вызвать SelectClients(string find), а при каждом изменении текста сбрасывать таймер. А так же надо было сделать ограничение в запросе limit 0, 20. Или может датагрид сам делает пагинацию и у него есть стрелки для листания? Такие плюшки есть в хтмл компонентах. Вцелом мне очень понравилось. Начинаю видеть разделение кода на логические части и вижу связи между ними. Все это придает энергии, а то раньше в других курсах писал в овощном состоянии, к тому же пару дней валялся с отравлением. |
|||
БД - Управление гостиницей Модель. Класс Клиента | + 16 | ||
Создавать модель. Писать годные каменты. Раньше не задумывался, как это сделано, а теперь секрет раскрыт. Узнал, что же значит 0 в sql запросе из прошлых уроков. Мои догадки подтвердились. Опять искать ошибки и опечатки. Я как-то не так представлял себе передачу параметров одним махом, без установщиком. Но пока что мне нравится. |
|||
БД - Управление гостиницей Отображение таблицы | + 16 | ||
Подключение источника данных к гриду. В другом курсе такого не было и приходилось все руками писать. Так же радует, что он чекбоксы рисует с галочками. Ничего. Выглядит он конечно страшновато и уныло. То ли дело компоненты Devexpress. Но все равно неплохо. Еще бы обработчики на удаление и изменение строк. Я думаю в следущем уроке будет. |
|||
БД - Управление гостиницей Модульный тест | + 16 | ||
Как сделать тест. Ничего. Наконец-то я тоже занался тестами. Точнее я еще в пхп пробовал, но что-то как-то там уныло все было. Откладывал в долгий ящик и вот за полчаса понял основы. Вот только не понял, почему у меня на и5 и ссд тест длится целую секунду? Вроде как .нет коннектор кривой и подключение длиться дольше, чем из обычной проги для работы с бд. |
|||
БД - Управление гостиницей Класс MySQL. Обработка ошибок. | + 16 | ||
Ничего, прием с ошибками знаком из другого урока. Ничего. Пример работы отладки с предыдущей ошибкой, когда 0 не указывал. Выходит 0 означает, что запись вставить на последнее место. В прошлом уркое я писал, что сообщение об ошибке не вылазит, в этом все было "исправлено". |
|||
БД - Управление гостиницей Класс MySQL. Получение таблицы. | + 16 | ||
Ничего. Отлавливать ошибки. Так и не понял, зачем тут 0? (0, 'oleg', 'oleg@gmail.com', '777333', 'октябрьский', 'sdfs Указывает на одну только строку? Думал это ид будет, а у нас он автоинкремент и я его не ставил, что вызвало ошибку, причем ошибку не выводит во всплывающее окно. Да и я так думаю - надо было использовать объект mysqlexception для отлова ошибок бд. |
|||
БД - Управление гостиницей Класс MySQL. Драйвер и конструктор. | + 16 | ||
Писать с нуля базовый класс для подключения. Так и не понял смысла this.user = user; и просто user; Почему в строке соединения не используется this.user = user? Почему надо с прогой распространять целый установщик коннектора? Там же только одна длл используется и ее можно кинуть в дистрибутив. По крайней мере я так делал для snmp библиотеки и даже встраивал ее в ехе файл специальным плагином для студии. Все работает. Я куда-то нажал и у меня поломались фигурные скобки. Теперь они не переносятся автоматом на новые линии, а первая скобка остается на строке с оператором try. Сброс настроек и настройки текста не помогли и они там стоят как есть. пришлось новый проект создавать. |
|||
БД - Управление гостиницей Модель. Имена методов. | + 16 | ||
Понял, что проги не пишутся сразу с нуля и надо много времени тратить на подготовку. Понять, как написать функции, если туда надо передавать много параметров. Нужно наверное еще передавать какой-то список параметров как одна переменная. Как убедить работодателя платить не за код, а за подготовку к написанию кода. (типа риторический вопрос) |
|||
БД - Управление гостиницей Модель. SQL запросы для Book и Map | + 16 | ||
Боле менее понимать соединения таблиц, хотя до сих пор ничего непонятно. Находить ошибки. http://forum.ixbt.com/topic.cgi?id=26:43159:10#10 Вот тут мой пост с вопросом и ответом с решением моего вопроса. Чтобы сюда не копировать, даю просто линк для всех начинающих. А я так и не понял этого механизма целостности данных. Вроде бы внесли даты в одну таблицу, а они уже как бы есть в другой и надо чтобы эти даты совпадали. Потом я сгенерил еще кучу связей в таблице book и что-то мне подказывает, что надо было делать не b.id, a c.id, с идентификатором клиента. Да и автоинкременты почему-то пошли после 100, хотя до 100 там было пусто и я выбирал от 1 до 100 в генераторе данных. И удалить нельзя из-за ключей. |
|||
БД - Управление гостиницей Модель. SQL запросы для Room | + 16 | ||
Ничему. Ничего. Я так понял, что сортировка по step невозможна только средствами бд без извратов с процедурами? Или же с применением кода. Остальные запросы с одной таблицей ничего сложного не представляют. Все ждал, когда начнутся объединения таблиц. |
|||
БД - Управление гостиницей Модель. SQL запросы для Client | + 16 | ||
Узнал, что можно обновить все записи, если не указать конкретно место обновления. Ничего. Никак не осилю связанные таблицы. Там какие-то еще подзапросы надо. |
|||
БД - Управление гостиницей Модель. Список задач. | + 16 | ||
Ничему. До ключей я так и не добрался. Найти пхп скрипт для генерации дат с выходными. <?php $strt_date = date_create('2017-01-01'); $end_date = date_create('2017-12-31'); date_sub($strt_date, date_interval_create_from_date_string('1 day')); $interval = date_diff($strt_date, $end_date); $num = $interval->format('%a'); for ($i = 0; $i < $num; $i++) { date_add($strt_date, date_interval_create_from_date_string('1 day')); $next_day = date_format($strt_date, 'Y-m-d'); echo "\n"; $new_date = new DateTime($next_day); $weeknum = $new_date->format('w'); if (($weeknum != 0) && ($weeknum != 6)) $wend=0; else $wend=1; echo "INSERT INTO calendar SET day='".$next_day."' , wend=". $wend .", holiday=0;"; } ?> С ключами я не знаю как делать. До сих пор не понял эту ссылочную целостность и как эти ключи друг с другом соединять или точней почему. КАк по мне, то надо просто указать таблицы и поля с данными, а бд должна сама знать уже как там что связано. Как-то так. После этого я 2-3 дня не занимался вообще. Зато нашел онлайновые генерилки данных. 1 регистрация клиента INSERT INTO client (client,email,phone,address,info) VALUES ("Ahmed Silva","lobortis.quam@acfacilisis.org","(059) 78515492","7940 Cras Rd.","16720405-1291"); 2 получение списка клиентов select * from client; 3 получение списка клиентов по фильтру SELECT * from CLIENT WHERE CLIENT LIKE "%solomon%"; 52 Solomon Houston nunc@leo.co.uk (013) 10507691 6249 In, Av. 16961107-1813 152 Solomon Houston nunc@leo.co.uk (013) 10507691 6249 In, Av. 16961107-1813 3.1 получение данных заданного клиента SELECT * from CLIENT WHERE id=34; 34 Addison Fox non.nisi.Aenean@orci.co.uk (092) 73400556 868-4153 Diam. St. 16410920-1394 4 изменение данных клиента UPDATE client set CLIENT="info@videosharp.info" WHERE id=34; 5 генерация календаря на заданный год insert into calndar set day='2016-01-01' , wend=1, holiday=0; 6 установка праздничных/обычных дней update calendar set wend=1 where day='2017-06-16'; 7 получение списка комнат select * from room; 8 добавление новой комнаты INSERT INTO room (room,beds,floor,step,info) VALUES ("red ",1," zwei ",6,"Quisque fringilla euismod") 9 получение информации по заданной комнате select * from room where id=3; 10 редактирование данных комнаты update room set step=1 where id=3; 11 перемещение комнаты по списку вниз/вверх 12 создание новой регистрации 13 изменение статуса регистрации 14 отмена регистрации 15 подтверждение регистрации 16 ожидание подтверждения регистрации 17 редактирование регистрации 18 получение списка регистраций 19 получение списка регистраций по фильтру 20 получить занятость комнатнат на указанный месяц 21 добавить запись в мап 22 изменить запись в мап 23 удалить запись в мап |
|||
БД - Управление гостиницей Модель. Планирование. | + 16 | ||
Ничему. Ничего. ... |
|||
БД - Управление гостиницей SQL запросы для создания Базы | + 16 | ||
Пользоваться графическим софтом и вставлять внешние ключи. Разобраться с софтом и связями. Сначала я делал модель в mysql workbench, там есть линии связей как в акцессе. Но это только модель и она не связана с бд. Да и там я так и не понял, как делать 1 к н, жму кнопку вроде с таким значном, а связь наоборот делается. Потом дошло, что надо использовать связь с использованием уже существующих колонок. Для этого надо сначала указать таблицу откуда (например book.book_date и куда calendar.day). Правда это как-то тупо, т.к. знак бесконечности появляется на таблице "откуда". Еще непонятны линии сплошные и прерывистые. В чем разница? |
|||
БД - Управление гостиницей Установка сервера MySQL | + 16 | ||
Ничему. Ничего. Все уже давно стоит. В этой проге можно мышкой строить запросы. |
|||
БД - Управление гостиницей Создание базы в MS Access | + 16 | ||
Ничему. Рвзобраться с поиском вкладки связей вместо запросов. Я еще удивился, что не показывает типы связи и полез гуглить, т.к. у меня 2007 офис и может быть в старой версии типы связи не показывает. Последний раз акцесс я юзал кажется 10 лет назад. Вцелом все хорошо. Совет про распечатать схему - правильный. Составлять запросы без смотрения на схему очень сложно. И сложно, когда схема на экране и надо переключаться между прогами. Хорошо иметь второй монитор. |
|||
БД - Управление гостиницей Таблицы комнат и дней | + 16 | ||
Узнал смысл таблицы мап. Ничего. Тоже все хорошо объясняется из личной практики подобног рода софта. Как по мне, то программист должен хорошо разобраться в специфике бизнеса заказчика, чтобы у него в голове автоматом уже складывались сущности и он даже наперед заказчика мог предусмотреть будущие изменения. Один минус - использование акцеса вместо сетевой бд с соответствующим софтом для проектирования бд, типа как у меня на скриншоте. Можно было бы съэкономить кучу времени. |
|||
БД - Управление гостиницей Таблицы клиентов и заказов | + 16 | ||
Ничему Ничего. Надо было в таблице заказов сделать поле норме заказа. А в после клиента - номер клиента, но он не должен быть первичным ключом, но иметь атрибут уникальности, а так же дату регистрации клиента. Это если бы прога была реальная. Для урока не нужны поля про детей, взрослых, статус и инфо. Вцелом тут все очень хорошо разжевано и указаны причины как не надо делать и почему, к чему это может привести. 25 минут прошли незаметно. |
|||
БД - Управление гостиницей Вступление | + 1 | ||
Ничему. Найти панель связей в mysql workbench. Соглашусь, что при проектировании бд и проги, надо несколько раз пройтись. С каждым разом будут открываться новые недочеты. Ну и меня еще в пту учили, что надо составить план с 3мя пунктами. Что прога должна делать. Что может. Что не должна и не может. Последний пункт мало кто озвучивает, а второй постоянно звучит в новых версиях. В результате чего проги превращаются в монстров. Базу я нарисовал, но так и не понял смысла таблицы мап. Да и не уверен насчет правильности соединений. Последний раз в гостиннице жил в маскве в 91 году вроде. Там таблицы разве что в тетрадке были. |
|||
WPF Clocks Стрелочные часы | + 16 | ||
Для меня все было новое. Не пойму магические числа. <Path Data="M249,8 L2 0 L0 8 L-2 0 Z" У меня часы вышли кривые. Часовая стрелка и шкала. <Path Fill="Black" Data="M240,170 120 0 l-5 -110 l-5 -5 l-5,5 Z" RenderTransformOrigin="0.5,0.5" > <Path.RenderTransform> <TransformGroup> <RotateTransform Angle="-25" x:Name="RotationHour"/> <TranslateTransform/> </TransformGroup> </Path.RenderTransform> </Path> Все ждал уроки по впф и вот вышел. Если будет дальше выходить, то надо сначала рассказать, что будем делать на уроке. Из чего эти часы состоят, как рисуются фигуры (откуда ты взял эти магические числа), что такое впф вообще и зачем он нужен. |
|||
БД - Книжка оценок ФИНАЛЬНЫЙ УРОК | + 16 | ||
Подключаться к файловым и сетевым бд. Работать с датагридом. Раньше для меня он казался сложным и я не знал, как к нему подлезть. Ну и соединение и получение данных к мускулу как-то сложнее по сравнению с пхп. Искать ошибки. Прога перевалила за 500 строк в обоих файлах. Потом еще создавал бд и почему-то по дефолту у меня кодировка латин1 была, а я думал ут8 и поля в таблицах создались не в той кодировке, а я даже не знал, что поля отдельно можно менять кодировку. Я ведь для всей базы и даже для таблиц поменял, а все равно вопросы вместо букв показывались. Целый час убил. В этом курсе надо было больше уделить сетевой базе и делать ее в специальной проге, так быстрее и проще. Запросы тоже лучше писать в этой проге. Почему-то все преподающие бд так и норовят использовать неудобные инструменты. Так же надо было наверное разобрать датагрид, он довольно сложный. Да и некрасивый он совсем. Я скачал платный Devexpress они вроде бы недавно сделали его бесплатным для открытых проектов или это может быть только веб версия хтмл, впф платная наверное. Изучал курс с бд для написания своей проги, чтобы иметь базу клиентов, шаблоны для генерации пдф и выписывать счета клиентам с автоматической отправкой пдф им на почту. Хотел на пхп написать, но как по мне, то лучше у себя хранить или потом сделать веб версию с rest api. Следущий курс будет или телефонная книга (вроде видел его) или база отеля (лежит в закладках). |
|||
БД - Книжка оценок Подключение проекта к MySQL | + 16 | ||
Устанавливать дополнение .net mysql Находить ошибки. Разобраться с подключением. Подключение проходило, а я тупил, пока не поменял другой логин и не получил ошибку, что такого пользователя нет. А ошибка была в выполнении функции public MySqlDataReader Select(string query), где я забыл передать аргументы в MySqlCommand cmd = new MySqlCommand(this.query, connection); Теперь не могу понять ошибку на скриншота. Какой где датаридер открыт? Ошибка в private void load_pupil_matrix() после ввода пароля ученика. Отрисовывается грид с уроками, а оценки не вставляет. Запрос сырой отрабатывает правильно и выдает 2 строки. Ошибка где-то тут при чтении. do read = sql.Select("SELECT subject_id, day, point FROM point WHERE pupil_id =" + my_pupil_id.ToString()); while (db_error()); while (read.Read()) Надо было всетаки сделать с самого нуля с сетевой бд, акцесс никто не использует. upd Внезапно стал смотреть работы по этому курсу у других и у Tekashnik нашел ответ. Оказывается надо после MySqlDataReader read; read = sql.Select("SELECT id, subject FROM subject ORDER BY subject"); while (db_error()) ; int row = 0; while (read.Read()) { grid_points_pupil.Rows.Add(); grid_points_pupil["co_subject_ids", row].Value = read["id"].ToString(); grid_points_pupil["co_points_subjects", row].Value = read["subject"].ToString(); row++; } добавить read.Close(); А я добавлял do sql.Close(); while (db_error()); И вот как я должен был догадаться? |
|||
БД - Книжка оценок Сетка оценок ученика | + 16 | ||
Заполнять грид. Собственно его заполнять. Все эти алгоритмы в циклах. Не зря я боялся начинать работу с гридом и бд самостоятельно. Тут час видео растянулся на 3 часа, а эти 3 часа растянулись на 2 или 3 дня. Пока все ошибки отловиш. Хотя я себе это несколько иначе представлял. Или вот я не представляю себе вид вкладки "оценки класса". По всем предметам или там выбирать учитель может? Если по всем, то что с датами? |
|||
БД - Книжка оценок Авторизация школьников и учителя | + 16 | ||
Как сделать логин и переключаться в нужные разделы после авторизации. Код с while (db_error()); в разных местах портит все. Нужно втыкать эти заглушки в правильные места, иначе будет только мешать. Сложным было понять механизм авторизации ученика. Я знаю, как это делать в вебе, а тут комбо бокс не содержит ид учеников и пришлось лепить массив с идентификаторами. В целом нормально. Паврда я этот урок 3 дня тянул. Мои представления о структуре проги не совпадали с роликом, а когда ты вроде бы понимаеш механизм, но видиш совсем не так, как представляеш, то очень сложно понять, что там думает другой человек. Если же для тебя это с нуля, то все воспринимается как должное. Но цель этого урока - взаимодействие с бд, а не проектирование приложения. Я думаю в управлении гостинницей это будет. Вроде ничего сложного нет, а столько сил я потратил. |
|||
БД - Книжка оценок Создание интерфейса программы | + 17 | ||
Работа с datagrid. Ошибки находить. Так и не понял, где у меня тут ошибка id = int.Parse(sql.Scalar("SELECT MAX(id) FROM subject")) + 1; Запутался среди этих кнопок. Интерфейс получился нелогичный. Как-то все криво сделано. Должно быть поле для добавки и кнопка для добавки. Не долно быть поля для изменения, изменение должно делаться при двойном клике на строчку в таблице. Короче я так и не понял, почему у меня исключение выходит. В переменной id все равно 0, а запрос непонятно что возвращает. Кроме того вставка не должна прибавлять 1, это тип поле id должен быть автоинкремент и будет сам увеличиваться. Не думал, что так все сложно будет. Чуть не сдох в первый день, а сейчас я доделываю спустя пару дней. Сделал пометки тогда и решил после отдыхать поискать, может на свежую башку чего полезного. А так и не понял это исключение. |
|||
БД - Книжка оценок Проектирование БД «Книжка оценок» | + 16 | ||
Искать настройки sql запроса в меню акцесса. Найти настройки в акцессе, чтобы появилось окно ручного запроса. Я давно учил бд и даже сам пришел к вопросу нормализации бд, о чем и узнал при чтении. В пту тоже делали акцесс и другие базы, но все быстро и без привязки к приложениям. Я так за все время и не написал ничего. У меня лютый страх сделать неправильные связи и со временем запороть базу. Кроме того я так и не понял, зачем делать join, если создается связь через условия where. Толком нигде не рассказывается, почему в этой ситуации надо связь 1 к н, в другой н к 1, а где н к м. Что там про связанное удаление? Я так опять и не понял, но интуитивно ощущал, что должны быть эти связи по ключам на уровне самой базы. Т.е. база не должна дать мне ввести просто данные в одно поле, если оно связано с другим. Этот вопрос опять нигде не описывается. То ли надо самому за этим следить, то ли нет. Если самому, то зачем тогда все эти связи? Есть бд без связей, только тупо для хранения типа mongodb. Я прослушал курс по mysql от специалиста, курс годный, но почему-то я так ничего и не стал делать. А в этом уроке я даже установил акцесс, нашел кнопку и руками вводил запросы. Опять магия какая-то. |
|||
Компилятор Секреты Designer файла | + 16 | ||
Узнал про partial. Узнал про функции InitializeComponents() и методы класса форм для улучшения дизайна и совместимости. Найти опечатки в partial. Этот урок продвинул еще на один большой шаг в понимании структуры приложения. Я пробовал сам понять эти кучи кода после автогенератора, но... А еще стало понятно, почему мы пишем часть кода в функции Form1. Я задавал такой вопрос в каментах тут к какому-то уроку. Теперь я нашел свой ответ тут. Теперь я хотел бы еще пройти курс по созданию приложения на примере mvc или другого шаблона проектирования. Но пока я такое видел только для явы, а ява мне неинтересна. Самое странное, что среди гор курс по шарпу кроме продвинутых hello world я ничего не находил. Везде говорится про все куски всего, только нигде не говорится, как их собрать в одну _полезную_ работающую прогу. |
|||
Компилятор Откуда берутся окна | + 16 | ||
Создавать графическое приложение. Компилировать несколько файлов. Вспомнил динамическое добавление контролов. Ничего. Появились ключи для скрытия консоли. Я думал главная функция должна иметь имя winmain для графического приложения. Сейчас у меня четко складывается картина, из чего же состоит графическое приложение и как его части между собой соединены. |
|||
Компилятор Где живёт компилятор | + 16 | ||
Нашел путь компилятора. Узнал минимальный набор кода для запуска. Ничего. Очень полезный курс и его надо обязательно пройти, но только после того, как прошли soft0 с графическими приложениями. Когда уже получил какие-то рабочие проги, то возникает желание разобраться, что там под капотом. Я вот и не думал, что компилятор лежит в папке виндовса. По идее он должен лежать в папке студии. И я думал, что для компиляции надо еще кучу ключей указать и создать кучи всяких файлов, которые студия создает. У меня после установки студии создавался еще mdf файл размером 32мб на каждый проект, а я и не знал для чего он и отключил. А вот так оказывается и не надо никаких файлов дополнительных и ключей не надо. Сейчас выяснится, что для создания простой формы тоже не надо столько кода писать, как делает студия. |
|||
Итератор VIP. Оптимизация поиска простых чисел | + 16 | ||
Посмотрел делегаты опять. Посмотрел процесс эволюции кода и оптимизации. Люблю оптимизировать. Вроде бы ничего. Самое смешное началось, когда у 10 000 000 убрали 000 и поместили в другое место. После этого у меня разультаты стабильно стали почти равными (разница в 100 чисел). А до исправления разница была раза в 3 стабильно. У меня это вызвало приступ смеха. Вы только вдумайтесь - оптимизация алгоритма стала ненужна. Нужно было оптимизировать время вычисления производительности. Хотя тут многие могут меня неправильно понять, типа быстрей тот, кто сам определяет, как и в чем считать. Но я хотел сказать, что похоже либо Компилятор оптимизирует, либо процессоры настолько крут, что ему по барабану такие оптимизации. Процессор и5-4443. Когда же стали писать is_prime_each_by_3 и запускать, то я заметил, что числа различаются только в младшем разряде и тут я понял, что что-то пошло не так. Оказалось, что в find_primes неправильно написано if (is_prime__each_by_0(number)) { count_primes++; } а надо if (is_prime(number)) { count_primes++; } Вот так вот у меня возникло ложное представление о прогрессе и о своем превосходстве с понтовым процессором. Процессор оказался самый обычный. Потом когда с корнем сделали, то я был в шоке. Я и не ожидал такого скачка. Думал примерно будет линейно расти. И вот как только люди придумывают такие оптмизации в матане? Я один раз for на while заменил в прошивке под контроллер и экономия памяти программ вышла порядка 53 или 56 байт, что для контроллера с 8кб тоже неплохо. Иногда и один байт решает. http://we.easyelectronics.ru/Asticon/istoriya-odnogo-bayta.html Второй шок у меня был от is_prime_each_by_P. Я так и не понял, зачем нужно это все if (number == 2) { primes.Clear(); primes.Add(2); return true; } Однако по мере просмотра ролика выяснилось, что пропущена строка primes.Add(number);. А я это интуитивно ощутил, т.к. еще в начале говорилось, что будет строиться таблица заранее рассчитанных чисел, а добавления в список не было. Такие таблицы используются для работы с тригонометрическими функциями - таблицы синуса и косинуса, т.к. 8битному контроллеру на 16мгц довольно трудно считать их не имея математического сопроцессора или дсп блока. Вобщем добил я до конца. Правда так и не понял, как работает тестирование функций. Почему сравнивается с is_prime_each_by_0? Она 100% рабочая? Было бы интересно вебинар сделать по юнит тестированию. Все давно пишут, а я даже не читал и понятия не имею. Еще было бы неплохо сделать платные курсы по алгоритмам цифровых модуляций. Сколько я ни парился, а даже простую афск модуляцию двумя тонами на передачу не осилил. У меня еще есть исходники демодуляторов разных и тоже не разобрался. Да и инфы нет никакой. Что сказать по этому уроку? Получился как отдельный курс прям. То ли я упорот в этот день, то ли курс и правда интересный вышел. Я не ожидал даже. Думал будет скучно, но выжать попугаев оказалось довольно интересно, хоть я и не понимал в этих алгоритмах. Спасибо преподу по алгоритмам в быдловузе 2011. Отбил все желание. Камент писал по ходу урока. |
|||
Итератор ФИНАЛЬНЫЙ УРОК | + 2 | ||
Узнал про итераторы. Вроде когда учился с++ там было что-то типа vector для перемещения по массиву. Тоже вроде итераторами называлось. Синтаксис и какие-то числа непонятные в черном окне. Про курс написал в прошлом каменте, думал последний урок. Следущий курс у меня уже в избранном - Базы данных - Книжка оценок. Потом БД - Управление гостиницей, Сетевые технологии, Новые технологии, API Telegram, Бурные потоки. |
|||
Итератор Итератор. Один метод вместо классов. | + 16 | ||
Затрудняюсь даже сказать. Понимание происходящего. Вот я закончил курс. Почему курс оказался плох? Не знаю как для других, я про себя скажу. Самая главная ошибка всех обучающих курсов или преподов в том, что они либо сами не понимают до конца тему, либо не могут применить правильно инструмент. Либо применяют его примерно так: розовый банан скачет по космосу. Я долго думал над этой фразой, чтобы она как можно более упоротей звучала. Примерно то же я вижу у себя на экране: черное окно и там столбик каких-то цифр. Я понятия не имею, что такое простые множители или там цифры. Для меня если я могу запомнить цифры в голове, то они простые, а 233459089 для меня сложная цифра. Курс называется "разложение числа на простые множители". Сначала я подумал, что число 123 будет раскладываться на 1, 2 и 3. С этим примером у меня связано одно событие. В пту году в 2005 был день открытых дверей и надо было что-то сделать и показать для посетителей, типа чем мы занимаемся тут. У меня валялась плата с тремя индикаторами от спутникового приемника и там было 3 регистра для статической индикации. Я еще раньше с корешем ходил к нему в общагу и он показывал мне, как написать прошивку для контроллера под эту плату. Типа вот есть число 123 и оно влазит в 1 байт, а плата с индикаторами - это 3 байта. Как бы так разобрать число на отдельные цифры? Я пришел к нашей училке по матану и программированию и спросил ее, а она мне и рассказала. Я это написал в коде и оно заработало. С тех пор я до конца жизни это буду помнить. Тут я не понял, что такое простые множители и зачем они мне нужны в этой проге. Я тупо не видел образа или конкретного применения. Поэтому у меня в голове розовый банан скачет по космосу. Я пошарился часа 2 по гуглу и нашел пару боле менее годных визуальных примеров. http://csharphelper.com/blog/2017/04/enumerate-treeview-nodes-c/ http://brain-it.blogspot.de/2009/08/c-yield.html http://flash2048.com/post/yield http://www.c-sharpcorner.com/UploadFile/40e97e/iterator-pattern/ Вот тут есть очень хороший рисунок, который расписывает маппинг методов интерфейса к переменным цикла foraech. Одна эта картинка уже решает 50% вопросов. Как я понял - елд нужен для составления какого-то списка в памяти по критериями фильтрации какого-то массива данных. Потом этот список можно использовать дальше в своем коде. И как там пишут - linq заменил почти елд, т.к. фильтры стали делаться sql подобными запросами. В конечном эффекте я все равно не понял про итераторы и елды. Перебрать дерево вроде можно и так. Мне в реальной проге надо было перебирать радиокнопки отмеченные в разных группах и я делал в цикле. Интуитивно я ощущаю, что эта штука нужна для реализации фильтра в контролах типа gridview или как его там, который рисует таблицы со столбцами как в екселе или типа того. Но этот курс из категории профи, так что неудивительно, что ничего непонятно. Что нужно было сделать? 1 Дать простое определение итератору. 2 Что такое IEnumerator и IEnumerable. 3 В каком реальном проекте их использовали и что было бы, если бы не использовали. 4 Yield это обязательное слово в связке IEnumerator и IEnumerable или идет дополнением? 5 Какой с него профит в реальном софте и что было бы без него. 6 Когда это нужно использовать и когда не нужно. Такие дела. |
|||
Итератор Итератор. Список простых чисел. | + 16 | ||
Вроде понял, что какие-то нужные числа добавляются в список, которые заранее считаются по какому-то там алгоритму. Потом из списка выводятся. Все. Так и не понял, как этот елд работает и почему куда-то там прыгает. С гото понятно, а это непонятно. И заметьте, я не лез в гугл за определением елда. Специально не лез. Накапливаю инфу об ошибках курса. |
|||
Итератор Итератор. Волшебное слово yield. | + 16 | ||
Узнал про yield. Видел его в коде, но не интересовался. Думал, что это что-то из высшего программирования и мне это не надо знать. Понимать, что происходит. Посмотрел очередной урок 2 раза. Ничего не понял, но поставлю 5 звезд, т.к. еще не до конца прошел курс и наверное в конце все должно стать понятно. |
|||
Итератор Итератор. Зачем нужно два класса | + 1 | ||
Рисовать таблицу умножения. Еще в пту мне училка показала, как в 2х циклах нарисовать таблицу bcd кодов. Я бы не догадался, что там 2 цикла надо. Все. Я посмотрел ролик 3 раза и все это время смотрел как баран на новые ворота. Сделал себе пометки для отчета по всему курсу. Я уже вижу, что тут было неправильно с самого начала. |
|||
Итератор Итератор. Перебор простых чисел. | + 16 | ||
Понял примерно return this; А еще у меня опять интуитивно в голове возник вопрос: есть 2 интерфейса и в них куча функций. А какая функция к какому интерфейсу? Потом дошло. Отлавливать опечатки. Перепутал IEnumerator.ххх с IEnumerable.ххх. Специально вчитывался и все равно не замечал. Ощущаю себя в овощном состоянии. На сегодня с меня хватит. 4 Урока осилил. |
|||
Итератор Итератор. Перебор чисел в итераторе. | + 16 | ||
Ничему. Ничего. Вот посмотрел еще одну серию и все равно вопрос остался открытым. Ну я там еще тоже сначала думал, что если функция будет всегда возвращать true, то будет работать до бесконечности и надо ввести механизм ограничения. Правда все это ни на байт не приблизило к пониманию итератора в шарпе. |
|||
Итератор Итератор. Создание пустого итератора. | + 16 | ||
Узнал, что можно делать return this;. Ничего. Потому что ничего не понял. У меня было интуитивное чутье, что в коде что-то лишнее и можно переделать. Так и оказалось. А что такое енумератор я не понял. И как он выглядит? Посмотрим дальше. Внезапно вспомнил из сей enum. он нужен, когда лень писать значения дефайнов. Используется для определения состояний конечного автомата, если кто знаком с программированием контроллеров. Сейчас еще подумал и понял, что наверное в этом классе будут храниться заранее посчитанные простые числа? Узнаем в следущей серии. |
|||
Итератор Итератор. Разложение числа на простые множители. | + 16 | ||
Услышал про какие-то простые числа. Ничего. Пока сказать нечего. Дальше гляну. Часто видел этот интерфейс, а тут и уроки по нему попались. |
|||
Теория ООП Интерфейс. VIP. Тяжёлая дружба кругов и квадратов. | + 16 | ||
Даже не знаю. Слишком много уже для моих мозгов. Набирать текст. Я его даже не осилил. Видеообзор лень делать. Так напишу обобщение. Вцелом курс получился очень крутой. Даже мне, который не любит игры и то пришлось разбираться со всем этим матаном. А еще мне лень писать код. Однако тут я почему-то делал это. Сколько курсов смотрел - нигде не было желания писать за ведущим, а тут как-то так само получается. Странно это. Куча моментов была для меня новая. Как я уже писал в прошлых отчетах - простые вещи в реале очень трудно реализовываются в коде. То же самое с электрическими узлами. Частотные фильтры легко посчитать и спаять, но я так и не понял теорию фильтров, как разложить спектр на частоты и амплитуды этих частот. Детектор делается одним диодом и частотным фильтром. В коде же это целая формула с синусами и косинусами + куча кода для работы со звуком, т.к. для компутера звук выглядет игначе, чем он есть в реале. Соответственно матановые формулы в коде будут уже выглядеть по-другому. Определение интерфейса я посмотрел еще раз. Похоже там при написании использовали рекурсию. Я еще не поленился и поискал это на русском. Вот перевод того определения. Похоже автор сам не знает или поленился написать своими словами. Интерфейсы – это еще один инструмент реализации полиморфизма в Си-шарп. Интерфейс представляет собой набор методов (свойств, событий, индексаторов), реализацию которых должен обеспечить класс, который реализует интерфейс. Интерфейс может содержать только сигнатуры (имя и типы параметров) своих членов. Интерфейс не может содержать конструкторы, поля, константы, статические члены. Создавать объекты интерфейса невозможно. Вот мое определение образное. Интерфейс - заранее прописанный стандарт в виде методов или событий. Конкретная реализация метода зависи от класса. Например если взять усб интерфейс. У него есть стандарт и там есть электрические параметры и программные. У нас есть компутер с усб и есть какое-то устройство. Компутер ничего не знает о внутреннем мире устройства, но оба они имеют усб интерфейс, который соединяет их по заранее прописанным процедурам инициализации и обмена. За счет этого любая мышка с усб всегда будет определяться как мышка и работать как мышка. Так же есть клавиатура усб, но они никак не пересекаются, хоть и имеют одинаковые разъемы (интерфейс). |
|||
Теория ООП Интерфейс. VIP. Пересечение прямоугольников. | + 16 | ||
Очередной алгоритм пересечения прямоугольников. Кто бы мог подумать, что это так делает. Искать ошибки. Забыл для прямоугольников наследование от интерфейса в прошлом уроке. В этом нашел. Потом он стал ругаться, что методы Поймал аргументы не те. Стал пересматривать урок и нашел, что в определении интерфейса поменяли object на игрок, а я это пропустил. Тут еще посылку принесли и отвлекли. Потом я еще с этой посылкой возился. Потом игра запустилась, но квадратики немного туда сюда телепались. Долго искал и нашел. if (x < 0 || x > Arena.Range.Width - box.Width) sx = -sx; if (y < 0 || y > Arena.Range.Height - box.Height) sy = -sy; Вместо у во второй строчке были х. Копипаста - враг программиста! (с) мое По логике вещей - надо было сделать так: Круг ведущий - красный. Остальные синие. Прямоугольник ведущий - желтый. Остальные зеленые. (брать противоположные цвета) Проверять я это конечно не буду. Хоть они и пересекаются, но взаимодействовать между собой могут только фигуры одного типа. Получается такая параллельная реальность. Б-г создал один мир и населил его двумя тварями. Хоть они там и копошаться, но друг друга как бы не видят. |
|||
Теория ООП Интерфейс. VIP. Квадратики тоже хотят играть. | + 16 | ||
Адаптировать код старыъ фигур к новым. Найти ошибку, почему for (int i = 0; i < 5; i++) game.AddGamer(Arena.NewBox()); неверно. Вроде все понятно, а почему тут ошибка? Вроде даже подсказка вываливается. |
|||
Теория ООП Интерфейс. ФИНАЛЬНЫЙ УРОК. | + 16 | ||
Боле менее понимать, что происходит в этих правилах. ПИсать правила и понимать их, а то я уже запутался. Мне понравилось. Ощущаеш себя творцом. Прям вспомнился ролик один про генетические алгоритмы. Там был сделан процесс эволюции. Я ролик воткну в отчет. |
|||
Теория ООП Интерфейс. Создаём новую игру. | + 16 | ||
Пока ничего нового. Ничего. Ну пока еще сказать нечего по поводу реализации из моего прошлого камента. Как реализовать эти 2 последние функции я понятия не имею. Как я уже говорил - игры это не мое. |
|||
Теория ООП Интерфейс. Изменяем правила игры. | + 16 | ||
Понял, как менять правила игры в коде. Да все эти алгоритмы проверок и в какой конкретно функции их писать. В каментах предложили зомби или вирус, когда красные будут заражать синих. Я так понимаю, будет или переписаны правила в существующем классе gamecatch или будет создан новый класс с новыми правилами и по другой кнопке будут инициализироваться другие правила игры. |
|||
Теория ООП Интерфейс. Кружочки гоняются друг за другом. | + 16 | ||
Понял, как сделать движение кружков. Я еще сам не понял. Добавили в круг какие-то sx. sy. Что такое int sx = random.Next(-5, +6); int sy = random.Next(-5, +6); ? Случайное смещение начальных координат от предыдущего круга? Нашел ошибку. Не зря я писал в прошлом каменте про return Convert.ToInt16(Math.Sqrt((p.X - q.X) * (p.X - q.X) + (p.Y - q.Y) * (p.Y - q.Y)));. Возвращаемое значение было непонятном, не тольше, не то меньше инт32, так что вышло исключение. А все потому, что скобки Sqrt(( надо было две, а я одну написал, хотя никакой ошибки синтаксиса не было. Интуитивно думал, что где-то скобки должны стоять, чтобы был правильный порядок вычислений со скобками. Поэтому я и ненавижу игры из-за матана. Как вы там 7 часов на вебинаре высидели? Я месяц делаю понемногу и уже мозги все сварились. |
|||
Теория ООП Интерфейс. Кружок готов к игре! | + 16 | ||
Вычислять соприкосновения спрайтов. Понять весь этот матан. Ну как я и написал в прошлом каменте - надо сравнивать 2 координаты фигур. Правда у меня как всегда в голове только расплывчатый образ был, без конкретной реализации. Вот сколько я в школу ходил и были там уроки геометрии и нигде никто не давал таких вот знаний, чтобы потом на практике применить. Вот про закон пифагора я знаю и что толку с этого? return Convert.ToInt16(Math.Sqrt(p.X - q.X) * (p.X - q.X) + (p.Y - q.Y) * (p.Y - q.Y)); Я бы такое под дулом автомата не придумал. Сто раз проверил все эти буквы, чтобы опечатки даже не сделать. А уж чтобы придумать... Как оказалось - границы фигуры вычисляются из центра. И это только для круга. А как для квадрата? А для треугольника? На старых приставках я замечал, что спрайт физически всегда является квадратом, даже если некоторые пиксели у него прозрачные. Кстати надо было graphics делать пнг формата с альфаканалом, чтобы белый фон фигуры не был виден. Так вот, походу всегда будут вычисляться координаты квадратных границ фигур, что внесет визуальные пиксельные погрешности, которые иногда видны на слабых системах при перерисовке спрайтов. Думаю это будет заметно и тут, когда фигур на арене будет много. |
|||
Теория ООП Интерфейс. Кружок хочет играть. | + 16 | ||
Узнал, что множественного наследования в шарпе нет, зато можно перечислить интерфейсы через запятую. Как бы тоже наследование, только не вглубь, а вширь. Ничего. У меня опяться же были представления в голове о том, как что и в каких файлах должно было бы быть, но не было четкого представления. После этого урока я понял, где _конкретно_ нужно писать строчки для изменения цвета. А теперь мне вспомнился 94й год, когда я был в больнице и познакомился с одним человеком, который уже на спектруме писал игры со спрайтами на асме. И он мне как раз рассказал, как компутер определяет столкновение 2х объектов. Это оказалось настолько просто, что технология игр мне стала понятна и я потерял интерес. Но в тот день я в тетрадке написал весь код, а дома вбил его и проверил. Конечно на бейсике все это тормозило и не было никаких спрайтов, только двигались буквы псевдографики. Так что, как реализовать движение? Надо знать границы экрана, координаты кружка public Point center. Координатам sx, sy присваиваются координаты кружка в методе public void Голя() и потом сравниваются с координатами границ экрана. А логика столкновений уже реализована в классе GameCatch. Сейчас поем, посмотрю ролик какой и потом вернусь к следущему уроку и как раз проверим, прав ли я был. |
|||
Теория ООП Интерфейс. Запускаем кружки на площадку! | + 16 | ||
Очень понравился механизм инициализации арены. Теперь понятно, почему метод создания кружка - статический. Нам над объектом не надо больше делать никаких действий и у него нет методов. Только свойства, в частности color. Ничего. В прошлом уроке при написании функции нового кружка у меня интуитивно возникло сомнение в правильности аргументов и их расчетов. А в этом уроке выявилась ошибка, что подтвердило мои подозрения. Правда я думал ошибка должна быть в int r = random.Next(Range.Width / 50, Range.Width / 20); Ну хорошо, что хоть вообще ощутил. Потом я в режиме отладки посмотрел, что из себя представляет объект кружка. Оказывается всего 3 переменные. Я думал будет нечто более сложное, хотя если посмотреть, то кроме 3х переменных ничего и не создавалось. Это я пишу для тех, кто параллельно у себя в голове пытается представить образ объектов, которые выражены в коде. Если сам не придумал все с нуля, то очень трудно представить то, что представил другой человек. Потому что при помощи кода это можно написать кучей разных способов и все они будут работать. И нельзя сказать, какой способ самый правильный. Я вот думал всегда, что моя реализация неправильная и правильные труъ программисты делают это вот так и оно правильно. Но сейчас я боле менее понимаю, что может быть много вариантов. Хотя хотелось бы конечно писать сразу правильно и оптимально. |
|||
Теория ООП Интерфейс. Кружок на площадке. | + 16 | ||
Очень понравилась реализация функции нового кружка. Я тут увидел, как реализован не просто вызов метода или создание объекта типа object obj = new ojbect(), а как возвращается тип. Ну и алгоритм генерации пропорциональных объектов в зависимости от размера поля. Разве что коэффициенты подобрать. Ничего. Нет. |
|||
Теория ООП Интерфейс. Площадка для игры. | + 16 | ||
Создавать поле с типом Size, с графикой не работал в винформах, посему все новое. Ну и еще решил глянуть то видео про генератор случайных чисел. Про seed я помню еще со времен пту, правда так и не понял, почему нужно статичный тип переменной для него. В сишной реализации там только передавалось системное время в миллисекундах со старта системы (uptime). А тут все скрыто и непонятно из-за этого. Ничего. Замечаний нет. |
|||
Теория ООП Интерфейс. Создаём кружок. | + 16 | ||
Ничего нового. Ничего. Все понятно. Как я и говорил в прошлом каменте - надо реализовать функции интерфейса и самих игроков. |
|||
Теория ООП Интерфейс. Алгоритм игры. | + 16 | ||
Разобрался в алгоритме игры. Найти причину некомпиляции. Оказалось опять невнимательность в написании, пришлось гуглить ошибку и исправлять, а редактор кода все равно подсвечивал синим имя конструктора, хотя я уже убрал void и я думал, что ошибка где-то еще. Но потом запустил компиляцию и все заработало. Вот такие глюки бывают. Надо теперь реализовать физически все эти объекты и их движение. А сам алгоритм уже как бы написан. А еще совсем забыли про каменты в коде. Или может быть это у меня уже не хватает озу для хранения всех этих функций и их смысла? |
|||
Теория ООП Интерфейс. Правила игры. | + 16 | ||
Как использовать интерфейс в качестве аргумента в методе. Понимание конкретных шагов игры с точки зрения кода. Если игра в реале кажется простой и в нее может играть любой школьник, то при реализации даже такого простого алгоритма действий сразу вылазит целая куча подробностей и тут уже непонятно, как, что и куда писать и какое оно должно быть. Вот тут я уже вижу диаграммы классов. Идея называть методы кириллицей была плохая и мне не нравилось постоянно переключать раскладку. А вот в этом ролике как раз есть пояснение, зачем это было сделано. И тут сразу же у меня пропало раздражение от переключения. Теперь-то я точно понимаю, зачем я это делаю. |
|||
Теория ООП Интерфейс. Зачем он нужен. | + 16 | ||
Ничего нового. Ничего. Интерфейс это просто имена заранее определенных методов в классе. Без их реализации. Есть аппаратный интерфейс usb. Он заранее определен, электрические характеристики, протоколы и все такое. Но есть разные реализации на разных микросхемах, разные драйверы, есть даже софтовая реализация усб протокола в контроллерах, где нет аппаратного модуля. |
|||
Теория ООП ПОЛУФИНАЛЬНЫЙ УРОК. | + 16 | ||
Вобщем курс понравился. Как я уже не раз писал - это первый и единственный курс, который реально заставляет брать и делать. Может быть потому что он платный, хотя я прошел базовый бесплатный и тоже все делал. До этого я качал много видеокурсов и даже книжку в пдф купил. Но книжки скучные, а в курсах примеры абстгактные. В них нет решения реальных задач. Так учат в быдловузах, который я тоже не осилил. Понимание того, как реальные вещи переносить в код. В коде они выглядят совсем не так, как я себе это представлял в голове. Например вот тот же снеговик состоит из простых геометрических примитивов и по отдельности их создать просто. А как сделать так, чтобы они были связаны в одно целое и чтобы это было скрыто от программиста? Чтобы все они двигались как одно целое? Мой любимый раздел. Как всегда я мастер давать советы. 1 Нужна обязательно теория, чтобы в голове возник хоть какой-то образ или мозги подготовились бы к восприятию инфы. К этой теории нужны графические пояснения. Вроде студия может даже генерить диаграммы связанности классов или это можно нарисовать в mind map. Чтобы были видны связи. 2 Имена переменных. Они одинаковы и непонятно, эта переменная та же, что и вон та или же у них разные области видимости. Так и не понял смысла this. Писать не буду, что я думаю поповоду него и как я себе это представляю, попробую сам в коде тест. Пока я еще нигде не видел толкового объяснения этому слову. Вроде бы все. Вместо фотки мой логотип, имя не пишу. |
|||
Теория ООП Перемещение Снеговиков | + 16 | ||
Перемещать весь спрайт. Так и не понял смысла base.Move(position);. В предыдущем каменте я был прав насчет переноса move в класс спрайта. Правда я был без понятия, как это технически сделать. Опять же названия одинаковые или может я чего не понял? public override void Draw() { foreach (Shape shape in shapes) { shape.Draw(); } } Функция вызывает сама себя что ли? Или тут можно писать разные названия функций, чтобы можно было отличать их и не путать? |
|||
Теория ООП Перемещение других фигур | + 16 | ||
Да вроде бы все понятно. Отыскивать опечатки из-за копипасты. Я думал все будет несколько сложней в плане собирания примитивов в одну фигуру, а тут просто функцию создал, в нее напихал примитивов и все. Потом это скопипастил в обработчик кнопки. Надо в классе sprite делать метод move. |
|||
Теория ООП Перемещение круга | + 16 | ||
Приплюсовывать смещение к координатам. Понимание private void Demo() { A = new Pixel(0, 0); circle = new Circle(A, 20); circle.SetGraphics(graph); circle.Move(new Pixel(100, 100)); circle.Draw(); picture.Image = bmp; } Так и не понял, почему надо указывать 0,0. Это нелогично. Получается, что центр круга как бы сначала на 0.0, потом создается этот круг, но он еще не отрисован на холсте. Потом вызывается move с новыми координатами. Потом оно отрисовывается в памяти и только потом весь буфер с картинкой отображается на холсте. С моей точки зрения логичней было бы в методе move задавать не новые координаты, а смещение относительно текущих. Ну это как абсолютное и относительное значение. Но это чисто я так думаю. У каждого мозги по-разному работают. А еще я думал, что надо действительно к координатам каждой точки прибавлять смещение position, поэтому я в одном из прошлых каментов и писал, что это привело бы к сильному замедлению отрисовки. А оказывается, что проще и правильней просто в каждом классе примитива один раз прибавить это смещение. Вот за это мне и нравится этот курс, т.к. постепенно видно почему сделано так, а не этак. Я бы вот ни за что не догадался, как это все вот так красиво сделать. В голове вроде есть какое-то представление, а оказывается, что все делается куда проще и правильней. В других курсах просто преподносят что-то как факт. Типа делай так, потому что так надо. Поэтому я другие курсы смотрел и не досмотрел, а уж о практике и речи не было. А тут вон глаз закрывается уже, а решил добить этот урок, чтобы уже 50% показывало. |
|||
Теория ООП Спрайт для Снеговика | + 16 | ||
Создавать сложные фигуры из примитивов _более правильным_ способом через коллекции. Понимание SetGraphics при создании фигуры и при добавлении в коллекцию. Я так и не понял, зачем 2 раза делать public void AddShape(Shape shape) { shape.SetGrapphics(graph); shapes.Add(shape); } и snowman2 = new Sprite(); snowman2.SetGrapphics(graph); Закомментировал snowman2.SetGrapphics(graph); Выходит исключение, что ресурс graph пустой в этой функции. override public void Draw() { graph.DrawEllipse( pen, corner.x, corner.y, width, hight); } Выходит это для каждого примитива создается ресурс graph со своими настройками, линия там или круг, красный или зеленый. Но как по мне, то в основной инициализации snowman2 = new Sprite(); snowman2.SetGrapphics(graph); вторая строка лишняя. Оно должно быть скрыто и инициализироваться автоматом при создании примитива. Вобщем пока упрощали, то опять все усложнилось так, что забыли что и зачем нужно. (типа тут смайлик) Посмотрим, что там дальше будет. Может в следущих уроках как раз моя идея будет реализована. |
|||
Теория ООП Мощь полиморфизма | + 16 | ||
Вспомнил полиморфизм. Уже не помню, в с++ вроде не было абстрактных классов, только методы. Ничего. На самом деле полиморфизм не сложен в понимании, если использовать образы из реальной жизни. Объяснить принципы ооп могут не только лиш все, мало кто может это делать. |
|||
Теория ООП Переезд graph в базовый класс | + 16 | ||
Разносить одинаковые методы по разным классам и использовать в разных классах одну переменную graph, но чтобы она была привязана динамически к разным классам примитивов. Ничего. Пока еще не очень понял, когда надо писать this, а когда не надо. |
|||
Теория ООП Переезд метода Draw | + 16 | ||
Переносить конкретные реализации функции draw в свой класс для фигуры. Понимание всех этих правильных приведений типов, чтобы нигде ничего не пропустить, а то бывает ошибка вылазит там, где ее нет, т.к. в другом месте что-то не так сделал. Наконец-то началась оптимизация и раскладываний методов по полочкам. Раньше была неразбериха из-за одинаковых названий переменных в основном файле form1.cs, которые пересекались с внутренними переменными классов. Я-то знаю, что все должно быть внутри класса и показывать, что оно относится только к нему, что собственно и есть инкапсуляция. Сейчас код методов стал уходить из главного файла в конкретный файл отдельного примитива, но имеет одинаковый метод для рисования и без параметров, что очень важно. |
|||
Теория ООП Приведение с мотором | + 16 | ||
Создавать целую фигуру из разных типов примитивов. Натий пропущенную инициализацию массива snowman2, из-за чего выходило исключение. Теперь понятно, как сделать это через gettype и typeof, просто я не смотрел их конкретное применение и думал, что можно использовать как думаю я, а на самом деле typeof возвращает не тип объекта, а только true/false. Реализация switch case тоже не прокатила. Но и целая куча ифов тоже некрасиво. А еще я сделал цикл foreach, так красивей. Пришлось тоже в гугл лезть за правильным синтаксисом, а то я спутал его с пхп. В целом я ощущаю, что мои мозги боле менее начинают скрипеть и шестеренки проворачиваются. И откуда-то берутся силы делать уроки дальше. |
|||
Теория ООП Фигуральный базовый класс | + 16 | ||
Пока еще толком ничего, 50% реализовано. Ничего. Отрисовка линни должна получать на вход массив типа shape, который содержит другие массивы разных типов. При помощи switch case. Правда я попробовал и что-то не очень оно хочет работать. switch (shape.GetType()) { case Line: graph.DrawLine(...);; } typeof тоже не работает. |
|||
Теория ООП Богатое наследство | + 16 | ||
Вызов базового конструктора с родительского класса с параметрами. Если есть конструктор без параметров, то он вызовется автоматом при наследовании. Ничего. Нравится сокращать код. В прошлом задании надо было написать ответы на 3 вопроса. Оказалось, что я был прав в плане создания одного целого объекта снеговика с базовыми координатами. Разве что с углом поворота и коэффициентом трансформации не угадал. |
|||
Теория ООП Второй Снеговик | + 16 | ||
Переменная delta для перемещения по одной координате. Ничего. Насколько я помню из одной единственной "игры", что я делал на спектрумовском бейсике, надо просто менять координаты спрайта. 1 Создать новый объект типа snowman с базовыми координатами в виде аргументов конструктора. 2 Сделать методы move, rotate, scale. В них пропорцианально изменять каждую пару координат каждой точки. Я не знаю, как там работает поворот и так и не понял, поворот вокруг головы (плоскость вертикальног сечения) или же поворот на месте (плоскость горизонтального сечения). Вобщем как-то там это делается. Я не любитель таких алгоритмов и посему понятия не имею, как это вообще высчитать пропорции. Ну и могут предположить, что все это должно нехило так тормозить без поддержки директх или что там для графики используют. |
|||
Теория ООП Рисуем Снеговика | + 16 | ||
Рисовать в пейнте и потом переносить в код. Даже не думал, что можно так делать. Писать координаты точек. Пока нет. |
|||
Теория ООП Цветные карандаши | + 16 | ||
Вроде бы ничего нового. Прога достигла той точки сложности и запутанности, что я осмысливал, почему в одном конструкторе надо писать тип переменной color, а в другом не надо. public ColorBox(int x1, int y1, int x2, int y2, Color color) : this (new Pixel (x1, y1), new Pixel(x2, y2), color) Замечаний нет. Прога достигла наивысшей точки запутанности и я ожидал, когда начнется правильная организация кода. На всем протяжении этих уроков я понимал, что мы делаем как-то не так, но когда же будет как нужно? Наконец-то это началось. |
|||
Теория ООП Расстояние между пикселями | + 16 | ||
Можно делать несколько методов в структуре. Только я не понял вычисление от точки до точки. Было бы неплохо ссылку на матан. Ничего. |
|||
Теория ООП Пиксели для классов | + 16 | ||
Вызов одного конструктора через другой. Такого я еще не видел, хотя в прошлых уроках ничего особо нового не было. Понимание синтаксиса public Line(int x1, int y1, int x2, int y2) : this(new Pixel( x1, y1), new Pixel(x2, y2)) и привязку этой конструкции к коду. Очень хороший пример, когда надо сделать 2 конструктора с разными входными типами данных, но одинаковым действием. Хорошо показывает, как не дублировать код. Хотя я так сходу и не могу придумать, где бы мне такое применить. |
|||
Теория ООП Структура vs Класс | + 16 | ||
Передавать указатель на структуру при помощи ref. Думал в шарпе нет указателей. Ничего. Как я пришел к пониманию структур? Когда в пту изучал С и занимался еще дома с контроллерами. При помощи структуры хорошо организуются разные типы данных в одну переменную. Потом можно передать указатель на эту структуру и ее длину, а дальше побайтно считывать уже без разбору на типы. Это удобно, когда контроллеры обмениваются информацией в пакетах, но передача идет побайтно, а не разбивается по переменным. Из-за синтаксиса в шарпе происходит путанница класса со структурой. |
|||
Теория ООП Структура пикселя | + 16 | ||
Создавать структуры. Из-за невнимательности я опять написал присвоение координат пикселям _после_ создания всех объектов, а потом искал отладчиком, где я накосячил. Вроде все правильно и координаты такие же, а видно только четверть окружности. Потом уже глаз зацепился за расположение группы пикселей и тут как бы озарило, что объекты уже созданы, а пикселям еще не присвоены координаты. Я подумал, что может быть и все равно в какой последовательности, но перенес их в начало и все заработало. Уже опять 8 вечера и глаз закрывается. Наверное на сегодня хватит. Теперь я понял и увидел прогресс и логичность, а так же образность ооп. Для меня в голове проще представить линии, как связь 2х точек. А вместо этого надо в стандартный метод рисования линии вбивать аж 4 параметра координат. Это как бы совсем не образно и сразу теряется концентрация и все начинает путаться. Сейчас, глядя уже на такой код, у меня в голове образовалась образная картина всей проги и я понимаю зачем столько методов вложенных друг в друга и почему столько Draw, хотя который без аргументов делает совсем другие действия. Вобщем мне нравится развитие ситуации. Это понимание или прозрение дает новые силы и уверенность в дальнейших действиях следущих уроков. А то я сегодня сделал только 3 или 4 урока и больше времени потратил на просмотр ютуба. Завтра попробую сделать больше. Если кто-то говорит, что надо просто делать и потом само станет понятно, то сначала такие слова кажутся пустыми. Но стоит только дальше просто делать и действительно все становится понятно. Такие слова можно понять только уже после того, как совершил действия. Так что я тут тоже могу тупо сказать, что надо просто делать, хотя это очень трудно дается и лень делать то, что непонятно. Такие вот ощущения у меня. |
|||
Теория ООП Круглый класс | + 16 | ||
Ничего нового. Ничего. Тут все было понятно, по сути копипаста с прошлого класса. |
|||
Теория ООП Второй класс | + 16 | ||
Пока все известно. Ничего. Важно было замечание насчет наследования и причины невозможности наследования казалось бы общих характеристик. А так же насчет полиморфизма. Именно такие важные замечания и нужны. Т.е. все действия должны отвечать на вопрос "зачем" и "почему так, а не этак". Пока что в других курсах я не видел таких ответов. |
|||
Теория ООП Первый класс | + 16 | ||
Не могу сказать. Вроде бы ничего нового. Ничего. Непонятно с функцией Draw(). Эта же функция вызывается в своем же теле. Это рекурсия или нет? Насколько я понимаю - правилом хорошего тона является передавать в функцию переменную и сразу указывать ее тип. Draw(Line line2); вместо Draw(line2);, т.к. в начале они конечно инициализируются, но обычно пишут публичные переменные и я думал, что если не указан модификатор, то они по умолчанию публичные. Это все сбивает с толку. Касательно public Line(int x1, int y1, int x2, int y2) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; Опять же, насколько я знаю - переменные внутри метода должны по имени отличаться от внешних переменных хотя бы знаком _. А то опять путанница для начинающего и он будет думать, что this.x1 - это как бы x1, только он внутри метода и что имя это должно быть одинаково. Вобщем получилось все запутанно с именами функций и переменных. |
|||
Теория ООП Урок рисования | + 16 | ||
Смотреть внимательно. Найти причину отсутствия FromImage. Оказалось, что не надо делать Graphics graph = _NEW_ Graphics.FromImage(bmp); Только непонятно, почему. Мы же создали переменную graph и надо создать новый объект. Или не надо? Метод статичный что ли? А как узнать? Я писал автоматом new и мне подсказка выдает Graphics тоже и я тупо выбрал, а дальше там только 2 подпункта можно выбрать. Потом я забыл вызвать функцию Draw() и искал, почему не рисуется линия. Думал может со студией что не так или может у меня с графикой не так, ведь я свой виндовс сильно урезал и иногда бывают ошибки в разном софте из-за отсутствия файлов системы. Так было в одном из уроков с карточками для изучения английского - у меня был вырезан плеер и пришлось мне использовать vlc. Так что я полчаса тупо потратил на чтение форумов и поиск несуществующих ошибок. А все из-за невнимательности. Занимайтесь программированием на свежую голову. А то уже 20 часов, а я встал в 6 утра. |
|||
Теория ООП Инкапсуляция мечты | + 16 | ||
Инкапсуляция - засовывание одного в другое. Данные засовываются в транспортные протоколы типа tcp или udp. Эти пакеты потом засовываются еще в ip, добавляются адреса отправителя и получателя. Потом все это загружается в корабль типа фрейма и отправляется по электромагнитным волнам. Ничего. Замечаний нет. |
|||
Демо софт Квадратный калейдоскоп | + 16 | ||
Рисовать фигуры. Понимание сути отражения фигур. Честно говоря я до сих пор не понял. Матан терпеть не могу. По мне так проще управлять железом или работать с сетью. Поэтому я не стал проходить уроки с играми. Терпеть не могу игры. 1. Слишком сложно. Насколько я понял - цель урока была в реализации алгоритма отражения фигур. Если бв я это делал, то создал бы одну фигуру, размножил бы и показал. Потом бы уже поворачивал. А лучше сделать рисунок анимированный с переменными и чтобы можно было видеть изменения этих значений. Но это конечно возни много с динамическими рисунками. 2 Почему функция init() пишется в файле form1.cs? Получился кусок кода не в том месте, насколько я понимаю. 3 Не понравилось. Названия переменных не отражают их суть. Не знаю как у других, а у меня в голове на протяжении всего урока не было _полной картины_ того, что должно быть сделано, что мы делаем сейчас, что уже сделано и какие переменные когда изменяются. Поэтому понять алгоритм я так и не смог. 4. Предложение. Нужно перед началом урока делать вводную теоретическую часть с рисунками. Не знаю как там другие, а я мыслю образами в голове, поэтому я должен понимать целую картину и держать в голове все эти переменные. Т.е. их как бы предварительно надо инициализировать в голове и выделить под них память. А так они появлялись по ходу написания программы. Я понимаю, что с точки зрения ведущего - это было все очевидно, какая переменная за что отвечает, тем более до этого был вебинар. А вот кто с нуля стал делать по ролику, тому врят ли было понятно. (Когда я учился в высшей технической школе, на экзамене было задание и смысл его был в косметической переделке задания, которое мы делали на лабе 3 часа и кто не был на лабе, тот не смог сдать экзамен по с++, т.к. задание было такое, что без опыта его просто нереально сделать из-за непонимания способа представления реальных вещей в виде кода) Так же надо указывать, в каких пределах переменная поменяется. Т.е. взять размер квадратика 100х100 и нарисовать второй квадратик и показать, что переменная со 100 увеличилась например на 150 и теперь это уже начало или середина второго квадратика. --- Почему-то пропустил этот урок или же он появился недавно? Чисто случайно заметил, что не 100% набрал в этом разделе и решил доделать. Купил курс по ооп еще. |
|||
Демо софт Текстовый процессор | + 20 | ||
1. Изучил новый компонент textbox в его более расширенном виде. Думал для многострочного есть textarea. 2. Как заменять текст. Думал это по-другому будет, через функцию замены и она точно никак не связана с textbox типа text_editor.Text.Replace. Ничего. Я бы вместо кнопок сделал бы нормальное меню компонентом menuestrip. Так же можно было бы растянуть урок и сделать стандартные функции текстового редактора с отменюй, буфером обмена, то се. Хотя конечно это не ключевые пункты и можно самому уже дома навороты прилепить. |
|||
Нанософт Средняя оценка | + 20 | ||
1 Узнал новый контрол tooltip. Думал он работает как обычный контрол и его надо 2 раза добавить к лейблам, а оказывается оно несколько иначе делается. Я бы не догадался. 2 Узнал про сетку разметки, аналог тегу div. 3. Самое интересное было про делегатов. Синтаксис делегатов. В этот раз прога не потребовала самостоятельного допила нужных функций или переделки под мои условия. Поэтому за час управился. Синтаксис несколько сложный на первый взгляд. И напоминает это Callback что ли. В классе note.cs надо было писать так. delegate_show_notes show_notes; public Note(delegate_show_notes _show_notes) { this.show_notes = _show_notes; Clear(); } С подчеркиванием, чтобы было понятно какая переменная к чему относится. Хотя конечно студия сама подсвечивает, но все равно для первого раза вообще каша в голове от этих названийо динаковых. Еще непонятно, почему в классе есть упоминание делегата delegate_show_notes show_notes; А потом в основном файле мы его определяем. private void show_notes(string avg, string qty) { label_avg.Text = avg; label_qty.Text = qty; } Нарушается логика. По идее из готового класса надо и вызывать готовый делегат, как и другие методы того класса. До этого урока я делегаты представлял себе несколько по-другому. Там еще оператор += должен быть. |
|||
Демо софт Менеджер паролей | + 21 | ||
Работать с новыми контролами. Читать из файла .csv. Рисовать нужное количество контролов в зависимости от данных в файле. Ничего. Пришел к пониманию, что нужно переписать код так, чтобы было разделение вида от логики. Вроде как подсказали, что нужен паттерн одиночка, но я его пока не реализовал. На гугление потратил порядка 20 часов по паттернам. Скорей всего нужна будет платная консультация. В этот раз придется забить на этот урок и дальше пробовать, т.к. уже появляются запросы на изготовление софта, а я еще не настолько крут. |
|||
Демо софт Английские карточки | + 20 | ||
Боле менее следить и держать весь проект в голове. Гуглить альтернативные решения, ответы на ошибки компилятора. Добивать проект до конца после многочасовой работы. Уже 13 часов, а встал я в 19 часов прошлого дня. Это вторая задача за это время + перерывы на еду и отвлечение. Разобраться с компонентом vlc плеера и правильно задать ему путь к файлу + выставить опции компиляции и интеграции. Плохо, что изначально не было карты с переменными и функциями, чтобы понимать заранее, как будет устроена программа. Иначе уже из головы вылетает, какие типы данных приходят У меня стоит 8.1, обработанная winreducer перед установкой. Медиаплеер с его хламом был удален, как и многие компоненты. Отдельно он не устанавливается, т.к. просто не существует. Поэтому было решено найти альтернативу и она нашлась в виде activex vlc. Потрачены часы на поимку ошибок и разбор с правильным формированием пути к файлу. Путь к файлу начинается с указания протокола file:/// и только потом идет имя файла. file:///d:\\aaa\\bbb\\ccc.mp4" Не перепутайте слеши, а то они аж в глазах мелькают. Компонент добавляется как обычно + нужно добавить ссылки (references). В solution explorer есть пункт references, там правой кнопкой мыши "add reference", в разделе com найти поиском vlc. После этого добавятся 2 ссылки. Потом в коде form1.cs надо добавить using AxAXVLC; Потом самое главное - выставить настройки компиляции в свойствах проекта, раздел build. Для дебага и релиза надо указать платформу х86 в platform target. У кого система 64, нужно принудительно компилировать 86, т.к. обертка для длл влц есть только 32бит. Второй шаг - свойства линковки. В solution explorer в разделе preferences есть 2 ссылки AxAXVLC и AXVLC. Правой кнопкой мыши выбрать свойства и там в embed interop tipes поставить false. А копировать локально - true. После компиляции в папке с .ехе будут 2 файла: Interop.AXVLC.dll и AxInterop.AXVLC.dll Это обертки для axvlc.dll, что лежит в папке самого влц и является activex компонентом. При установке плеера надо выбрать там этот компонент для браузера internet explorer. |
|||
Демо софт Двенадцать месяцев | + 20 | ||
Работать с компонентами календаря и полем картинок. Ну засовывать и читать картинки в сам исполняемый файл. Доработать код, чтобы читал картинки из ресурсов. Насколько я знаю - в исполняемый файл можно вложить ресурсы в виде картинок и тогда не нужны будут исключения. Я потратил еще час на поиск решения - как прочитать динамически из ресурсов. Как работает? 1. Создаем переменную img с универсальным типом object. 2. Получаем некие данные из ресурсов. img = Properties.Resources.ResourceManager.GetObject("_" + month); Сами картинки имеют имена в виде свойсв вида Properties.Resources. _1, Properties.Resources._2... Однако можно получить содержимое в виде набора данных через дополнительный класс ResourceManager и его метод GetObject с именем ресурса. 3. Сконвертировать общий тип object в тип Image при помощи оператора as. pictureBox.Image = img as Image; https://msdn.microsoft.com/en-us/library/cscsdfbt.aspx |
|||
Нано-игры Арканоид - Уровень и ракетка | |||
|