線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1705
推到 Plurk!
推到 Facebook!

為什麼我要從一個Form上刪除TMyBrowser都會出錯!

答題得分者是:sryang
bill534
一般會員


發表:38
回覆:51
積分:17
註冊:2007-02-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-16 11:24:17 IP:125.230.xxx.xxx 訂閱
為什麼我要刪除貼在Form上的TMyBrower元件都會出現Access Violation的異常dialog, delphi就關不掉了,但程式執行時卻不會出錯喔!在TMyBrowser元件上左擊兩下,設訂窗也會正常出現!



unit MyBrowserUnt;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, MyMemory, DesignEditors, DesignIntf, Grids, SortGrid, ExtCtrls,
StdCtrls, ToolsAPI;

type
TMyDataType = (asBoolean = 0, AsString, AsWord, AsDword, AsFloat);

TBrowserMap = packed record
Control: pointer;
DataType: TMyDataType;
DataLength: Integer;
Interval: integer; // 單位:50ms,1 : 50ms,2 : 100ms......
end;
pBrowserMap = ^TBrowserMap;
//
TfrmMyBrowser = class(TForm)
grid1: TSortGrid;
Button1: TButton;
ComboBox1: TComboBox;
procedure FormResize(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure grid1GetCellFormat(Sender: TObject; Col, Row: Integer;
State: TGridDrawState; var FormatOptions: TFormatOptions);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
Items: TList;
procedure SaveParam;
{ Private declarations }
protected
Designer: IDesigner;
procedure UpdateView;
procedure ValidateComponents;
public
{ Public declarations }
constructor Create(AOwner: TComponent; _Designer: IDesigner); reintroduce;
overload;
destructor Destroy; override;
procedure LoadComponents;
procedure SetDesigner(_Designer: IDesigner);
{ Public declarations }
end;

TMyBrowserEditor = class(TComponentEditor)
public
// destructor Destroy; override;
procedure Edit; override;
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount(): Integer; override;
end;

TMyBrowser = class(TMyComponent)
private
FItems: TList;
protected
FUpdateEnabled: Boolean;
FUpdateTimer: TTimer;
procedure OnUpdateTimer(Sender: TObject);
procedure SetUpdateEnabled(Value: Boolean);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure LoadParam(fName: string = ''); override;
property Items: TList read FItems write FItems;
published
property UpdateEnabled: Boolean read FUpdateEnabled write SetUpdateEnabled;
end;


procedure Register;

implementation

{$R *.dfm}

var
DesignForm: TfrmMyBrowser;

procedure Register;
begin
RegisterComponents('MyVCL', [TMyBrowser]);
RegisterComponentEditor(TMyBrowser, TMyBrowserEditor);
end;

{ TMyBrowserEditor }

procedure TMyBrowserEditor.Edit;
begin
if (DesignForm = nil) then
DesignForm := TfrmMyBrowser.Create(nil, designer);
DesignForm.SetDesigner(Designer);
DesignForm.Show();
end;

procedure TMyBrowserEditor.ExecuteVerb(Index: Integer);
begin
case (Index) of
0:
begin
end;
1:
begin
end;
else
// Edit();
end;
end;

function TMyBrowserEditor.GetVerb(Index: Integer): string;
begin
case (Index) of
0:
begin
end;
1:
begin
end;
else
Result := '';
end;
end;

function TMyBrowserEditor.GetVerbCount(): Integer;
begin
Result := 3;
end;

procedure TfrmMyBrowser.FormResize(Sender: TObject);
begin
// ThreadEventsListView.Column[1].Width := ThreadEventsListView.ClientWidth - ThreadEventsListView.Column[0].Width;
// StdEventsListView.Column[1].Width := StdEventsListView.ClientWidth - StdEventsListView.Column[0].Width;
end;

procedure TfrmMyBrowser.FormShow(Sender: TObject);
begin
FormResize(Sender);
ValidateComponents;
end;

constructor TMyBrowser.Create(AOwner: TComponent);
begin
inherited Create(AOwner);

if not (csDesigning in ComponentState) then
begin
FUpdateTimer := TTimer.Create(Self);
FUpdateTimer.Enabled := False;
FUpdateTimer.OnTimer := OnUpdateTimer;
FUpdateTimer.Interval := 45;
end;
end;

destructor TMyBrowser.Destroy;
begin
//if not (csDesigning in ComponentState) then
// CloseHandle(hdEvent);
FUpdateTimer.Enabled := False;
FUpdateTimer.Free;
//
inherited Destroy;
end;

procedure TMyBrowser.LoadParam(fName: string = '');
begin
// TODO -cMM: TMyComponent.LoadParam default body inserted
end;

procedure TMyBrowser.OnUpdateTimer(Sender: TObject);
begin
// 20081215.bill 更新到時各元件的內容值 !

end;

procedure TMyBrowser.SetUpdateEnabled(Value: Boolean);
begin
if (Value = FUpdateEnabled) then
Exit;

FUpdateEnabled := Value;
FUpdateTimer.Enabled := Value;
end;

{ TSynchroMethodsForm }

constructor TfrmMyBrowser.Create(AOwner: TComponent; _Designer: IDesigner);
begin
inherited Create(AOwner);
Items := TList.Create;
self.SetDesigner(_Designer);
ValidateComponents;
end;

destructor TfrmMyBrowser.Destroy;
begin
inherited;
end;

procedure TfrmMyBrowser.LoadComponents;
begin
// TODO -cMM: TfrmMyBrowser.LoadComponents default body inserted
end;

procedure TfrmMyBrowser.ValidateComponents;
begin
// 20081215.Bill
end;

procedure TfrmMyBrowser.grid1GetCellFormat(Sender: TObject; Col,
Row: Integer; State: TGridDrawState; var FormatOptions: TFormatOptions);
var
s1: string;
begin
if row = 0 then
begin
FormatOptions.AlignmentHorz := taCenter;
FormatOptions.AlignmentVert := taMiddle;
// 20081215.bill 顯示Grid的Title !!
// 20081215.bill [col,row] col:表示橫向 , row:表示直向
case col of
0: s1 := 'Components';
1: s1 := 'Data';
2: s1 := 'Length';
3: s1 := 'Interval';
end;
if grid1.Cells[col, row] <> s1 then
grid1.Cells[col, row] := s1;
end
else
begin
end;
end;

procedure TfrmMyBrowser.SaveParam;
begin
// TODO -cMM: TfrmMyBrowser.SaveParam default body inserted
end;

procedure TfrmMyBrowser.SetDesigner(_Designer: IDesigner);
begin
Designer := _Designer;
if (Designer <> nil) then
UpdateView();
end;

procedure TfrmMyBrowser.UpdateView;
var
n1, n2: integer;
p1: pBrowserMap;
begin
if (Designer = nil) then
Exit;
grid1.Clear;
Items.Clear;
if Designer.Root.ComponentCount > 0 then
begin
grid1.RowCount := Designer.Root.ComponentCount 1;
n2 := 1;
for n1 := 0 to designer.Root.ComponentCount - 1 do
begin
new(p1);
p1^.Control := designer.Root.Components[n1];
items.Add(p1);
//
grid1.Cells[0, n2] := TComponent(p1^.control).Name;
n2 := n2 1;
end;
end;
ValidateComponents;
end;

procedure TfrmMyBrowser.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Designer := nil;
Hide();
end;

initialization
DesignForm := nil;
finalization
if (DesignForm <> nil) then
begin
DesignForm.Free;
DesignForm := nil;
end;

end.
附加檔案:49471f606fc26_MyVCL.rar
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-19 11:06:36 IP:59.125.xxx.xxx 訂閱
你在 constructor 中有判斷若不是 design-time,就建立 FUpdateTimer
但是在 destructor 中卻把判斷給 remark 掉了
應改寫成
destructor TMyBrowser.Destroy;
begin
if not (csDesigning in ComponentState) then
begin
// CloseHandle(hdEvent);
FUpdateTimer.Enabled := False;
FUpdateTimer.Free;
end;
//
inherited Destroy;
end;


===================引 用 bill534 文 章===================
constructor TMyBrowser.Create(AOwner: TComponent);
begin
inherited Create(AOwner);

if not (csDesigning in ComponentState) then
begin
FUpdateTimer := TTimer.Create(Self);
FUpdateTimer.Enabled := False;
FUpdateTimer.OnTimer := OnUpdateTimer;
FUpdateTimer.Interval := 45;
end;
end;

destructor TMyBrowser.Destroy;
begin
//if not (csDesigning in ComponentState) then
// CloseHandle(hdEvent);
FUpdateTimer.Enabled := False;
FUpdateTimer.Free;
//
inherited Destroy;
end;
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
系統時間:2024-04-24 19:04:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!