Видео, книги, журналы, научные статьи, (по тематике форума), наше творчество
-
Андрей
- Архитектор
- Сообщения: 5528
- Зарегистрирован: 06 май 2015, 14:10
- Откуда: Чехов
- Благодарил (а): 479 раз
- Поблагодарили: 390 раз
Сообщение
Андрей » 30 ноя 2020, 11:50
Михаил Киселев писал(а): ↑30 ноя 2020, 10:56
судя по дизайну, вы используете массив button-элементов, хотя проще использовать StringGrid или DrawGrid (это готовая таблица из ячеек, и к ней легко применим матричный принцип обработки данных).
С этим я согласен. Но какой смысл менять то, что уже хорошо работает? Есть такая пословица у американцев: "Не надо чинить то, что не сломано".
Если же при переносе на Андроид (чему пока препятствует сетевой код, нужно его дорабатывать) окажется, что данный элемент интерфейса там будет выглядеть лучше (в чём я сомневаюсь, потому что на PC каждая кнопка имеет выпуклость, тени, состояние нажатия и на PC точно красивее выглядят кнопки), то можно подумать о переделке.
===
Также у нас используется наложение картинок на кнопки (TBitBtn). StringGrid сразу отметается.
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.
Андрей
-
Андрей
- Архитектор
- Сообщения: 5528
- Зарегистрирован: 06 май 2015, 14:10
- Откуда: Чехов
- Благодарил (а): 479 раз
- Поблагодарили: 390 раз
Сообщение
Андрей » 01 дек 2020, 18:04
Многие новички в программировании на Delphi озадачены изменением громкости системы в своих приложениях. Во многих форумах пишут код весьма замудренным. Я решил максимально просто показать код процедуры изменения громкости в системе. Вот собственно и сам код:
Код: Выделить всё
uses
MMSystem;
...
procedure SetVolume(const volL, volR: Word);
var
hWO: HWAVEOUT;
waveF: TWAVEFORMATEX;
vol: DWORD;
begin
FillChar(waveF, SizeOf(waveF), 0);
waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0);
vol := volL + volR shl 16;
waveOutSetVolume(hWO, vol);
waveOutClose(hWO);
end;
Кидаем на форму TrackBar, в палитре свойств прописываем: min=0, max=65535.
В событии OnChange пишем:
Код: Выделить всё
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
SetVolume(trackbar1.position, trackbar1.position);
end;
Получить громкость:
http://rusproject.narod.ru/winapi/w/wav ... olume.html
Код: Выделить всё
function GetVolume: Word;
var Woc : TWaveOutCaps;
vol : DWORD;
numV : byte;
begin
result:=0;
if WaveOutGetDevCaps(WAVE_MAPPER, @Woc, sizeof(Woc)) = MMSYSERR_NOERROR then
begin
if (Woc.dwSupport and WAVECAPS_LRVOLUME) = WAVECAPS_LRVOLUME then numV := 2
else numV := 1;
WaveOutGetVolume(WAVE_MAPPER, @vol);
if numV=1 then Result:=vol AND 65535 // единственный канал
else Result:=vol AND 65535; // левый канал
end;
end;
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.
Андрей
-
Андрей
- Архитектор
- Сообщения: 5528
- Зарегистрирован: 06 май 2015, 14:10
- Откуда: Чехов
- Благодарил (а): 479 раз
- Поблагодарили: 390 раз
Сообщение
Андрей » 05 дек 2020, 21:43
Работа с компонентами Ararat Synapse
Послать пакет на порт:
Код: Выделить всё
uses blcksock;
var sock: TUDPBlockSocket;
...
procedure SendString;
begin
sock:=TUDPBlockSocket.Create;
try
sock.Connect ('62.16.155.77', '5001');
if sock.LastError<>0 then begin ShowMessage ('error'); exit; end;
sock.SendString ('delivered via UDP');
finally
sock.Free;
end;
end;
Слушать порт (UDP Server):
Код: Выделить всё
procedure TSomeThread.Execute;
var
sock: TUDPBlockSocket;
size: integer;
buf: string;
begin
sock:=TUDPBlockSocket.Create;
try
sock.Bind('0.0.0.0','5001');
if sock.LastError<>0 then begin ShowMessage ('error'); exit; end;
while True do
begin
if terminated then break;
buf := sock.RecvPacket(1000);
if sock.lasterror=0 then
begin
// do something with data and prepare response data
sock.SendString(Buf);
end;
sleep(1);
end;
sock.CloseSocket;
finally
sock.Free;
end;
end;
http://synapse.ararat.cz/doku.php/publi ... :udpserver
https://webdelphi.ru/2013/12/kniga-o-sy ... -0-sokety/
https://webdelphi.ru/2011/03/post-dlya- ... -v-google/
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.
Андрей
-
Андрей
- Архитектор
- Сообщения: 5528
- Зарегистрирован: 06 май 2015, 14:10
- Откуда: Чехов
- Благодарил (а): 479 раз
- Поблагодарили: 390 раз
Сообщение
Андрей » 06 дек 2020, 02:57
Удалось мне сделать UDP-чат на компонентах Ararat Synapse. Причём столкнулся с той же проблемой, что и на Indy - не отправлял ответный пакет за NAT. И решение то же: экземпляр объекта Сервер и экземпляр объекта Клиент внутри одной программы должны быть одним и тем же объектом (переменной).
Следующий шаг - компиляция чата под Андроид и сеанс сообщений между Андроидом и Виндой.
Чат на Синапсе делается сложнее, чем на Инди - нужно самому создавать под слушающий код отдельный поток.
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.
Андрей
-
Андрей
- Архитектор
- Сообщения: 5528
- Зарегистрирован: 06 май 2015, 14:10
- Откуда: Чехов
- Благодарил (а): 479 раз
- Поблагодарили: 390 раз
Сообщение
Андрей » 07 дек 2020, 09:26
Андрей писал(а): ↑06 дек 2020, 02:57
Следующий шаг - компиляция чата под Андроид и сеанс сообщений между Андроидом и Виндой.
Проделан и следующий шаг - компиляция под Андроид при помощи LAMW и сеанс сообщений. Сетевой код для ШС под Андроид готов.
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.
Андрей
-
Андрей
- Архитектор
- Сообщения: 5528
- Зарегистрирован: 06 май 2015, 14:10
- Откуда: Чехов
- Благодарил (а): 479 раз
- Поблагодарили: 390 раз
Сообщение
Андрей » 07 дек 2020, 09:36
Реализация программы под Андроид
Для начала нам надо нарисовать игровое поле. Это будут Buttons или StringGrid, DrawGrid?
1. В Андроиде кнопки не делаются квадратными вроде. Нам надо на кнопки накладывать изображения. Есть ли там BitBtn?
2. Есть ли там StringGrid, DrawGrid?
3. Как в Андроиде будут выглядеть юникодные шахматные шрифты? Нужна проверка.
4. Сможем ли мы уместить 2 поля и чат на одном экране или свайп лево-право будет переключать поля?
5. Специфичные жесты на Андроиде: "тач", "тап", "свайп" (
https://yandex.ru/turbo/mob-mobile.ru/s ... sleng.html). Как их использовать при помощи компонентов Lazarus и рассчитаны ли на это компоненты Lazarus?
Под компонентами Lazarus я имею в виду Android-bridges компоненты из комплекта LAMW - Lazarus Android Module Wizard (jButton, jTextView).
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.
Андрей
-
Андрей
- Архитектор
- Сообщения: 5528
- Зарегистрирован: 06 май 2015, 14:10
- Откуда: Чехов
- Благодарил (а): 479 раз
- Поблагодарили: 390 раз
Сообщение
Андрей » 10 дек 2020, 10:59
Версия игры Шахматный сапёр 2.89 имеет следующие улучшения:
+ Добавлена плавная регулировка громкости звуков в игре, которая сохраняется в системе
+ Возможно полное отключение звука (уровень = 0)
+ Улучшен дизайн формы НАСТРОЙКИ
+ Улучшена графика игры (заменены стрелки)
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.
Андрей
-
Андрей
- Архитектор
- Сообщения: 5528
- Зарегистрирован: 06 май 2015, 14:10
- Откуда: Чехов
- Благодарил (а): 479 раз
- Поблагодарили: 390 раз
Сообщение
Андрей » 13 дек 2020, 18:59
Некоторые ответы по Андроиду:
- jButton нельзя делать квадратными
+ Шахматные шрифты на Андроиде есть и они хорошо отображаются
+ На Андроиде есть jImageBtn и они по умолчанию квадратные
- Эти jImageBtn при добавлении на форму вызывают ошибку компиляции APK, так что проверить их в деле не удалось
пока всё...
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.
Андрей
-
Андрей
- Архитектор
- Сообщения: 5528
- Зарегистрирован: 06 май 2015, 14:10
- Откуда: Чехов
- Благодарил (а): 479 раз
- Поблагодарили: 390 раз
Сообщение
Андрей » 19 дек 2020, 13:37
Возможно, jImageBtn при добавлении на форму вызывали ошибку компиляции APK из-за того, что я не добавил (загрузил) сами картинки на эти кнопки. То есть голая кнопка без картинки вызывает ошибку.
Пока не проверял эту версию...
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.
Андрей
-
Андрей
- Архитектор
- Сообщения: 5528
- Зарегистрирован: 06 май 2015, 14:10
- Откуда: Чехов
- Благодарил (а): 479 раз
- Поблагодарили: 390 раз
Сообщение
Андрей » 28 дек 2020, 20:31
В результате сетевых тестов 2.89 на ОЧЕНЬ плохих сетях было найдено несколько недочётов:
- если нужно угадать фигуру и она была выбрана и нажата, а пакет не дошёл - не происходит никакого события.
метод решения: до момента приёма подтверждения о доставке нужно повторно в цикле слать пакеты до победного конца (как было сделано с уведомлением о расстановке)
- если поменять Имя игрока во время игры, оно не меняется в заголовке формы
+ методом подбора найдено более точное значение для циклов ожиданий, 900 000 циклов вместо 3 000 000
- не написано внизу что Сетевая игра начинается (просто пишет "кликами мыши выставите фигуры")
ничего я не забыл, Михаил?
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.
Андрей