版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
记事本设计说明3023001083奚苏立混合(3)班1.需求分析1.1记事本要求满足一般用户对文本文件编辑的最基本要求。采用菜单和对话框操作,界面简洁友好,用户可直接在文本框中进行文本输入和编辑,支持所有英文纯文本文件。支持多文件打开处理,块操作,文件之间的操作等。一个类似Edit的Dos程序。1.2记事本功能文件:可在任意时刻打开或新建文件,可将文件另存。也可对打开后的任意文件进行保存关闭。在退出时,对于没有保存的文件,程序将给予提示。编辑:支持所有块操作。利用菜单或快捷键设置块头,块尾(系统可自动调整相对位置)或取消块定义。有粘贴,拷贝,剪切等功能。可以在文件之间进行操作。查找:提供查找和替换功能。对于查找,有匹配整个单词和匹配字母大小写两个选项。对于替换,除上两个选项,还有整体替换选项。(对于查找和替换,对话框已写出,但由于最后时间过紧,因此具体实现代码没有写出)。窗口:可在任意已打开文件之间进行切换。帮助:提供对所有操作的详细说明。几乎所有操作都有对应的快捷键,使用户使用更加方便。总体设计.整个程序共分两大块:Document和View。Document主要负责对文件内容的内部储存和管理。对文本的输入或编辑都由Document负责。它可以将磁盘上的文件按自己内部格式读入内存,或将编辑内容按纯文本格式保存至磁盘。Document会根据用户对文本的操作对内存中的文件内容进行修改,如插入,编辑。同时还要储存编辑时的状态信息:如光标的位置,块的定义位置,文件是否保存过等,因此对于翻页,光标移动等操作,Document都将有所响应。Document还会给View提供足够的信息和操作,如从哪里开始显示,每段的字数,总段数,光标的位置等。(当然,有的信息可能会用不上)。总之,关于文件内容的一切信息都归于Document。但是,这部分用户是不可见的,用户并不直接和Document打交道。View主要负责界面的显示和刷新。界面主要分菜单栏,状态栏和编辑栏。菜单栏的显示和对菜单内容的响应是View的基本工作。有些菜单的操作(如各种块操作或文件的读写)将涉及对Document的修改,因此它将调用Document中的一些函数完成功能。状态栏本来在编辑时可以显示当前光标位置,但由于时间过紧,省略了这部分。但在操作菜单时,状态栏会显示比较详细的操作说明。这部分和Document完全没有关系。最后的编辑栏是占屏幕最大的一块。View将根据Document提供的必要信息显示编辑栏并不断刷新。在这部分中,由于需要比较多的Document信息,因此将这部分显示函数封装在了Document中(这是两大块比较关键的衔接部分)。除此之外,View还负责对消息的传递和多文件的管理。一个Document对应一个文件。View需要管理多个指向Document的指针。对于文件的打开和关闭,除了需要对相应的Document操作外,还需修改View中的Document指针列表。总之,View将处理一切用户的操作请求并将其反映在屏幕上(这当然需要Document的支持)。3系统模块说明Document:每个文件以段落为基本类进行抽象。如果用大数组表示整篇文章,当在前面插入或删除文字时将会有比较低的效率。当然,以段落为对象将使一些操作变得比较复杂。classLinefriendclassPosition;friendclassDocument;friendclassBlock;friendclassNode;longm_Capacity; 〃每段可容纳字数longm_ChNum;//当前段的字数voidm_Increase(longn); //当一段容量不够时扩充容量public:friendclassCursor;char*m_Point; //指向段落文字的指针Line(longi=256,longj=1){m_Capacity=i;m_ChNum=j;m_Point=newchar[i];m_Point[0]='\0';} 〃对空段的初始化~Line(){deletem_Point; //段落析构}};以上为段落类声明。特别说明,每段初始时就有\0’,每段的字数包括’\0',‘\n’储存在下一段的开头,这样做是为了方便某些操作(如插入和删除回车符)。整篇文章由段落通过双向链表串连而成,因此可以在任意位置访问整篇文章。以下为节点类声明。classNode{friendclassPosition;friendclassDocument;friendclassBlock;Line*PLine; //指向段落的指针Node*next; 〃指向下一段Node*pre; //指向上一段public:Node(longi=256,longj=1){next=pre=NULL;PLine=newLine(i,j);} 〃对节点的初始化实际也是对段落的初始化〜Node(){deletePLine;}longPInLine(); 〃用于计算最后一行的字数longNumLine(); //用于计算一段在屏幕上显示的行数};由于在Document类中,还要记录光标,块头,块尾,显示等位置信息,因此声明位置类。对于此类主要是位置操作,如上、下、左、右、翻页、Home、End等,将以上函数封装。为了便于位置间的比较和通过位置类访问文章内容,重载一些操作符。有一点特别说明,基于对光标位置的考虑,当光标指向’\0’时,屏幕上显示是在段落末尾第一个空字符处,而指向’\n’时无意义,因此所有操作都保证位置对象不可能指向’\n’。操作符*被重载为返回当前位置的字符,返回’\0’没有意义,因此位置对象指向’\0’时将返回’\n’。classPosition{friendclassDocument;friendclassBlock;protected:Node*node; //指向节点指针longnCh; //在段落中的具体位置voidInit(Node*a){node=a;nCh=1;} //初始化指向某段开头(使用时实际指向整篇文章开头)voidPageDown();〃向下翻页,改变当前位置信息。voidPageUp();〃向下翻页voidUp();//向上移动一行voidDown();//向下移动一行voidLeft();//向左移动一个voidRight();//向有移动一个voidHome();//移动至行开头voidEnd();〃移动至行末尾voidPageD(constPosition&p);//如果当前以下不满一页则不翻页public:Positionoperator++();//Right()Positionoperator--(); //Leli()Positionoperator++(int);Positionoperator--(int);Positionoperator-(intn);〃左移n次booloperator<(constPosition&p); //判断两个位置对象的相对位置booloperator>(constPosition&p);//booloperator<=(constPosition&p);//booloperator>=(constPosition&p);//booloperator==(constPosition&p); //charoperator*(); //取得当前位置字符longPInLine(); //当前在行中的位置longNumLine(); //位置所在行数};以下为块类声明。为了使文件之间可以进行块操作,因此剪贴板指针声明为静态变量。为了最后能够正确析构,加入静态变量BlockNum记录对象生成个数。当块头或块尾没有定义时,Position类中的node将被置为空指针。classBlock{staticintBlockNum; //记录所生成的对象个数public:PositionBBlock; //块头位置PositionEBlock; //块尾位置staticchar*ClipBoard;剪贴板指针Block(){BlockNum++;BBlock.Init(NULL);EBlock.Init(NULL);} 〃块头块尾都被初始化为NULL~Block(){BlockNum--;iK!BlockNum)deleteClipBoard;}//删除最后一个对象时删除剪贴板longSize();〃粗略估计储存块头至块尾内容所需容量,大于等于实际所需容量};Document*Open(constchar*name);Document*New(constchar*name);以上两行为新建和打开文件函数声明。由于调用函数时还没有生成对象,因此都为外部函数。由于当使用C++机制打开不存在的文件时,系统会新建文件而无任何异常,因此采用C语言机制读写文件。以下是对Document类的声明classDocument{longm_NumLine;//总段数charm_FileName[50]; //文件名Node*head;//指向第一段节点的指针Node*end; //指向最后一段节点的指针public:Positionm_Cursor; //记录当前光标位置Blockm_Block; 〃记录块信息Positiondisplay; //屏幕第一行第一字位置charIsChanged; //记录文件是否被改动过boolnewfile; //记录文件是否为新建Document(constchar*name){head=end=newNode;m_NumLine=1;strcpy(m_FileName,name);IsChanged=0;m_Cursor.Init(head);display.Init(head);} 〃构造Document实际是构造一个段落,同时将显示位置和光标位置置于文章开头〜Document。{Node*temp=head->next;while(head!=NULL){deletehead;head=temp;temp=temp->next;}m_NumLine=0;head=end=NULL;}//实际是对双向链表的析构
char*FileName();//返回去处路径的文件名voidAddNode(Node*n,Node*Source1,Node*Source2);//在Sourcel和Source2中插入NodevoidDelNode(Node*n); 〃删除n所指向的节点voidm_Insert(charc);//在光标位置处插入一个字符voidm_Del();〃删除光标位置处的字符voidm_BackSpace();//删除光标前一个位置的字符voidDisplayUp();//使Position类的对象display根据实际情况决定是否向上移动一行voidDisplayDown();//使Position类的对象display根据实际情况决定是否向下移动一行voidDisplayPageUp();//使display向上翻页(直接调用display.PageUp())voidDisplayPageDown();〃使voidm_Insert(charc);//在光标位置处插入一个字符voidm_Del();〃删除光标位置处的字符voidm_BackSpace();//删除光标前一个位置的字符voidDisplayUp();//使Position类的对象display根据实际情况决定是否向上移动一行voidDisplayDown();//使Position类的对象display根据实际情况决定是否向下移动一行voidDisplayPageUp();//使display向上翻页(直接调用display.PageUp())voidDisplayPageDown();〃使display向下翻页(直接调用display.PageDown()voidSetBlockHead();〃设置块头voidSetBlockEnd();//设置块尾voidCopyBlock();//块复制voidPasteBlock();〃将剪贴板中内容粘贴至光标位置voidCutBlock();//剪切块voidDelBlock();//删除块voidCancelBlock();//取消块voidLoad(FILE*lp);〃当确定文件存在后,由Open调用读入文件voidSave(void);//保存文件voidSaveAs(constchar*name);//另存文件boolIsModified(){returnIsChanged;}//文件是否被修改过boolIsPathSpecified()return!newfile;} 〃是否为新建的文件voidMessageProcess(KeyInfokey); //对除菜单中的操作外,其它一切编辑框中消息的处理函数voidShow(); //将Document类中的内容刷新到屏幕上};对于Document的操作,最基本的是插入和删除操作。其中比较特殊的是对回车的插入和删除,实际上是对Node的插入和删除。其中需要对段落内容进行合并或分裂操作。同时,当块首或块尾已定义时,这将影响它们的位置,因此这部分需要比较多的代码处理。其他如块粘贴,块删除,BackSpace操作都以上两个操作为基础。而块拷贝函数则通过重载Position类的操作符*完成。对于DisplayDown等函数,需要决定何时屏幕整体移动。上移只需判断光标和display的相对位置,通过重载操作符完成。对于下移,需要判断光标是否已越过屏幕范围,这通过调用Position中的PageD()函数完成判断。Show()t通过操作符重载逐字访问内存,并将显示内容存入数组,当遇到块或块结束需要变色时,将数组内容输出。虽然有光标位置的直接信息,但很难将其直接映射至屏幕。在Show()函数中采用逐字读取字符的同时寻找光标位置,最后输出。当有异常发生时,如无法打开文件或待存文件已经存在等,将把异常抛出,由View解决。View:1.对话框的处理在打开文件,保存文件或查找替换时,不可避免的要出现对话框。整个对话框显示尽管比较复杂,但由很多基本的相同构件,如按钮,标签,选择栏等,先对这些构件进行抽象。classElemBase{public:intTop; 〃上边框坐标intLeft; //左边框坐标boolTabCapture;//Tab键状态public:ElemBase(inttop,intleft);virtualvoidGetFocus(void){}virtualvoidLostFocus(void){}virtualvoidHandleInput(Keylnlokey){}virtualvoidDisplay(void){}};这是所有构件的一个基本公共抽象。除构造函数,其它皆为纯虚函数,其中有些函数在某些构件中可能用不到。以这个基类为基础,从而抽象出按钮,标签栏,选择栏,文本栏:classLabelBox:publicElemBase//;标签栏{public:intBackgroundColor;//底色intTextColor; //文字颜色char*Label; //文本内容指针public:LabelBox(inttop,intleft,constchar*,inttxtcolor=BLACK,intbkcolor=LIGHTGRAY);virtualvoidDisplay(void); //显示标签栏〜LabelBox(void);};classTextBox:publicElemBase //文本栏{public:intBackgroundColor;//底色intTextColor;〃文字颜色intWidth;//输入文本处宽度char*Text;//文本内容指针char*Text;intCursor; //光标位置intDispBegin; //开始显示位置public:TextBox(inttop,intlef, intwidth,inttxtcolor=BLACK,intbkcolor=LIGHTGRAY);~TextBox(void);virtualvoidDisplay(void);virtualvoidHandleInput(KeyInfokey);//对用户的各种案件的响应(消息处理函数)virtualvoidGetFocus(void); //显示文本末尾部分virtualvoidLostFocus(void); 〃显示文本开头部分};由于用户将在文本栏中输入文字,此类抽象有些类似Document类,也有光标位置和开始显示位置,有些响应也和Document一样(如输入,删除等),但显然比Document类要简单很多。classButton:publicElemBase//按钮类{public:intBackgroundColor; //背景色int TextColor; 〃文字颜色int Width; 〃宽度int Height; 〃高度char*Text; 〃按钮文字intButtonType;public:Button(inttop,intleft,constchar*text,intbuttontype,intwidth=12,inttxtcolor=BLACK,intbkcolor=GREEN);~Button(void);virtualvoidDisplay(void);virtualvoidHandleInput(KeyInfokey); //对回车等输入消息处理virtualvoidGetFocus(void); //通过改变颜色显示当前活动按钮virtualvoidLostFocus(void); 〃通过改变颜色显示当前非活动按钮};classCheckBox:publicElemBase //选择栏public:intTextColor;intBackgroundColor;char*Text;boolChecked; 〃是否被选中public:CheckBox(inttop,intleft,constchar*text,inttxtcolor=BLACK,intbkcolor=LIGHTGRAY);~CheckBox(void);virtualvoidDisplay(void);virtualvoidHandleInput(KeyInfokey); 〃消息处理virtualvoidGetFocus(void); 〃调用Display()^lJ新virtualvoidLostFocus(void); 〃调用Display()^lJ新};所有得基本构件写完后,开始写具体对话框。首先是对所有对话框得基本抽象类WindowBaseclassWindowBase{public:intTop;intLeft;intBottom;intRight;intWidth;intHeight;intBKcolor;charTitle[STRMAX]; 〃窗口标题ElemBase*ElemList[ELEMMAX]; //窗口中各类构件列表intElemCurrent; //当前活动构件intElemSum; 〃构件总数public:WindowBase(constchar*title,intleft,inttop,intwidth,intheight,intbkcolor=LIGHTGRAY);virtualvoid*Display(void*);};以下是具体对话框的实现,它们都是WindowBase的继承classWindowOpen:publicWindowBase //文件打开对话框{public:WindowOpen(constchar*title,intleft,inttop,intwidth,intheight,intbkcolor=LIGHTGRAY);virtualvoid*Display(void*);};〃文件保存对话框classWindowSaveAs:publicWindowBase{〃文件保存对话框public:WindowSaveAs(constchar*title,intleft,inttop,intwidth,intheight,intbkcolor=LIGHTGRAY);virtualvoid*Display(void*);};classWindowFind:publicWindowBase 〃查找对话框{public:WindowFind(constchar*title,intleft,inttop,intwidth,intheight,intbkcolor=LIGHTGRAY);virtualvoid*Display(void*);};classWindowReplace:publicWindowBase 〃替换对话框{public:WindowReplace(constchar*title,int就,inttop,intwidth,intheight,intbkcolor=LIGHTGRAY);virtualvoid*Display(void*);};classMessageBox:publicWindowBase //信息框{public:MessageBox(void);intMsgBox(constchar*msg,intbuttons);};再说一下窗口类的消息处理和显示机制。当一个具体窗口对象建立好后,立即通过try{}调用WindowBase的Display函数□Display函数集显示和消息处理为一体:首先绘制好窗口的标题和背景,再调用各类构件的Display函数一一加以显示,同时对窗体中默认的活动构件调用GetFocus()特别显示。然后进入消息处理阶段。当用户键入Tab键时,对当前构件和下一活动构件进行刷新,当用户键入Enter或ESC键,则当异常抛出,具体处理由各类具体窗口通过Catch{}处理。当为其它输入时,则调用活动构件的消息处理函数进行处理。以上是对对话框类的完整描述。2.菜单类这是对菜单类的声明classToolBar{private:intm_L1; 〃处于活动状态的根菜单序号intm_L2; 〃处于下拉菜单中的活动项目序号#defineSubMenuWidth25#dehneBaseMenu5〃各下拉菜单高度#dehneSubFile6//#dehneSubEdit6//#dehneSubSearch2int SubWindows;//#dehneSubHelp2charm_FirstLayer田aseMenu][STRMAX]; //储存根菜单名charm_File[SubFile][STRMAX]; 〃储存下拉菜单名charm_Edit[SubEdit][STRMAX];charm_Search[SubSearch][STRMAX];charm_Windows[FILEMAX][STRMAX];charm_Help[SubHelp][STRMAX];intSubMenuX;intSubMenuY;intSubMenuHeight;//下拉菜单高度char*SubMenu; 〃当前下拉菜单文字首地址StatusBar*m_pSBar; //状态栏文字内容指针public:ToolBar(void){}voidInitialize(StatusBar*pSBar); 〃对菜单类的voidShow(void); 〃根据参数显示菜单KeyInfoHandleInput(KeyInfokey); 〃对菜单消息的处理voidRegisterWindow(constchar*filename); 〃在Windows菜单中注册文件voidDeregisterWindow(intid); //在Windows菜单中注销文件};从上面可以看出,菜单栏类中包括状态栏,这是因为选择菜单时将引起状态栏的变化。但是状态栏的具体显示是由View类中调用状态栏的显示函数。菜单类的消息处理略显复杂。实际上,对于用户的任何输入,都将首先传入菜单类进行处理。当确定菜单处于活动状态时,如果输入是上下左右键,则刷新菜单显示;如果是回车键,则重新对消息赋值,并将消息传出,交给View类处理;如果输入是ESC键,则将菜单初始化。当输入中有Ctrl控制键时(即快捷键),则效果和菜单活动按下回车键一致。其余情况,说明用户处于编辑状态,则将消息原封不动传出,交给Document类处理。View类
万事具备,只欠东风。只差一个将以上所有类融合在一起的View类了。以下将是对View类的完整描述,它是整个程序的最顶层部分,包括Document类,菜单类,状态栏类,以及选择菜单操作所需要的对话框。更重要的是将这些部分很好的协调在一起。StatusBar*m_SBar;//状态栏ToolBar*m_TBar; //菜单栏private:Document*m_DocList[FILEMAX];〃打开文件指针列表intm_DocSum;〃文件总数intm_DocCurrent;〃当前活动文件序号〃当前活动文件序号classViewprivate:StatusBar*m_SBar;//状态栏ToolBar*m_TBar; //菜单栏private:Document*m_DocList[FILEMAX];〃打开文件指针列表intm_DocSum;〃文件总数intm_DocCurrent;〃当前活动文件序号〃当前活动文件序号intvoidShow(void);〃显示,包括显示菜单,状态栏和编辑栏intvoidShow(void);〃显示,包括显示菜单,状态栏和编辑栏〃显示,包括显示菜单,状态栏和编辑栏m_DocUnnamed;public:View(void){};voidInitialize(void); 〃一般初始化函数voidInitialize(constchar*filename); 〃当采用命令行格式执行程序且后面跟有待编辑文件名时,采用此初始化函数KeyInfoHandleInput(KeyInfokey); 〃消息处理private:〃以下是对于选择菜单中操作后具体的操作函数,主要通过调用Document类和菜单栏中的〃以下是对于选择菜单中操作后具体的操作函数,主要通过调用private:〃以下是对于选择菜单中操作后具体的操作函数,主要通过调用Document类和菜单栏中的〃以下是对于选择菜单中操作后具体的操作函数,主要通过调用Document类和菜单栏中的〃函数完成〃函数完成Document*DeleteDoc(intnumber); 〃关闭文件voidNew(void);voidOpen(void);voidSave(void);voidSaveAs(void);voidClose(void);voidExit(void);voidBlockBegin(void);voidBlockEnd(void);voidBlockCancel(void);voidCut(void);voidCopy(void);voidPaste(void);voidFind(void);voidReplace(void);
voidWindows(void);voidHelp(void);voidAbout(void);};有了Document,ToolBar和SatusBar的有力支持,View类相对容易很多。View自己只需管理好Document类指针,总文件数等参数,并对一些异常进行处理。最后看一下Main函数intmain(intargc,char*argv[]){View*MyView=newView;if(argc==2){MyView->Initialize(argv[1]);}else{MyView->Initialize();}MyView->Show();Keylnfokey;key=GetInput();while(true){MyView->HandleInput(key); //消息处理MyView->Show(); 〃刷新屏幕key=GetInput(); 〃读取消息}getch();getch();}Main极其简单,我们可以看出,它只有三个不断循环的步骤:刷新屏幕,读取消息,消息处理。从而应用户的请求进行运行。系统设计难点及其解决.决定何时移动屏幕文本显示问题。上移比较好办,只要比较光标和display相对位置(通过重载’<’或’>’)。对于下移需要比较display翻页后和光标的相对位置。而对于原先设计的翻页函数,当不满一页时,翻至最后或第一行。为此新增函数PageD()。当不满一页时不翻页,然后比较相对位置,解决问题。将内存中的光标位置和屏幕上的光标位置相对应。内存中,有’\0’和’\n’存在。当光标移至’\n’时,无法在屏幕上显示,因此所有移动函数都保证光标位置不是’\n’。而当重载操作符’*’时,需要知道’\n’信息而不需要’\0’,因此当位于’\0’时,*号返回’\n’。但这会导致最后一行和实际不符(可能无回车),但问题不大。(3) 为使其他同学使用Document类读取文本信息而不用知道其内部结构,重载了如'一’,'++','——’,'*’,‘<‘,’>''>=‘,‘<=‘等大量操作符。(4) 为了操作更加简便,把’\n’放在下一段的开头,使’\0’和前面字符连成一体。否则如果'\n'把'\0'和前面隔开会给显示和操作带来很大麻烦。(5) 映射光标问题。通过在逐字读取文字的时候寻找光标而避免直接从段落位置直接映射到屏幕的巨大麻烦。(6) 消息处理问题。怎样使消息在读入时分配至各块,如编辑块,菜单块,对话框等。同时怎样使系统的消息在块与块之间交流,协调各部分的运作。从上面可以看出,对于所有的消息,都由View中的Handleinput处理。它先将消息传给ToolBar,如果ToolBar可以完全处理,则返回空消息。如果菜单没有打开,则消息原样返回,交给Document中的MessageProcess处理。而对于选中菜单操作的消息,ToolBar处理时会给传出消息重新赋值,此值将使MessageProcess不予处理,消息继续往下,由View自行处理。例如,当用户需要打开文件时,将弹出对话框。则经过ToolBar处理的消息值将等于FILE_OPEN,MessageProcess不会处理。同时View调用相应函数Open()。而Open会调用已经实例化的WindowOpen对象中的Display函数。上面曾提到过,Display函数集显示和消息处理为一体。就这样,各种消息准确无误的得到响应。(7) 读入文件时,如使用C++的文件机制则无法辨别文件是否已经存在,因此文件操作全部使用C机制。(8) 对于窗口显示内容的抽象问题。为了使抽象更加便于操作并符合逻辑,整个屏幕抽象为一个View类。其中包括菜单类,Document类,状态栏类。对话框类不不包括在内,为了达到随叫随到的目的,通过调用成员函数获得。而其中不同的对话框类由对话框基类继承。基类又被划分为更小的不同窗口构件。通过对这些构件使用虚函数,使得他们对对话框的接口统一,大大增强了使用的方便性,有利于以后程序的扩展。5总结、这是第一次通过几人的合作编写程序,因此它首先提高了我们的团队合作能力。在写程序时,学以致用,将C++的一些新特性(如继承,派生,虚函数等)用在了程序中,确实体会到了一些方便之处,使我们对这门语言的理解更为透彻。通过这次合作,我们也积累了一些开发软件的经验。对于即将开发的软件,首先要有明确的基本功能要求,大概的界面风格,以及一些基本的操作模式(是否支持鼠标,是否支持命令行格式等),使团队成员对即将开发的软件有一个感性的了解。这部分主要是从用户的角度分析。然后是对开发任务的分配。将大程序划分为几个联系相对比较少的模块,搭建程序的最外层框架。模块之间的接口非常重要,需要在开始就要商量好。这次设计由于在开始缺乏了比较多的交流,使得设计至中期出了问题,不过后来得到了妥善解决。接着是对模块的抽象设计。尽量从最基本的构件开始,通过继承派生,最后得出比较复杂的类。对于有着相同“血缘”的构件尽量使用虚函数,这将使得以后程序设计更加简单顺手,增加了程序的扩展性和升级性。为了便于别人对模块的访问和使用,需要有良好的封装,可能需要提供一些操作符的重载。同时要有人能够把握全局,使得各模块能够协调运转(如消息的处理等问题),当然他不必了解细节。总之,需要加强交流。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年陕西陕能投资管理有限公司招聘笔试参考题库含答案解析
- 2025年浙江海宁鹃湖科技城开发投资有限责任公司招聘笔试参考题库附带答案详解
- 2025年度店面租赁合同附赠营销活动支持服务2篇
- 江苏省常州市2024-2025学年第一学期高三期末质量调研语文试题及答案解析
- 2025年个人所得税赡养老人子女赡养义务协议书4篇
- 2024年科普知识竞赛试题库及答案(共50题)
- 2025版个人入股协议书模板及股权变更流程指南3篇
- 观澜湖圣安德鲁斯别墅营销策划报告
- 二零二五年度厨师职业资格认证聘用合同3篇
- 2025年智慧城市建设项目合同范本2篇
- GB/T 16895.3-2024低压电气装置第5-54部分:电气设备的选择和安装接地配置和保护导体
- 安徽省合肥市2025年高三第一次教学质量检测地理试题(含答案)
- 计划合同部部长述职报告范文
- 统编版八年级下册语文第三单元名著导读《经典常谈》阅读指导 学案(含练习题及答案)
- 风光储储能项目PCS舱、电池舱吊装方案
- 人教版高一地理必修一期末试卷
- GJB9001C质量管理体系要求-培训专题培训课件
- 二手车车主寄售协议书范文范本
- 窗帘采购投标方案(技术方案)
- 基于学习任务群的小学语文单元整体教学设计策略的探究
- 人教版高中物理必修一同步课时作业(全册)
评论
0/150
提交评论