Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094

Отключить кнопку на время выполнения команды

22.10.2019, 16:45. Показов 6858. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Не получается отключить кнопку на время выполнения команды.

View

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<Window x:Class="DisableButtonWhenMethodWork.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:VM="clr-namespace:DisableButtonWhenMethodWork.ViewModels"
        xmlns:local="clr-namespace:DisableButtonWhenMethodWork"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="400">
    
    <Window.DataContext>
        <VM:MainWindowVM></VM:MainWindowVM>
    </Window.DataContext>
 
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
 
        <DataGrid  Grid.Row="0" Grid.Column="2" Margin="5,5,5,0" 
                  AutoGenerateColumns="False" VerticalAlignment="Top" 
                  ItemsSource="{Binding Numbers}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Номер" Binding="{Binding Path=Value}"/>
            </DataGrid.Columns>
        </DataGrid>
 
        <StackPanel Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center">
            <Button Content="Run Method"
                    Command="{Binding RunMethodCommand}">
            </Button>
        </StackPanel>
    </Grid>
</Window>


ViewModel

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class MainWindowVM 
    {
        public ICommand RunMethodCommand { get; }
        public bool IsButtonEnabled { get; set; }
 
        public ObservableCollection<Number> Numbers { get; set; }
 
        public MainWindowVM()
        {
            IsButtonEnabled = true;
 
            RunMethodCommand = new RelayCommand(x => RunMethod(),
                x => IsButtonEnabled == true ? true : false);
 
            Numbers = new ObservableCollection<Number>();
        }
 
        private void RunMethod()
        {
            IsButtonEnabled = false;
 
            for (int i = 0; i < 9; i++)
            {
                Numbers.Add(new Number() { Value = i });
                Thread.Sleep(500);
            }
 
            IsButtonEnabled = true;
 
        }
    }


Что не так?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.10.2019, 16:45
Ответы с готовыми решениями:

Отключить вывод на экран протокола выполнения командного файла и команды echo.
Написать командный файл, который отключает вывод на экран протокола выполнения командного файла и команды echo.

Время выполнения команды
Понимаю что тема избитая, но все же. Время выполнения команды ардуино 1 такт, 2 такта или n тактов. Кварц 16 Мгц. 1 такт - 1/16 000...

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

28
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,081
Записей в блоге: 2
22.10.2019, 19:43
Чипс, я же вам показал как надо делать в теме Как отключить кнопки при выполнении команды.
Если было не понятно, поинтересовались бы в той теме.

1) Так как метод RunMethod выполняется синхронно, то на время его выполнения окно "подвешивается" и изменяться состояния элементов не будут. А когда метод завершён, то команда уже активна.
Поэтому в данном случае выполнение команды ОБЯЗАТЕЛЬНО должно быть АСИНХРОННЫМ!

2) Поле IsButtonEnabled имеет ЗНАЧИМЫЙ тип. И в делегат передается не ссылка на поле, а его значение на момент создания делегата. Последущие изменение значения поля уже никак не могут повлиять на созданный делегат. Поэтому в моем примере и был создан метод для CanExecute.
0
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
23.10.2019, 07:23  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если было не понятно, поинтересовались бы в той теме.
Я так и сделал, но никто не ответил.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поэтому в моем примере и был создан метод для CanExecute.
Это мне придётся на каждый метод делать ещё один метод?

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поле IsButtonEnabled имеет ЗНАЧИМЫЙ тип.
Так это не поле, а автосвойство, но по ходу дела разницы нет. ?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,081
Записей в блоге: 2
23.10.2019, 08:48
Цитата Сообщение от Чипс
Я так и сделал, но никто не ответил.
Не всегда есть возможность мгновенно отвечать.
Последний пост в той теме мой.

Цитата Сообщение от Чипс
Это мне придётся на каждый метод делать ещё один метод?
Если нужна проверка допустимости исполнения команды, то естественно это другой метод отличный от самого исполнения команды. Даже если этого делать через отдельное свойство VM, то это тоже другой метод с другим кодом. А команда предоставляет два связанных метода под одной оболочкой. Так же как это делает свойство - это два метода set и get под одной оболочкой.

Цитата Сообщение от Чипс
Так это не поле, а автосвойство, но по ходу дела разницы нет. ?
Да, разницы нет: поле, метод, свойство. Значимый тип передаёт только значение, а данном случае нужна ссылка.
0
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
23.10.2019, 11:18  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не всегда есть возможность мгновенно отвечать.
Последний пост в той теме мой.
Да, я не сразу заметил, пришёл кот, начал делать "мяу", я отвлёкся и начал думать, что ему надо! Не волнуйтесь, я его уже наказал, дал гречку без мяса.

