UnDo, ReDoの方法

150 views
Skip to first unread message

883

unread,
Aug 5, 2024, 5:34:29 AM8/5/24
to Japan RAD Studio User Group
こんにちわ。
Firebird+FireDACでUnDo,ReDoを検討中です。
今のところ、TFDQueryでxmlなりbinなりを出力・読込で実現しようと思っています。

DelphiでのUnDo, ReDoに定石みたいなものはありますでしょうか。

Hikaru Fukushi

unread,
Aug 5, 2024, 5:52:48 AM8/5/24
to radstu...@googlegroups.com
883さん、こんばんは。

> Firebird+FireDACでUnDo,ReDoを検討中です。
> 今のところ、TFDQueryでxmlなりbinなりを出力・読込で実現しようと思っています。

データベースへの操作をundo/redoしたい、ということでしょうか?
それともUI上の操作をundo/redoするのにデータベースをストレージとして
使用したい、ということでしょうか?


> DelphiでのUnDo, ReDoに定石みたいなものはありますでしょうか。

一般的にはデザインパターンのコマンドパターンを使うのが定石、という
ことになっています。"delphi command pattern"で検索するといろいろと
出てきます。また英語ですがこんな本もあります。

Hands-On Design Patterns with Delphi
https://www.packtpub.com/en-us/product/hands-on-design-patterns-with-delphi-9781789343243


Delphi-PRAXiSのこちらの一連のやり取りも参考になるかもしれません。

The best way to handle undo and redo. - Algorithms, Data Structures and Class Design - Delphi-PRAXiS [en]
https://en.delphipraxis.net/topic/7264-the-best-way-to-handle-undo-and-redo/


---
東洋テクニカルシステム株式会社 システム開発部 福士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fuk...@tts-inc.co.jp

883

unread,
Aug 5, 2024, 7:58:59 PM8/5/24
to Japan RAD Studio User Group
> データベースへの操作をundo/redoしたい、ということでしょうか?
> それともUI上の操作をundo/redoするのにデータベースをストレージとして
> 使用したい、ということでしょうか? 

本質問の目的はデータベース操作 の undo/redo です。

データベース操作の undo/redo 方法はいくつか考えました。
①DB自体をバックアップ、リストア。
②DB中のテーブルの状態をファイルに出力、読込。
③DB中のテーブルへのデータ遷移を何かに記録、その記録を辿る。

現状、DBファイルは1つで一人のみ編集可能という条件です。
①は流石に乱暴なので、②or③を検討したときに②が手軽かなと。

それで具体的に皆さんどんな事されてるのかなと。

UI操作のundo/redoも必要は必要なので、これから検討です。

2024年8月5日月曜日 18:52:48 UTC+9 Hikaru Fukushi:
Message has been deleted

883

unread,
Aug 26, 2024, 10:01:32 PM8/26/24
to Japan RAD Studio User Group
こんにちわ

今更ですが、②の方法はダメでした。
なんでか終了時にTFDQueryがエラーを吐きます。

docwiki で、「 データセットに対する undo(取り消し)/redo(やり直し)機能が簡単に実装できます。」
とあるのですが、サンプルコードがないかご存じな方いらっしゃいませんでしょうか。



2024年8月6日火曜日 8:58:59 UTC+9 883:

梅澤智実

unread,
Aug 28, 2024, 11:45:14 PM8/28/24
to radstu...@googlegroups.com
883さん、こんにちは。

示されたdocwikiのリンク先のページ(FireDAC.Comp.Client.TFDQuery.CachedUpdates)の下の方に「関連項目」の項が
あり、そこに「更新のキャッシング」というリンクがあるので、ざっと目を通してみてください。

そこの「 更新の追跡」の項に、undo/redoに関連しそうなメソッドへのリンクがあります。

たぶん、元リンクに書かれていた 「 データセットに対する undo(取り消し)/redo(やり直し)機能が簡単に実装できます。」 は、このあたりのことを言っていると思います。

