2026/01/22(木) [n年前の日記]
#1 [lazarus] Lazarusの勉強中。その2
Windows11 x64 25H2上で Lazarus 4.4 を勉強中。
◎ recordについて :
Lazarus 4.4 で作業中に、record の中にプロシージャ(procedure、手続き処理)だかメソッドだかを含めることができなくて悩んだ。
こういうことをしたい場合、Lazarus ではオプション指定が必要らしい。ソースの最初のあたりに以下を記述しないと、record の中にプロシージャ(メソッド)を含めることはできないっぽい。
他にも色んなオプションがある模様。
_modeswitch - Free Pascal wiki
TObj = record
x, y: double;
dx, dy: double;
procedure Move(const AreaW, AreaH: integer; const dt: double); // ここがエラーになる
end;
こういうことをしたい場合、Lazarus ではオプション指定が必要らしい。ソースの最初のあたりに以下を記述しないと、record の中にプロシージャ(メソッド)を含めることはできないっぽい。
{$ModeSwitch advancedrecords}
他にも色んなオプションがある模様。
_modeswitch - Free Pascal wiki
◎ LazarusでtimeBeginPeriodを使いたい :
Windowsのタイマー精度は、そのままだと 15.6 msec。結構荒い。マルチメディア用としてタイマー精度を1msにする、timeBeginPeriod()、timeEndPeriod() を使いたい。
uses のところに、MMSystem を追加する。
精度を上げたら、アプリの終了時には元の精度に戻さないといけないらしいが…。以前のWindowsでは、timeBeginPeriod() を使うとOS全体のタイマー精度が上がってしまうので後片付け?をしないとよろしくなかったらしいのだけど。今現在のWindowsはアプリ毎にタイマー精度を変更できるように改善されているという話をどこかで見かけた。それが本当なら後片付けをし忘れても問題無いのだろうか…?
でもまあ、とりあえず、フォームの Create で timeBeginPeriod(1); を呼んで、フォームの Destroy で timeEndPeriod(1); を呼ぶようにしている。これでいいのだろうか…?
uses のところに、MMSystem を追加する。
精度を上げたら、アプリの終了時には元の精度に戻さないといけないらしいが…。以前のWindowsでは、timeBeginPeriod() を使うとOS全体のタイマー精度が上がってしまうので後片付け?をしないとよろしくなかったらしいのだけど。今現在のWindowsはアプリ毎にタイマー精度を変更できるように改善されているという話をどこかで見かけた。それが本当なら後片付けをし忘れても問題無いのだろうか…?
でもまあ、とりあえず、フォームの Create で timeBeginPeriod(1); を呼んで、フォームの Destroy で timeEndPeriod(1); を呼ぶようにしている。これでいいのだろうか…?
◎ LazarusでColorHLSToRGB()を使いたい :
HLS(色相、輝度、彩度)をRGBに変換する ColorHLSToRGB() を使いたい。
uses のところに、GraphUtil を追加する。
ColorHLSToRGB(色相, 輝度, 彩度) を指定する。TColor が返ってくる。各値は、0 - 240 か 0 - 255 を受け付けるっぽい?
ドキュメントには、引数が Word と書いてあって、Word は 0 - 65535 を取るらしいのだけど、実際に 0 - 65535 を指定してみると期待した結果にならなかった。
以下がソースっぽいけど…。これは 0 - 255 を与えるのだろうか…?
_Lazarus/lcl/graphutil.pp at master - ultibohub/Lazarus
以下のやり取りでは、0 - 255 を与えると書いてあるな…。
_HSL color
uses のところに、GraphUtil を追加する。
ColorHLSToRGB(色相, 輝度, 彩度) を指定する。TColor が返ってくる。各値は、0 - 240 か 0 - 255 を受け付けるっぽい?
ドキュメントには、引数が Word と書いてあって、Word は 0 - 65535 を取るらしいのだけど、実際に 0 - 65535 を指定してみると期待した結果にならなかった。
以下がソースっぽいけど…。これは 0 - 255 を与えるのだろうか…?
_Lazarus/lcl/graphutil.pp at master - ultibohub/Lazarus
以下のやり取りでは、0 - 255 を与えると書いてあるな…。
_HSL color
◎ Lazarusのショートカットキー :
気になったものだけメモ。環境は Windows11 x64 25H2 + Lazarus 4.4。
補完関係は以下で紹介されている。
_Lazarus For Delphi Users - Lazarus wiki
1行分を上下に移動するキー割り当てと、選択中の行を上下に移動するキー割り当ては、同じものを使えるように実装できそうな気もするのだけどな…。行を選択中か否かで処理を分ければ済みそうな…。
- Ctrl + Alt + Shift + ↑ : 1行分を上に移動
- Ctrl + Alt + Shift + ↓ : 1行分を下に移動
- Ctrl + Alt + Num8 : 選択中の行を上に移動
- Ctrl + Alt + Num2 : 選択中の行を下に移動
- Alt + D : 現在行をカット
- Alt + Y : 現在行をコピー。直後に Ctrl + V を叩けば行複製っぽくなる。
- Ctrl + Alt + Shift + Ins : 現在行を複製
- Clrl + Alt + Num0 : 選択中の行を複製
- Ctrl + Shit + ↑、Ctrl + Shift + ↓ : 宣言部と実装部を行き来する
- Ctrl + D : ソースコード整形
- Ctrl + Space : 各種補完
- Ctrl + W : 単語補完
- Ctrl + Shift + C : 変数への代入文だけを書いて、その行でこれを叩くと、変数の宣言が自動で追加される。
補完関係は以下で紹介されている。
_Lazarus For Delphi Users - Lazarus wiki
1行分を上下に移動するキー割り当てと、選択中の行を上下に移動するキー割り当ては、同じものを使えるように実装できそうな気もするのだけどな…。行を選択中か否かで処理を分ければ済みそうな…。
◎ フォーム上で線を引きたい :
フォームの上で線を引いたりして何かしらの図形を描画したい。
フォームは Canvas (TCanvas?) を持っているので、その Canvas を使えば図形が描けるのだとか。
手元で実験してる感じでは、以下のような記述ができた。
フォームは Canvas (TCanvas?) を持っているので、その Canvas を使えば図形が描けるのだとか。
- Canvas.MoveTo()、Canvas.LineTo() で線を引くことができる。
- Canvas.Polygon() で多角形を描画できる。
- Canvas.GradientFill() でグラデーション塗り潰しもできる。
- Canvas.Brush.Color で塗り潰し色を指定。
- Canvas.Pen.Color、Canvas.Pen.Width で、線の色や線幅を指定。
手元で実験してる感じでは、以下のような記述ができた。
// 背景を黒で消去
//Canvas.Brush.Color := clBlack;
//Canvas.FillRect(ClientRect);
// 背景をグラデーションで塗り潰し
bgcol0 := ColorHLSToRGB(Round(FMod((FHue + 64), 255)), 32, 255);
Canvas.GradientFill(ClientRect, bgcol0, clBlack, gdVertical);
// 線を描画
Canvas.Pen.Color := ColorHLSToRGB(Round(FHue), 128, 255);
Canvas.Pen.Width := 1;
for i := Low(FMyObj) to High(FMyObj) do
begin
if i = 0 then
Canvas.MoveTo(Round(FMyObj[i].x), Round(FMyObj[i].y))
else
Canvas.LineTo(Round(FMyObj[i].x), Round(FMyObj[i].y));
end;
Canvas.LineTo(Round(FMyObj[0].x), Round(FMyObj[0].y));
◎ フルスクリーン表示をしたい :
フォームをフルスクリーン表示(全画面表示)にしたい。今のところ以下のように書いてるけれど、これでいいのかな…。
この場合、タイトルバーが無くなるから、閉じるボタンを押すことができなくなる。キーを押したり、マウスクリックをしたら、アプリを終了するように処理を入れておかないといけない。フォームのイベントで、OnClick や OnKeyDown が来たら、Application.Terminate; を呼ぶようにしておいた。
BorderStyle := bsNone; // タイトルバー消去
Left := 0; // 表示位置 x
Top := 0; // 表示位置 y
Width := Screen.Width; // フォーム横幅を画面解像度に合わせる
Height := Screen.Height; // フォーム縦幅を画面解像度に合わせる
FormStyle := fsStayOnTop; // 最前面表示
Cursor := crNone; // フォーム上でマウスカーソル非表示
この場合、タイトルバーが無くなるから、閉じるボタンを押すことができなくなる。キーを押したり、マウスクリックをしたら、アプリを終了するように処理を入れておかないといけない。フォームのイベントで、OnClick や OnKeyDown が来たら、Application.Terminate; を呼ぶようにしておいた。
[ ツッコむ ]
以上、1 日分です。