Мне всё таки хочется увидеть полное решение вопроса на приме моего кода, так как по аналогии буду рефакторить кучу кода, не хочется потом всё переделывать (опять).

Ну или подождите, я сейчас сделаю сам, а вы мне скажите, правильно или нет.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,081
Записей в блоге: 2
23.10.2019, 11:25
Лучший ответ Сообщение было отмечено Чипс как решение

Решение

Чипс, в той же теме я дал полное решение.
Вы его пробовали использовать?

Но своё тоже выкладывайте - посмотрю.

Добавлено через 2 минуты

Не по теме:

Чипс, коту - мое сочувствие....

1
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
23.10.2019, 15:41  [ТС]
Сделал так :

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class MainWindowVM 
    {
        private bool IsButtonEnabled { get; set; }
        public RelayCommand RunMethodCommand { get; }
 
        public ObservableCollection<Number> Numbers { get; set; }
 
        public MainWindowVM()
        {
            IsButtonEnabled = true;
 
            RunMethodCommand = new RelayCommand(x => RunMethod(), x => RunCanMethod());
 
            Numbers = new ObservableCollection<Number>();
        }
 
        private bool RunCanMethod() => IsButtonEnabled;
        private async void RunMethodAsync()
        {
            IsButtonEnabled = false;
            RunMethodCommand.Invalidate();
 
            await Task.Run(() => RunMethod());
 
            IsButtonEnabled = true;
            RunMethodCommand.Invalidate();
        }
 
        private void RunMethod()
        {
            for (int i = 0; i < 9; i++)
            {
                Numbers.Add(new Number() { Value = i });
                Thread.Sleep(500);
            }
        }
    }
Не работает, я всё ещё могу повторно нажать кнопку!

Добавлено через 2 минуты
Реализация ICommand

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#region Делегаты для методов WPF команд
    public delegate void ExecuteHandler(object parameter);
    public delegate bool CanExecuteHandler(object parameter);
    #endregion
 
    #region Класс команд - RelayCommand
    /// <summary>Класс реализующий интерфейс ICommand для создания WPF команд</summary>
    public class RelayCommand : ICommand
    {
        private readonly CanExecuteHandler _canExecute;
        private readonly ExecuteHandler _onExecute;
        private readonly EventHandler _requerySuggested;
 
        /// <summary>Событие извещающее об изменении состояния команды</summary>
        public event EventHandler CanExecuteChanged;
 
        /// <summary>Конструктор команды</summary>
        /// <param name="execute">Выполняемый метод команды</param>
        /// <param name="canExecute">Метод разрешающий выполнение команды</param>
        public RelayCommand(ExecuteHandler execute, CanExecuteHandler canExecute = null)
        {
            _onExecute = execute;
            _canExecute = canExecute;
 
            _requerySuggested = (o, e) => Invalidate();
            CommandManager.RequerySuggested += _requerySuggested;
        }
 
        public void Invalidate()
            => Application.Current.Dispatcher.BeginInvoke(new Action(() =>
            {
                CanExecuteChanged?.Invoke(this, EventArgs.Empty);
            }), null);
 
        /// <summary>Вызов разрешающего метода команды</summary>
        /// <param name="parameter">Параметр команды</param>
        /// <returns>True - если выполнение команды разрешено</returns>
        public bool CanExecute(object parameter) => _canExecute == null ? true : _canExecute.Invoke(parameter);
 
        /// <summary>Вызов выполняющего метода команды</summary>
        /// <param name="parameter">Параметр команды</param>
        public void Execute(object parameter) => _onExecute?.Invoke(parameter);
    }
    #endregion
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,081
Записей в блоге: 2
23.10.2019, 17:03
Чипс, повторно во время выполнения команды?
То есть пяти секундного неактивного состояния кнопки нет?
0
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
23.10.2019, 17:52  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
То есть пяти секундного неактивного состояния кнопки нет?
Нет!
Пока крутится цикл, я могу сколько угодно раз нажать на кнопку!
0
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
23.10.2019, 17:59  [ТС]
Проект целиком во вложении :
Вложения
Тип файла: 7z DisableButtonWhenMethodWork.7z (187.1 Кб, 0 просмотров)
0
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
23.10.2019, 18:23  [ТС]
Собственно говоря, а зачем мне это нужно!
Мне нужно с клиента подключится к серверу, код подключения я уже написал и он работает, когда клиент подключается к серверу кнопка "Подключится" становится неактивной, но есть проблема, что подключение происходит не мгновенно, следовательно кнопка "Подключится" переходит в неактивное состояние не сразу и у пользователя есть возможность нажать её ещё раз, а я не хочу писать обработчик ошибок на такой случай, так как считаю, что проще погасить кнопку "Подключится" на время установление соединения.
Но может есть другое решение моей проблемы? А то я вижу в WPF отключить кнопку настоящая проблема
А в WinForm тоже так сложно с этим?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,081
Записей в блоге: 2
23.10.2019, 18:48
Чипс, я могу проверить проект.
Я сейчас в длительной поездке. Без компа.