また、サンプルですが、Delphiのサンプルフォルダ下を例えば「RevertRecord」で探すと以下のフォルダの更にサブフォルダ
がいくつか引っかかります。
(お使いのDelphiによっては多少異なるかもしれません)
C:\Users\Public\Documents\Embarcadero\Studio\23.0\Samples\Object Pascal\Database\FireDAC\Samples\Comp Layer


※ 「更新のキャッシング」は想定される運用形態によってはマッチしないかもしれません。

※   自分はこの機能は使ったことはありません。グリッド上での更新などはさせずに、項目をクリックした
     時に、その行の編集用のダイアログを表示させ、そのダイアログで[OK]を押したら値を確定させるような
     単純なインターフェースにしてます。
     ただし 「更新のキャッシング」は便利な機能なので多分、多くの方が使っていると思われます。

2024年8月27日(火) 11:01 883 <compcar...@gmail.com>:
--
このメールは Google グループのグループ「Japan RAD Studio User Group」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/radstudio-jp/372cac0b-9117-48ce-8b58-45795e648bc7n%40googlegroups.com にアクセスしてください。

883

unread,
Sep 1, 2024, 11:00:38 PM9/1/24
to Japan RAD Studio User Group
梅澤さん、こんにちわ。

情報ありがとうございます。
「更新のキャッシング」「更新の追跡」あたりを読みつつ、サンプル見つつ、試しに作りつつ機能を試しましたが、redoにあたる機能は見つかりませんでした。
更に「 FireDAC では、同じレコードの複数のバージョンを追跡しません。 」とあるため、同じ行の列毎のundoもできないのでは思われます。


2024年8月29日木曜日 12:45:14 UTC+9 梅澤智実:
Message has been deleted

883

unread,
Sep 2, 2024, 3:28:25 AM9/2/24
to Japan RAD Studio User Group
redo を継続して探してましたが、Deltaが変更データとの事でした。
ADMemTable1.Data := ADQuery1.Delta;
↑で差分レコードのみが ADMemTable1に保持されます。
後は、TFDDataSet.MergeDataSet で混ぜれば行けそうです。

しかし、今回は「並び順」を要素として持つので結構な量が対象となり・・・うーん・・・

2024年9月2日月曜日 12:00:38 UTC+9 883:

梅澤智実

unread,
Sep 3, 2024, 10:42:21 PM9/3/24
to radstu...@googlegroups.com
883さん、こんにちは。梅澤です。

すみません、最初のメールに書いたとおり、自分はこのあたりの機能を使ったことが無いので、ドキュメントや資料のどのあたりが
883さんの質問に該当しそうか、という程度しかお答えできません。

キャシュアップデートは使われている方もいらっしゃると思いますので、実際に使っている方のご意見を頂ければ...  と思います。

2024年9月2日(月) 16:28 883 <compcar...@gmail.com>:
このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/radstudio-jp/8ca06a05-3bbf-49f8-b4da-1e2c1c405c68n%40googlegroups.com にアクセスしてください。

883

unread,
Sep 4, 2024, 4:12:47 AM9/4/24
to Japan RAD Studio User Group
こんにちわ、梅澤さん。

レスくださった皆様を 否定するような文面になってしまって申し訳ないです。
調査継続してて、スレ放置するのもな何だかなぁと、誰かが同じ思いでココまで辿り着いて同じ調査しないようにという個人的な小さい思いで続けてるので、気軽に無視してください。

2024年9月4日水曜日 11:42:21 UTC+9 梅澤智実:

梅澤智実

unread,
Sep 5, 2024, 8:45:57 PM9/5/24
to radstu...@googlegroups.com
こんにちは。

> レスくださった皆様を 否定するような文面になってしまって申し訳ないです。

え、全然そんな風に思わなかったです。
気になさらないで大丈夫だと思いますよ。

何か分かった事があったり、他の疑問点などでも投稿していただけると、今後のためにありがたいです。


2024年9月4日(水) 17:12 883 <compcar...@gmail.com>:
--
このメールは Google グループのグループ「Japan RAD Studio User Group」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/radstudio-jp/b070074b-3141-424e-9a41-7ace3c0ca307n%40googlegroups.com にアクセスしてください。
Reply all
Reply to author
Forward
0 new messages