![delphi控件的寫法方式_第1頁](http://file4.renrendoc.com/view12/M00/2F/36/wKhkGWaV55aADwL9AAMchGE7iP8077.jpg)
![delphi控件的寫法方式_第2頁](http://file4.renrendoc.com/view12/M00/2F/36/wKhkGWaV55aADwL9AAMchGE7iP80772.jpg)
![delphi控件的寫法方式_第3頁](http://file4.renrendoc.com/view12/M00/2F/36/wKhkGWaV55aADwL9AAMchGE7iP80773.jpg)
![delphi控件的寫法方式_第4頁](http://file4.renrendoc.com/view12/M00/2F/36/wKhkGWaV55aADwL9AAMchGE7iP80774.jpg)
![delphi控件的寫法方式_第5頁](http://file4.renrendoc.com/view12/M00/2F/36/wKhkGWaV55aADwL9AAMchGE7iP80775.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
二、控件開發(fā)縱覽
通過開發(fā)上邊這個控件,我們已經對Delphi控件開發(fā)有了基本的認識。下面我們將系統(tǒng)的講述一下控件開發(fā)的知識。制作控件第一件事就是選擇適當?shù)腄elphi對象類型作為父對象,以派生新的對象。子對象可以繼承父對象的全部非private部件,但不能擺脫不需要的部件。因此,所選父對象應盡可能多地包含子對象所需的屬性、事件和方法,但不應包含子對象不需要的東西。Delphi必須從Tcomponent或Tcomponent的子類派生。TComponent是所有Delphi控件的基點,但若直接從TComponent派生新控件,很多東西就需要自己從頭做起。一般只有非可視控件才直接從TComponent派生。Delphi提供了若干專門用于制作控件(可視控件)的對象類型,都是從TControl和TWinControl派生而來。TControl的子類型用于非窗口式控件,TWinControl的子類型則用于窗口式控件。除非特殊需要,一般不直接從TControl和TWinControl派生新控件,而是從其子類型派生。這樣可以充分利用原有的屬性、事件和方法,減少很多工作量。在這些控件類型中,非通用的屬性、事件和方法都聲明為protected。這樣可以禁止控件用戶訪問,又能被子類型繼承和修改。在新控件中,可以簡單地把繼承來的屬性和事件重新聲明為published,使控件用戶能在設計期通過對象編輯窗口訪問,也可以進而修改屬性的默認值和讀寫方式,或是重載(override)事件處理子過程和其他控件方法,以修改其中的程序代碼。重聲明可以放寬訪問權限,但不能相反,例如,不可能把published屬性重聲明為private或protected。Delphi控件也是Delphi的類,所有的控件都有特定的結構。一般控件包括三大組成部分:屬性、方法和事件,下面先介紹初學控件開發(fā)的最難懂的屬性部分,其他部分我們將在以后章節(jié)為大家介紹。屬性主要部分就是屬性的讀寫方法(或讀寫字段)。前面的例子用的是讀寫字段,也就是對屬性的讀寫都通過對字段的讀寫來完成。下面為大家講解一下讀寫方法的使用方法:TmyComponent=class(TComponent)Private
Fcount:Integer;
ProcedureSetCount(Avalue:Integer);Pulbished
PropertyCount:IntegerreadFcountwriteSetCount;End;這個例子中當執(zhí)行MyComponent1.Count:=1;這樣的代碼時,將會導致SetCount方法執(zhí)行,并且參數(shù)Avalue被指定為1;當執(zhí)行I:=MyComponent1.Count;方法時,會將Fcount的值返回給I。屬性的聲明語法允許屬性聲明的Read和Write部分用訪問方法取代對象私有數(shù)據(jù)域。屬性的讀方法是不帶參數(shù)的函數(shù),返回同屬性相同類型的值。通常讀方法以Get開頭。屬性的寫方法總是帶一個參數(shù)的過程。寫方法常常以Set開頭。三、開關控件TlincoSwitch
用過Delphi1(好古老的東東呀?。┑娜讼嘈哦加浀眠@個開關控件,不知道當初Borland為什么把這么一個在開發(fā)普通應用程序中應用不到的工控控件放到Delphi中,而且在Delphi2及其以后的版本中再也沒有見過它的身影。讓我們懷著懷舊的心情把這位“開國元老”請出來吧!1、建立位圖資源文件:用ImageEditor建立一個Res文件,并在文件中分別建立下面兩個位圖,并分別命名為SWITCHON、SWITCHOFF。保存此Res到控件單元所在目錄下。2、寫控件代碼。unitLincoSwitch;interfaceuses
SysUtils,Classes,Controls,Graphics,Windows;type
TLincoSwitch=class(TCustomControl)
private
FIsOn:Boolean;
FPicOn:Graphics.TBitmap;
FPicOff:Graphics.TBitmap;
procedureFSetIsOn(AValue:Boolean);
protected
procedureClick;override;
procedurePaint;override;
public
constructorCreate(AOwner:TComponent);override;
destructorDestroy;override;
published
propertyIsOn:BooleanreadFIsOnwriteFSetIsOn;
propertyOnClick;
propertyOnKeyDown;
propertyOnKeyPress;
propertyOnKeyUp;
propertyOnCanResize;
propertyOnDblClick;
propertyOnMouseDown;
propertyOnMouseMove;
propertyOnMouseUp;
propertyOnMouseWheel;
propertyOnResize;
end;procedureRegister;implementation{$R*.res}procedureLoadBitmapFromRes(ABitmapId:string;ABitmap:Graphics.TBitmap);begin
ABitmap.LoadFromResourceName(hInstance,ABitmapId);//從資源文件中讀取位圖end;constructorTLincoSwitch.Create(AOwner:TComponent);begin
inheritedCreate(AOwner);
FPicOn:=Graphics.TBitmap.Create;
FPicOff:=Graphics.TBitmap.Create;
LoadBitmapFromRes('SWITCHON',FPicOn);
LoadBitmapFromRes('SWITCHOFF',FPicOff);
Invalidate;end;destructorTLincoSwitch.Destroy;begin
FPicOn.Free;
FPicOff.Free;
inherited;end;procedureTLincoSwitch.Click;begin
IsOn:=notIsOn;//改變按鈕的狀態(tài)
Invalidate;
inherited;end;procedureTLincoSwitch.Paint;begin//畫開關圖案
ifIsOnthen
StretchBlt(Canvas.Handle,0,0,self.Width,self.Height,FPicOn.Canvas.Handle,
0,0,FPicOn.Width,FPicOn.Height,SRCCOPY)
else
StretchBlt(Canvas.Handle,0,0,self.Width,self.Height,FPicOff.Canvas.Handle,
0,0,FPicOff.Width,FPicOff.Height,SRCCOPY);end;procedureTLincoSwitch.FSetIsOn(AValue:Boolean);begin
FIson:=AValue;
Invalidate;end;procedureRegister;begin
RegisterComponents('Linco',[TLincoSwitch]);end;end.3、代碼分析
(1)、因為我們要在控件表面上將按鈕的圖案畫出來,所以我們選擇TcustomControl做為父類控件,因為它有個Canvas屬性,我們可以利用Canvas在控件表面作圖。不選用Tcontrol的原因是因為它有很多我們不需要的屬性。(2)、ABitmap.LoadFromResourceName(hInstance,ABitmapId);是從資源文件中讀取Id為AbitmapId的位圖,關于資源文件的使用請參考其他相關資料。注意代碼中的“{$R*.res}”,它的作用是將資源文件編譯到程序文件中,如果沒有這個預編譯條件,程序將會出現(xiàn)錯誤。(3)、StretchBlt是將位圖畫到畫板上,使用方法請參考MSDN。(4)、我們?yōu)榭丶黾恿薎sOn屬性。這個布爾屬性用來表示開關的狀態(tài)(開/關)。從propertyIsOn:BooleanreadFIsOnwriteFSetIsOn;我們可以看出這個屬性是個可讀可寫的屬性。當讀這個屬性時會將FisOn的值返回給調用者,而寫屬性時則會調用FsetIsOn方法,并將賦給屬性的值做為參數(shù)傳遞給FsetIsOn。在FsetIsOn方法中,有如下實現(xiàn)代碼:
FIson:=AValue;
Invalidate;首先將Fison設置為參數(shù)傳遞來的值,然后調用
Invalidate;要求重畫控件,以告訴用戶控件的狀態(tài)已經改變,這一點是使用寫字段無法做到的。(5)
FPicOn:Graphics.TBitmap;FPicOff:Graphics.TBitmap;是聲明兩個.Tbitmap類型變量以保存控件的開關兩種狀態(tài)的圖案。(6)
procedureClick;override;procedurePaint;override;分別是覆蓋父類中相應的調度方法。當控件被鼠標單擊時,Click方法會被調用,我們將在Click中改變控件的開關狀態(tài);Paint方法則在用戶調用
Invalidate方法或控件發(fā)生重畫時調用,我們一般在這個方法繪制控件的圖案。(7)、TcustomControl中又很多事件處理句柄。比如OnClick、OnKeyDown等,但是它把他們聲明成了Protected保護級別,所以我們在ObjectInspector中看不到他們,如果我們要他們可以在ObjectInspector中被用戶編輯的話,只要在Published中重新聲明他們即可,不用寫他們的讀寫方法,只要使用:Property
屬性名;這樣的方法就可以。比如這個例子中的:PropertyOnclick;思考題:1、
做一個有特效的按鈕控件,當鼠標按下時按鈕是一個紅色邊框的空心圓,當鼠標松開時按鈕是一個淡綠色邊框的空心圓。2、
對于父類控件中為protected的屬性,如果想將它在子類控件中公布,應該怎么做?請思考Delphi為什么要將一些屬性設為protected級別?四、對特定字符串敏感的Edit控件我們這個控件將演示控件的自定義事件的書寫。這個控件有一個類型為string的SensitiveText屬性,當用戶在輸入框中輸入的文字為InvalidText時就會觸發(fā)OnSensitiveText事件。按照慣例,我先把源碼展示給大家:unitTextSenseEdit;interfaceuses
SysUtils,Classes,Controls,StdCtrls;type
TSensitiveTextEvent=procedure(AText:string)ofobject;//方法指針
TTextSenseEdit=class(TEdit)
private
FSensitiveText:string;
FOnSensitiveText:TSensitiveTextEvent;
procedureSetSensitiveText(AValue:string);
protected
procedureChange;override;
public
published
propertySensitiveText:stringreadFSensitiveTextwriteSetSensitiveText;
propertyOnSensitiveText:TSensitiveTextEventreadFOnSensitiveTextwriteFOnSensitiveText;
end;procedureRegister;implementationprocedureRegister;begin
RegisterComponents('Linco',[TTextSenseEdit]);end;procedureTTextSenseEdit.Change;begin
inherited;
ifText=SensitiveTextthen
ifAssigned(OnSensitiveText)then
OnSensitiveText(Text);end;procedureTTextSenseEdit.SetSensitiveText(AValue:string);begin
FSensitiveText:=AValue;end;end.代碼解釋:(1)、SensitiveText屬性的添加方法大家已經熟悉了,這里不多解釋。(2)、正如大家猜測的,Change方法正是編輯框文字發(fā)生變化時的調度方法,它將引起OnChange事件。我們可以在這個方法中監(jiān)控編輯框文字發(fā)生的變化,當文字等于SensitiveText就觸發(fā)OnSensitiveText事件(具體的實現(xiàn)方法在后邊解釋)。(3)、Delphi中的控件的事件機制是通過方法指針來實現(xiàn)的。聲明方法指針的格式為:方法指針名稱=procedure(參數(shù)列表)ofobject;聲明事件屬性的方法與聲明普通屬性的方法相同。在我們這個例子中,我們首先聲明一個FOnSensitiveText:TSensitiveTextEvent;私有變量,然后propertyOnSensitiveText:TSensitiveTextEventreadFOnSensitiveTextwriteFOnSensitiveText;聲明事件屬性。這樣注冊控件后,當用戶把控件放到窗體中后,就會在ObjectInspector中Evnets頁中出現(xiàn)OnSensitiveText事件,我們就可以像使用其他事件一樣使用這個事件了。
但是我們現(xiàn)在只是聲明了一個事件屬性,并沒有書寫任何代碼來激發(fā)這個事件。我們應該在合適的時候激發(fā)此事件,顯而易見我們應該在Change方法中激發(fā)此事件:procedureTTextSenseEdit.Change;begin
inherited;
ifText=SensitiveTextthen
ifAssigned(OnSensitiveText)then
OnSensitiveText(Text);end;當ifText=SensitiveText時就判斷控件使用者是否為OnSetSensitiveText寫代碼了(準確的說是是否為OnSetSensitiveText事件句柄賦值了),如果寫代碼了則調用OnSetSensitiveText(Text);來激發(fā)OnSetSensitiveText事件,并把控件的Text傳遞給方法的Avalue參數(shù)。正如“方法指針”這個名字一樣,被聲明為方法指針類型的變量可以當作方法使用,用來激發(fā)事件。VCL已經為我們預定義了一些常用的事件句柄,我們直接拿來使用:TnotifyEvent,TmouseEvent,TmouseMoveEvent,TkeyPressEvent等,具體可以參考VCL源碼。思考題:做一個支持累加運算的文本編輯框控件,用戶可以在編輯框中輸入正整數(shù)。當用戶按回車時,如果編輯框中輸入的不是正整數(shù)(為負數(shù)、小數(shù)或一般字符串)則觸發(fā)控件的OnError事件;如果輸入的是正整數(shù),則開始計算從1到用戶輸入的那個正整數(shù)中所有整數(shù)的和(用1+2+3+……這種累加的辦法實現(xiàn),不要用(1+n)*n/2這種直接計算的方法),并且在計算工程中如果發(fā)現(xiàn)計算的中間結果位數(shù)是5,則觸發(fā)OnTailFive事件。五、復合控件復合控件是Delphi控件中非常重要的一種控件,復合控件就是將兩個或兩個以上的控件重新組合成一個新的控件。例如TspinEdit、TlabeledEdit、TDBNavigator等就是復合控件,TDBNavigator其實就是在一個Panel放上若干個Button而已。制作一個復合控件時,我們一般從TwinControl派生控件。我們這次做的控件是擁有一個Edit編輯框和一個Button按鈕的復合控件,在用戶在編輯框中輸入文字的過程中,Button將隨時顯示編輯框中文字的長度。我們把控件的源碼先展示給大家。unitEditButton;interfaceuses
SysUtils,Classes,Controls,StdCtrls,Messages;type
TEditButton=class(TWinControl)
private
FEdit:TEdit;
FButton:TButton;
FText:string;
procedureFSetText(AValue:string);
procedureOnEditChange(Sender:TObject);
protected
procedureWMSize(varMsg:TMessage);messageWM_SIZE;
public
constructorCreate(AOwner:TComponent);override;
destructorDestroy;override;
published
propertyText:stringreadFTextwriteFSetText;
end;procedureRegister;implementationprocedureRegister;begin
RegisterComponents('Linco',[TEditButton]);end;constructorTEditButton.Create(AOwner:TComponent);begin
inherited;
FEdit:=TEdit.Create(nil);
FEdit.Parent:=self;
FEdit.Top:=0;
FEdit.Left:=0;
FEdit.Height:=Height;
FEdit.Width:=Widthdiv2;
FEdit.OnChange:=OnEditChange;
FButton:=TButton.Create(nil);
FButton.Parent:=self;
FButton.Top:=0;
FButton.Left:=Widthdiv2;
FButton.Height:=Height;
FButton.Width:=Widthdiv2;end;destructorTEditButton.Destroy;begin
FEdit.Free;
FButton.Free;
inherited;end;procedureTEditButton.FSetText(AValue:string);begin
FEdit.Text:=AValue;end;procedureTEditButton.OnEditChange(Sender:TObject);begin
FButton.Caption:=IntToStr(Length(FEdit.Text));end;procedureTEditButton.WMSize(varMsg:TMessage);begin
FEdit.Height:=Height;
FEdit.Width:=Widthdiv2;
FButton.Left:=Widthdiv2;
FButton.Height:=Height;
FButton.Width:=Widthdiv2;end;end.代碼解釋:(1)、我們首先定義了兩個變量
FEdit:TEdit;
FButton:TButton;
分別代表復合控件中的文字編輯框和按鈕。(2)所謂復合控件說簡單一點就是在一個共同的基板上將組成復合控件的各個控件(可以叫做子控件)畫出來。所以我們在構造函數(shù)中建立各個子控件,然后分別設定它們的位置等屬性。以文字編輯框為例:FEdit:=TEdit.Create(nil);的作用是建立編輯框控件。如果Create的參數(shù)指定為nil,則子控件在設計狀態(tài)是可以響應用戶的操作的;而如果設定為self(即設定子控件的父控件為基板),則子控件在設計時時不可響應用戶操作的,如果設定為self則析構函數(shù)中就不用Fedit.Free來銷毀對象了,對象會自動銷毀。
FEdit.Parent:=self;的作用是設定子控件的父控件,如果沒有這一句則控件是無法顯示的。
FEdit.Top:=0;
FEdit.Left:=0;
FEdit.Height:=Height;
FEdit.Width:=Widthdiv2;這四句是設定控件在基板上的相對位置的,這里的Top,Left不是相對于窗體的,而是相對于基板的。
FEdit.OnChange:=OnEditChange;則是設定編輯框控件的OnChange(文字改變事件)的處理句柄為OnEditChange;(1)
用戶有可能在設計時或運行時通過代碼改變控件的大小,這時控件中子控件的順序就會變得亂七八糟,所以需要相應控件的WM_SIZE事件(控件大小發(fā)生變化的事件)重新設定子控件的位置,大小等。函數(shù)WMSize的作用就是這樣的。安裝控件后發(fā)現(xiàn)控件已經可以正確運行了,但是還有一個問題,就是這個控件沒有了Onclick,Onchange等必須的屬性。我們只要為控件增加事件處理句柄屬性,然后把事件處理句柄屬性的讀寫方法都指向子控件的事件處理句柄屬性即可。例如我們?yōu)榭丶黾覱nClick事件,這個事件發(fā)生在用戶單擊按鈕時,我么只要在Pulished部分增加如下代碼:property
OnClick:
TnotifyEventreadGetOnClickwriteSetOnClick在Private中增加如下方法聲明:functionGetOnclick:TnotifyEvent;procedureSetOnclick(AValue:TnotifyEvent);這兩個方法的實現(xiàn)分別為:function
TeditButton.GetOnclick:TnotifyEvent;begin
result:=Fbutton.Onclick;end;procedureTeditButton.SetOnclick(AValue:TnotifyEvent);begin
Fbutton.OnClick:=Avalue;end;思考題:1、做一個模仿播放器中的操作按鈕的復合控件,控件由三個按鈕組成,分別是“播放”、“暫?!?、“停止”,請按照正常的邏輯關系,處理這三個按鈕的可用/不可用關系。(提示:可以參考TDBNavigator的源代碼)六、控件手拉手――控件關聯(lián)的實現(xiàn)控件的關聯(lián)在Delphi中也是很常見的,我們可以設定一個控件的某個屬性指向另一個控件。比如我們在窗體上放上Tedit,TpopupMenu兩個控件,然后設定Tedit的PopupMenu屬性為TpopupMenu控件,運行后在Tedit點擊右鍵就會彈出剛才設定的那個TpopupMenu菜單,也就是說Tedit,TpopupMenu聯(lián)手完成了任務。再比如TDBEdit控件的DataSource屬性就可以指向一個TdataSource控件,這樣就可以在TDBEdit控件中顯示TdataSource輸出的某個字段的值了。
下面我們將寫一個簡單的實現(xiàn)控件關聯(lián)的控件。這個控件派生于Tedit,它可以與一個Tlabel控件關聯(lián),在控件的編輯框中輸入文字時,與它關聯(lián)的Tlabel控件的文字將隨著它而變化。代碼如下:unitMyEdit;interfaceuses
SysUtils,Classes,Controls,StdCtrls;type
TMyEdit=class(TEdit)
private
FLinkLabel:TLabel;
procedureFSetLinkLabel(AValue:TLabel);
protected
procedureNotification(AComponent:TComponent;Operation:TOperation);
override;
procedureChange;override;
public
published
propertyLinkLabel:TLabelreadFLinkLabelwriteFSetLinkLabel;
end;procedureRegister;implementationprocedureRegister;begin
RegisterComponents('Linco',[TMyEdit]);end;procedureTMyEdit.Change;begin
inherited;
ifLinkLabel<>nilthen
LinkLabel.Caption:=Text;end;procedureTMyEdit.FSetLinkLabel(AValue:TLabel);begin
FLinkLabel:=AValue;
ifAValue<>nilthen
FLinkLabel.FreeNotification(self);end;procedureTMyEdit.Notification(AComponent:TComponent;
Operation:TOperation);begin
inherited;
if(Operation=opRemove)and(AComponent=LinkLabel)then
LinkLabel:=nil;end;end.代碼解釋:(1)、我們只要將控件的任意一個屬性的類型設定為另外一個控件的類名稱,那么我們就可以在控件的ObjectInspector中將這個屬性指向那個控件(或那個控件的派生控件)的一個實例。比如本例中我們增加了LinkLabel屬性,它的類型為Tlabel,所以我們就可以把LinkLabel屬性指向一個標簽控件。(2)、請注意FsetLinkLabel中的這段代碼:ifAValue<>nilthenFLinkLabel.FreeNotification(self);如果我們將控件關聯(lián)屬性指向了一個控件,可是后來又將被指向的控件刪除了,那么我們的控件關聯(lián)屬性是不會自動刪除的,這樣就會造成控件關聯(lián)屬性指向的控件不存在的現(xiàn)象。我們必須自動感知被關聯(lián)控件的刪除并重新設定控件關聯(lián)屬性為不指向任何控件,這樣就避免了錯誤的發(fā)生。FLinkLabel.FreeNotification(self);的作用就是這樣的。它調用控件的FreeNotification方法(在Tcomponent中定義)向被指向的控件注冊一個“消息”,當被指向控件被刪除時,會向所有向他注冊的控件發(fā)送一個它被刪除的消息,此時向他注冊的控件就會觸發(fā)Notification方法,這樣我們就可以自動感知被指向控件的狀態(tài)了。這是設計模式中Observer(觀察者)模式的典型應用。既然向他注冊的控件就會觸發(fā)Notification方法,我們就覆蓋父類的Notification方法,寫出如下的代碼:
if(Operation=opRemove)and(AComponent=LinkLabel)then
LinkLabel:=nil;這句話的意思是:如果控件被刪除并且被刪除的控件(因為我們的控件可能向多個控件注冊了消息)是LinkLabel,那么我們就設定LinkLabel屬性不指向任何控件。(3)覆蓋父類的Change調度方法。在此方法里為連接的LinkLabel的Caption賦值就達到我們的目的了。思考題:1、做一個Label控件,給它增加一個DataSource屬性,該屬性可以指向一個TdataSource類型的控件,它有一個GetRecordCount方法。當調用此方法時,就在Label控件中顯示這個DataSource對應的數(shù)據(jù)集中的記錄的條數(shù)。對話框控件的制作Delphi中有很多對話框組件,例如TopenDialog、TfontDialog等。這些控件的特點就是雖然是不可視控件,但是在運行時都有一個可視化的效果,比如TopenDialog的可視化效果就是一個打開對話框。我們這次將開發(fā)一個日期對話框控件,當我們調用控件的Execute方法(不一定非要使用Execute方法,不過大部分對話框控件都是使用這個方法,我們也就按照慣例來了)時,就會彈出一個可以選擇日期的對話框,我們選擇一個日期后,點
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘇科版數(shù)學八年級上冊5.1《物體位置的確定》聽評課記錄
- 八年級道德與法治下冊第三單元人民當家作主第五課我國基本制度第3框基本政治制度(第1課時中國共產黨領導的多黨合作和政治協(xié)商制度)聽課評課記錄(新人教版)
- 人教版九年級數(shù)學上冊第二十五章概率初步《25.3用頻率估計概率》聽評課記錄
- 八年級思想讀本《6.2軍強才能國安》聽課評課記錄
- 小學二年級上乘法口算天天練
- 五年級下冊數(shù)學聽評課記錄《折紙》北師大版
- 孵化樓租賃合同范本
- 二零二五年度酒店設施租賃及使用權購買合同
- 外架工班組勞務分包協(xié)議書范本
- 工程項目全過程管理協(xié)議書范本
- 一級建造師繼續(xù)教育最全題庫及答案(新)
- 2022年高考湖南卷生物試題(含答案解析)
- GB/T 20909-2007鋼門窗
- GB/T 17854-1999埋弧焊用不銹鋼焊絲和焊劑
- GB/T 15593-2020輸血(液)器具用聚氯乙烯塑料
- 直線加速器專項施工方案
- 聯(lián)苯二氯芐生產工藝及產排污分析
- 儲能設備項目采購供應質量管理方案
- 2022年全國卷高考語文答題卡格式
- 復旦大學簡介 (課堂PPT)
- CKD馬達使用說明
評論
0/150
提交評論