По коду не могу понять, что у вас не так.
Вроде, всё правильно.

Поставьте точку останова на методе RunCanMethod - проверьте вызывается ли этот метод.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,081
Записей в блоге: 2
23.10.2019, 19:15
Чипс, я сейчас обратил внимание на то что у вас в АСИНХРОННОМ методе изменяется коллекция ObservableCollection.
Её представление в View есть?
И она в View изменяется?

Вообще-то в этом месте должно возникать исключение.

Что-то я никак не могу понять ваш код.
Не сам код, а как он работает.
0
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
23.10.2019, 19:16  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поставьте точку останова на методе RunCanMethod - проверьте вызывается ли этот метод.
Да, он постоянно вызывается.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я сейчас в длительной поездке. Без компа.
Ну что поделать... потом создам тему ещё раз
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,081
Записей в блоге: 2
23.10.2019, 19:22
Чипс, а при вызовах значение свойства IsButtonEnabled разное?
0
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
23.10.2019, 20:27  [ТС]
Элд Хасп Я нашёл что не так.

Я в команду закидывал не асинхронный метод :
Цитата Сообщение от Чипс Посмотреть сообщение
RunMethodCommand = new RelayCommand(x => RunMethod(), x => RunCanMethod());
Подправил:
C#
1
RunMethodCommand = new RelayCommand(x => RunMethodAsync(), x => RunCanMethod());
И сам метод тоже подправил
C#
1
2
3
4
5
6
7
8
9
10
private void RunMethod()
        {
            for (int i = 0; i < 9; i++)
            {
                Action action = new Action(() => Numbers.Add(new Number() { Value = i }));
                Application.Current.Dispatcher.BeginInvoke(action, null);
                
                Thread.Sleep(500);
            }
        }
