為什麼我要從一個Form上刪除TMyBrowser都會出錯! |
答題得分者是:sryang
|
bill534
一般會員 發表:38 回覆:51 積分:17 註冊:2007-02-22 發送簡訊給我 |
為什麼我要刪除貼在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. |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
你在 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/ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |