使用: Delphi XE2、DBExpress、Firebird
フォーム、パネル、編集など、および Timage と Timage の子孫を含む、メイン スレッド外の VCL コントロールに安全にアクセスできません。別のスレッド(メインスレッドとは異なる)でClientDataSet(マスター/詳細)を開く必要があります。
データベースへのアクセス中にアニメーション化されたスプラッシュ画面を作成する必要があります
誰かがこれを行う方法の簡単な例を教えてもらえますか?
使用: Delphi XE2、DBExpress、Firebird
フォーム、パネル、編集など、および Timage と Timage の子孫を含む、メイン スレッド外の VCL コントロールに安全にアクセスできません。別のスレッド(メインスレッドとは異なる)でClientDataSet(マスター/詳細)を開く必要があります。
データベースへのアクセス中にアニメーション化されたスプラッシュ画面を作成する必要があります
誰かがこれを行う方法の簡単な例を教えてもらえますか?
スレッドでのデータベース アクセスは問題ないと思います。
dbExpress データベースへのスレッド アクセスの完全な例 (メイン スレッドへのフィードバックを含む) については、Marco Cantùが作成した例 ( dbexpress_firebird_examples ) を参照してください。
これには、すべてのデータベース接続設定を にTDataModule
配置し、スレッド アクセスごとにこのデータ モジュールのインスタンスを作成することが含まれます。
とにかく、アニメーション Gif を使用してバックグラウンド スレッド プロセスについて GUI に通知するには、次の例を示します。
unit TestAnimatedScreen;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Imaging.GIFImg,
Vcl.ExtCtrls;
type
TMyEndNotify = procedure (value: Boolean) of object;
type
TMyThread = class(TThread)
private
fEndNotification : TMyEndNotify;
procedure NotifyEndOfThread;
protected
procedure Execute; override;
public
Constructor Create(endNotification : TMyEndNotify);
end;
type
TMainForm = class(TForm)
Image1: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FShowAnimation : Boolean;
procedure SetShowAnimation(value : Boolean);
public
{ Public declarations }
property ShowAnimation : Boolean read FShowAnimation write SetShowAnimation;
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMyThread.NotifyEndOfThread;
begin
if Assigned(fEndNotification) then
fEndNotification(False);
end;
constructor TMyThread.Create(endNotification: TMyEndNotify);
begin
Inherited Create(false);
fEndNotification := endNotification;
Self.FreeOnTerminate := True; // Free automatically
end;
procedure TMyThread.Execute;
begin
try
{Add your database access code here}
Sleep(5000); // Simulate lengthy process
finally
Synchronize(NotifyEndOfThread);
end;
end;
{ TMainForm }
procedure TMainForm.Button1Click(Sender: TObject);
begin
ShowAnimation := True;
TMyThread.Create(Self.SetShowAnimation);
end;
procedure TMainForm.SetShowAnimation(value: Boolean);
begin
FShowAnimation := Value;
if FShowAnimation then
begin
{Add animation code here}
Button1.Enabled := false;
Button1.Caption := 'Processing, please wait ...';
(Image1.Picture.Graphic as TGIFImage).AnimateLoop := glEnabled;
(Image1.Picture.Graphic as TGIFImage).Animate := true;
end
else
begin
{Stop animation}
(Image1.Picture.Graphic as TGIFImage).Animate := false;
Button1.Caption := 'Start lengthy process';
Button1.Enabled := True;
end;
end;
end.
object MainForm: TMainForm
Left = 0
Top = 0
Caption = 'MainForm'
ClientHeight = 265
ClientWidth = 236
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Image1: TImage
Left = 8
Top = 8
Width = 200
Height = 200
AutoSize = True
IncrementalDisplay = True
end
object Button1: TButton
Left = 8
Top = 224
Width = 200
Height = 25
Caption = 'Start lengthy process'
TabOrder = 0
OnClick = Button1Click
end
end
Delphi 2007 よりも古いバージョンの Delphiを使用している場合は、アニメーション GIF の実装方法の詳細について、「デルファイ フォームでアニメーション GIF を使用する方法」を参照してください。
私が使用したアニメーション GIF は、ここにあります。