Всё заработало.
Всему виной невнимательность =(

Всё ровно обидно, что такой заковыристый способ получился =(
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,081
Записей в блоге: 2
23.10.2019, 22:00
Чипс, это не так.
Так выглядит из-за неполной реализации.

Давайте разберём по частям в MVVM.

Коллекция Numbers содержит данные. И эти данные должны быть получены из Модели.
Метод добавляющий данные не сам добавляет данные, а обращается к методу Модели.
Когда Модель не может исполнять метод она об этом извещает.
Поэтому проверяющий метод команды считывает состояние Модели.
В прослушке Модели просто проверяется обновление состояния и вызывается метод Invalidate команды.

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

Также немного усложнён код из-за очень простой реализации RelayCommand. В теме "WPF команды" должен быть класса реализующий асинхронные команды. С таким классом код ещё упростится.
0
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
24.10.2019, 11:48  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Коллекция Numbers содержит данные. И эти данные должны быть получены из Модели.
Метод добавляющий данные не сам добавляет данные, а обращается к методу Модели.
Когда Модель не может исполнять метод она об этом извещает.
Поэтому проверяющий метод команды считывает состояние Модели.
В прослушке Модели просто проверяется обновление состояния и вызывается метод Invalidate команды.
Мне сложно представить как это должно выглядеть в коде, нужно увидеть грамотный пример именно в коде.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
То есть почти вся логика которая сейчас присутствует в методах команды, на самом деле
относится к бизнес-логике и должна располагаться в Модели. А там она будет и так реализована. И в VM останется просто проброска методов команды на методы Модели.
Вы имеете виду, что мне надо Модель завернуть в паттерн фабрика классов, а не делать новые объекты во ViewModel?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Также немного усложнён код из-за очень простой реализации RelayCommand. В теме "WPF команды" должен быть класса реализующий асинхронные команды. С таким классом код ещё упростится.
Я взял реализацию отсюда : WPF команды и MVVM. Часть 1. [WPF, Элд Хасп]

Я не знаю, где ещё можно взять реализацию, чтобы упростить код.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,081
Записей в блоге: 2
24.10.2019, 13:27
Чипс, в этой же теме есть пост от kolorotur с классом для асинхронных команд WPF команды и MVVM. Часть 1. [WPF, Элд Хасп]
В следующих постах есть пример с использованием.

Добавлено через 6 минут
Чипс, нет, я не за фабрику.
У вас же это эмуляция получения данных из удаленного источника.
Получать данные будет Модель.
В Модели должно быть свойство сообщающее о её состоянии: может она обработать следующий запрос или нет.
Метод исполнения команды обращается за данными к Модели.
Модель изменяет своё состояние, что она сейчас занята обработкой запроса.
Метод состояния команды получает значение от состояния Модели.

На смарте не удобно, но постараюсь накидать это кодом.
0
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
24.10.2019, 16:41  [ТС]
Да, всё так как вы говорите.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
На смарте не удобно, но постараюсь накидать это кодом.
Давайте я тоже код подготовлю, более подходящий к проблеме, а то созданный мой пример не очень.

Добавлено через 50 минут
Вот смотрите, что получается:

View

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<Window x:Class="EmulationOfClient.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:VM="clr-namespace:EmulationOfClient.ViewModels"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="300">
    <Window.DataContext>
        <VM:MainWindowVM></VM:MainWindowVM>
    </Window.DataContext>
    <Grid>
        <StackPanel HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    Orientation="Horizontal">
            <Button Content="Подключится" 
                    Margin="7 0 0 0"
                    Command="{Binding ConnectToServerCommand}">
            </Button>
 
            <Label Content="Связь с сервером : "></Label>
            <Ellipse Width="20" Height="20">
                <Ellipse.Style>
                    <Style TargetType="Ellipse">
                        <Setter Property="Fill" Value="Red"/>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IsConnection}" Value="True">
                                <Setter Property="Fill" Value="Green"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Ellipse.Style>
            </Ellipse>
        </StackPanel>
    </Grid>
</Window>


Model

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ClientModel
    {
        public bool IsConnection { get; set; }
 
        public ClientModel()
        {
            IsConnection = false;
        }
 
        public void ConnectToServer()
        {
            //Идёт подключение к серверу
            Thread.Sleep(5000);
 
            IsConnection = true;
        }
 
        public void DisconnectFromServer()
        {
            IsConnection = false;
        }
    }


ViewModel

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class MainWindowVM : OnPropertyChangedClass
    {
        ClientModel clientModel;
 
        /// <summary>Есть связь с сервером?</summary>
        public bool IsConnection
        {
            get => clientModel.IsConnection;
            set
            {
                if (value == clientModel.IsConnection)
                    return;
                clientModel.IsConnection = value;
                OnPropertyChanged("IsConnection");
            }
        }
 
        public ICommand ConnectToServerCommand { get; }
 
        public MainWindowVM()
        {
            ConnectToServerCommand = new RelayCommand(x => ConnectToServer(),
                x => IsConnection == false ? true : false);
 
            clientModel = new ClientModel();
        }
 
        private void ConnectToServer()
        {
            clientModel.ConnectToServer();
 
            OnPropertyChanged("IsConnection");
        }
    }


Вот и получается ЗАСАДА!
Я не могу понять как "потушить" кнопку пока идёт подключение, так как CanExecuteHandler уже заполнен!
C#
1
2
            ConnectToServerCommand = new RelayCommand(x => ConnectToServer(),
                x => IsConnection == false ? true : false);
Вообще не знаю, что делать =(

Добавлено через 1 минуту
Кнопка подключится отключает по завершению работы команды, но как её отключить на время выполнения команды?

Добавлено через 2 минуты
Может заблокировать всё окно, выдать пользователю картинку "Идёт подключение" и дело с концом, а то блокировать кнопку во время выполнения команды слишком громоздко.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.10.2019, 16:41
Помогаю со студенческими работами здесь

Ограничить время выполнения команды
Собственно сабж, как можно реализовать ограничение на время работы команды. Допустим, если если команда выполняется дольше 2с., то послать...

Среднее время выполнения команды
Подскажите, пожалуйста, как можно посчитать среднее время выполнения команды? Добавлено через 16 секунд *программы

Как задать время выполнения команды?
Нужно что бы следующая команда выполнялась спустя некоторое (заданное) время. Как это реализовать?

Отключить кнопку Button во время анимации
Суть программы, нужно нажать на кнопку Button, дальше запуститься анимация в компоненте Image ( когда идет анимация, надо что бы кнопка...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru