Проблема в том, что вы используете простую форму setState(newValue)
, которая заменяет ваше состояние новым значением. Вы должны использовать функциональную форму setState( (prevState) => {} );
, потому что ваше новое состояние зависит от предыдущего состояния.
Попробуйте это:
const onKeyDown = e => {
if (!activeKeys.includes(e.key)) {
console.log("keydown", e.key, activeKeys);
setActiveKeys(prevActiveKeys => [...prevActiveKeys, e.key]);
}
};
const onKeyUp = e => {
console.log("keyup", e.key, activeKeys);
setActiveKeys(prevActiveKeys =>
[...prevActiveKeys].filter(i => i !== e.key)
);
};
Я успешно использовал компонент TPaintBox с DevExpress TcxImageList, который поддерживает PNGs, и затем оттянутый изображения в OnPaint с помощью средств списка. Работавший хорошо. DevEx также имеют TcxImage, но я не попробовал это.
Попробуйте PngComponents - пока они доступны...
Версия D2009 может быть найдена здесь
Править
На Google кодируют следующую ссылку для более старых версий Delphi:
http://code.google.com/p/cubicexplorer/downloads/detail?name=PngComponents.zip&can=2&q=
GraphicEx окажет Вам поддержку и png's и много других форматов.