投稿

11月, 2024の投稿を表示しています

Delphi で Generics で Interface なリスト IList

Delphi の Generics なリストを interface で作成したい 検索結果のリストを渡すとき等、リストそのものがインターフェイスじゃないので、受け取り側で TList<IHoge> の中身だけ、別のリストへコピーとかになってしまうわけです そこで IList<IHoge> みたいなのがあれば、リストそのものを代入すれば参照カウンタが上がって安全にかつ迅速に引き渡せるハズ 調べたら 型が IInterface に制約される System.Classes. IInterfaceList とかいうのがあるので、THoge(List.Items[I]) のように取り出し時にキャストしてやれば使えます ※リストは参照なので、受け取り側で変更すると受け渡し側へも影響ありです IInterfaceList で OKな方はここまでで完了 Delphi で interface のベースクラスは 「TInterfacedObject を継承してないと参照カウンタは実装されません」とかいう制約がある TList との 多重継承はNGなので、TInterfacedObjectを継承したクラスの中で TList 型の変数を持って、出入り口を作り直せとかいう事らしい(ChatGPTの回答もそれだった) 先程の IInterfaceList も private に FList: TThreadList<IInterface> とかいうリストを持ってました それって Count やら Items やら(無駄に)再定義して、使っていくうちにアレが足りないとかなりそうじゃないですか... ということで、TList をそのまま Itemプロパティとして外部に出してやるという手抜き実装 type IListGen<T> = interface function _GetList: TList<T>; property Item: TList<T> read _GetList; end; TListGen<T> = class(TInterfacedObject, IListGen<T>) private ...

eximoポイ活の「実質」とかいうのが無理すぎw

イメージ
DMでわざわざ送ってきた eximoポイ活の「実質」とかいうのが無理すぎて笑える データ無制限が 実質 2,780円(税別) その内訳が キャンペーン期間中(終了時期未定)に dカードで 50,000円以上買い物 家族3回線以上契約 ドコモ光 or home 5G(dカード ポイント対象外) dカードでドコモ料金支払い(dカード ポイント対象外) 無制限プラン利用で、条件達成のために ドコモ光や home 5G 契約というのは、食べ放題の割引のために食べ放題をもう一つ注文するような感じでしょうか dカードのポイ活そのものが、キャンペーン中のみで、ドコモへの支払い(携帯, ドコモ光, home 5G)は対象外 こんな悲しい条件を考えて、キャンペーンと大々的にDMや広告打って、ご苦労なことです まぁ、引っかかる人がいるからやってんだろうけど

FireDAC(Delphi) でSqlite の Integer(int64) が int32に変換されてしまう

FireDAC(Delphi) でSqlite の Integer(int64)型を取得すると、int32に変換されてしまう AsLargeInt プロパティで取得しても同じ Query.FieldByName('created').Value; Query.FieldByName('created').AsLargeInt; Query.FormatOptions のマッピング変更を行うことで、int64へ切り替え Query := TFDQuery.Create(nil); Query.Connection := FDConnection; Query.FormatOptions.OwnMapRules := True; Query.FormatOptions.MapRules.Add(dtInt32, dtInt64); 参考文献 データ型マッピング(FireDAC) FireDac query not reading large integers correctly

Delphi12 の複数行文字列がフォーマッタにより破壊される

Delphi12 で導入された複数行を書ける文字列を含むソースにフォーマッタ(Ctrl + D)を適用すると、文字列が破壊されてしまう フォーマッタ前 S := ''' INSERT INTO table_name (user_name) VALUES (:user_name); '''; フォーマッタ後 S := ''' INSERT INTO table_name(user_name)VALUES(: user_name); '''; 改行が詰められ、コロンの後にスペースが挿入されてしまう等 (何故か先頭行の改行はCRのみになる) SQLインジェクション回避のため、VALUEをコロンで始まるパラメータ指定している場合、意味が変わってしまうので注意(変数宣言の : スペースが適用される) フォーマッタの定義を変更するか(他で思うようにフォーマットされない可能性) "+" 演算子でつなぐしかない様子

sqlite3 で更新時に更新日時、削除時に連鎖削除のトリガー

sqlite3 で更新時に更新日時、削除時に連鎖削除のトリガーをメモ ▼更新時に updated_at へローカル時刻を保存 CREATE TRIGGER トリガー名 AFTER UPDATE ON 対象テーブル BEGIN UPDATE 対象テーブル SET updated_at = DATETIME('now', 'localtime') WHERE rowid == NEW.rowid; END ▼親テーブルのレコード削除時に、親idを持つレコードを連鎖削除 CREATE TRIGGER トリガー名 AFTER DELETE ON 親テーブル FOR EACH ROW BEGIN DELETE FROM 対象テーブル WHERE 連結フィールド = OLD.id; END