флагшток внутренний использование

Форум Академгородка, Новосибирск [Русская версия Invision Power Board] /* * Cascading Style Sheet(CSS 467), for Invision Power Board 2.2.0 * Author: James A. Mathias, admin@leihu.com, http://www.1lotus.com * Copyright: 2005 Invision Power Services, all rights reserved * * All style attributes in alpha-numeric order starting from 0 * */ /* * ======================================== * global element styles * ======================================== */ html{ overflow-x: auto; /* fixes MSIE scrollbar bug DO NOT REMOVE, has no effect in Mozilla, or Opera */ } body{ background: #FFF; color: #222; font-family: Verdana, Tahoma, Arial, "Trebuchet MS", Sans-Serif, Georgia, Courier, "Times New Roman", Serif; font-size: 11px; line-height: 135%; margin: 0px; padding: 0px; /* required for Opera to have 0 margin */ text-align: center; /* centers board in MSIE */ } /* * ======================================== * Set up IPB table * ======================================== */ .ipbtable { width:100% } table.ipbtable, tr.ipbtable, td.ipbtable { /* required for text in tables, because tables do not inherit from body */ background: transparent; color: #222; font-size: 11px; line-height: 135%; } .ipbtable td, .divpad{ /* gives all tables faux cellpadding of 5px */ padding: 5px; } td.nopad{ /* allows some tables to have no padding on the td */ padding: 0; } /* Safari... */ th { text-align: left; } form{ display: inline; margin: 0; /* removes mystery form tag gapping */ padding: 0; /* removes mystery form tag gapping */ } img{ border: 0; /* makes sure linked images do not have a border */ vertical-align: middle; } /* * ======================================== * global hyperlink styles * ======================================== */ a:link, a:visited, a:active{ background: transparent; color: #000; text-decoration: underline; } a:hover{ background: transparent; color: #34498B; } /* * ======================================== * Main wrapper, this controls the overall width of the board in you browser view window. * ======================================== */ #ipbwrapper{ margin: 20px auto 20px auto; /* centers the box, no matter the overall width, also applies a 20px gap at the top and bottom of the board */ text-align: left; /* re_aligns text to left second part of two part MSIE centering workaround */ /* EDIT THIS TO CHANGE THE WIDTH OF THE BOARD -> 960px is a common fixed resolution size */ width: 98%; } /* * ======================================== * styles for pagination links * ======================================== */ .pagelink, .pagelinklast, .pagecurrent, .minipagelink, .minipagelinklast{ background: #F0F5FA; border: 1px solid #072A66; padding: 1px 3px 1px 3px; } .pagelinklast, .minipagelinklast{ background: #DFE6EF; } .pagecurrent{ background: #FFC9A5; } .minipagelink, .minipagelinklast{ border: 1px solid #C2CFDF; font-size: 10px; margin: 0 1px 0 0; } .pagelink a:active, .pagelink a:visited, .pagelink a:link, .pagelinklast a:active, .pagelinklast a:visited, .pagelinklast a:link, .pagecurrent a:active, .pagecurrent a:visited, .pagecurrent a:link, .minipagelink a:active, .minipagelink a:visited, .minipagelink a:link, .minipagelinklast a:active, .minipagelinklast a:visited, .minipagelinklast a:link{ text-decoration: none; } /* fake button effect for some links */ .fauxbutton{ background: #BFCDE0; border: 1px solid #072A66; font-size: 11px; font-weight: bold; padding: 4px; } .fauxbutton a:link, .fauxbutton a:visited, .fauxbutton a:active{ color: #222 !important; text-decoration: none; } .forumdesc, .forumdesc a:link, .forumdesc a:visited, .forumdesc a:active{ background: transparent; font-size: 10px; color: #666; line-height: 135%; margin: 2px 0 0 0; padding: 0; } /* =================================================================================== */ /* =================================================================================== */ /* =================================================================================== */ .searchlite { background-color:yellow; font-weight:bold; color: red; } .activeusers{ background: #FFF; border: 1px solid #072A66; color: #000; margin: 0px; padding: 1px; } .activeuserposting a:link, .activeuserposting a:visited, .activeuserposting a:active, .activeuserposting { font-style:italic; text-decoration: none; border-bottom:1px dotted black; } fieldset.search{ line-height: 150%; padding: 6px; } label{ cursor: pointer; } img.attach{ background: #808080 url(style_images/old_style/click2enlarge.gif) no-repeat top right; border: 1px solid #808080; margin: 0 2px 0 0; padding: 11px 2px 2px 2px; } .thumbwrap, .thumbwrapp, .fullimagewrap { border: 1px solid #072A66; margin: 2px; } .thumbwrapp{ border: 2px solid #660707; } .fullimagewrap{ background: #F5F9FD; text-align: center; margin: 5px 0 5px 0; padding: 5px; } .thumbwrap h4, .thumbwrapp h4{ background: #DDE6F2; border: 0 !important; border-bottom: 1px solid #5176B5 !important; color: #5176B5; font-size: 12px; font-weight: bold; margin: 0; padding: 5px; } .thumbwrap p, .thumbwrapp p{ background: #EEF2F7 !important; border: 0 !important; border-top: 1px solid #5176B5 !important; margin: 0 !important; padding: 5px !important; text-align: left; } .thumbwrap p.alt, .thumbwrapp p.alt{ background: #DFE6EF !important; margin: 0 !important; padding: 5px !important; text-align: left; } .thumbwrapp p.pin{ background: #EFDFDF !important; text-align: center !important; } .thumbwrap img.galattach, .thumbwrapp img.galattach{ background: #FFF url(style_images/old_style/img_larger.gif) no-repeat bottom right; border: 1px solid #072A66; margin: 5px; padding: 2px 2px 10px 2px; } li.helprow{ margin: 0 0 10px 0; padding: 0; } ul#help{ padding: 0 0 0 15px; } .warngood, .warnbad{ color: #0B9500; font-weight: bold; } .warnbad{ color: #DD0000; } #padandcenter{ margin: 0 auto 0 auto; padding: 14px 0 14px 0; text-align: center; } #profilename{ font-size: 28px; font-weight: bold; } #photowrap{ padding: 6px; } #phototitle{ border-bottom: 1px solid #000; font-size: 24px; } #photoimg{ margin: 15px 0 0 0; text-align: center; } #ucpmenu, #ucpcontent{ background: #F5F9FD; border: 1px solid #345487; line-height: 150%; } #ucpmenu p{ margin: 0; padding: 2px 5px 6px 9px; } #ucpmenu a:link, #ucpmenu a:active, #ucpmenu a:visited{ text-decoration: none; } #ucpcontent{ width: auto; } #ucpcontent p{ margin: 0; padding: 10px; } .activeuserstrip{ background: #BCD0ED; padding: 6px; } /* Topic View elements */ .signature{ background: transparent; color: #339; font-size: 10px; line-height: 150%; } .postdetails{ font-size: 10px; line-height:140%; } .postcolor{ font-size: 12px; line-height: 160%; } .normalname{ color: #003; font-size: 12px; font-weight: bold; } .normalname a:link, .normalname a:visited, .normalname a:active{ font-size: 12px; } .post1, .bg1{ background: #F5F9FD; } .post2, .bg3{ background: #EEF2F7; } .row2shaded, .post1shaded { background-color: #DEDBE4 } .row4shaded, .post2shaded { background-color: #E3DFE7 } .row1{ background: #DFE6EF; } .row2{ background: #E4EAF2; } .rowhighlight{ background-color: #FFF9BA; } .darkrow1{ background: #BCD0ED; color: #3A4F6C; } .darkrow3{ background: #D1DCEB; color: #3A4F6C; } /* tableborders gives the white column / row lines effect */ .plainborder, .tablefill, .tablepad{ background: #F5F9FD; border: 1px solid #345487; } .tablefill, .tablepad{ padding: 6px; } .tablepad{ border: 0 !important; } .wrapmini{ float: left; line-height: 1.5em; width: 25%; } .pagelinks{ float: left; line-height: 1.2em; width: 35%; } .desc{ font-size: 11px; color: #434951; } .lastaction { font-size: 10px; color: #434951; } .edit{ font-size: 9px; } .thin{ border: 1px solid #FFF; border-left: 0; border-right: 0; line-height: 150%; margin: 2px 0 2px 0; padding: 6px 0 6px 0; } /* =================================================================================== */ /* =================================================================================== */ /* =================================================================================== */ /* * ======================================== * calendar styles * ======================================== */ .calmonths{ background: #F0F5FA; border: 1px solid #C2CFDF; font-size: 18px; font-weight: bold; margin: 5px 0 5px 0; padding: 8px; text-align: center; } .weekday{ font-size: 14px; font-weight: bold; } .calmonths a{ text-decoration: none; } .calday, .calweekday{ background: #DFE6EF; color: #666; font-size: 11px; font-weight: bold; margin: 0; padding: 4px; text-align: right; } .calweekday{ border-right: 1px solid #AAA; color: #222; font-size: 14px; padding: 6px; text-align: center; } .celltodayshaded, .celldateshaded, .cellblank, .celldate, .celltoday, .mcellblank, .mcelldate, .mcelltoday{ background: #EEF2F7; height: 100px; margin: 0; padding: 0; vertical-align: top; } .celltodayshaded, .celldateshaded { background: #E3DFE7; } .mcellblank, .mcelldate, .mcelltoday{ height: auto; } .cellblank, .mcellblank{ background: #C2CFDF; } .celltoday, .celltodayshaded, .mcelltoday{ border: 2px solid #8B0000; } .calranged { border: 2px outset #C2CFDF; background: #C2CFDF; padding:4px; } .calitem { border-bottom: 1px dotted #C2CFDF; padding:4px; } /* * ======================================== * form styles * ======================================== */ .input-warn, .input-green, .input-checkbox, input, textarea, select{ background: #FFF; border: 1px solid #4C77B6; color: #000; font-family: verdana, helvetica, sans-serif; font-size: 11px; margin: 5px; padding: 2px; vertical-align: middle; } select { margin: 0px; } .input-checkbox { border: none; } .input-warn, .input-warn-content { border: 1px solid #C00; } .input-ok, .input-ok-content { border: 1px solid #0C0; } .input-warn-content { padding: 4px; margin: 4px; background-color: #FCC; } .input-ok-content { padding: 4px; margin: 4px; background-color: #CFC; } .input-text { color: #900; } input.button{ margin: 0; width: auto; cursor: pointer; } optgroup option{ font-family: verdana, helvetica, sans-serif; font-size: 12px; } .codebuttons{ font-family: Verdana, Helvetica, Sans-Serif; font-size: 10px; vertical-align: middle; margin:2px; } .textarea, .searchinput, .button, .gobutton{ background: #FFF; border: 1px solid #4C77B6; color: #000; font-family: Verdana, Helvetica, Sans-Serif; font-size: 11px; padding: 2px; vertical-align: middle; } .button{ background: #DFE6EF; } .gobutton{ background: transparent; border: 0; color: #072A66; margin: 0; vertical-align: middle; } .radiobutton, .checkbox, .helpbox { border: 0; vertical-align: middle; background: transparent; } /* * class.formtable * * used for tabled forms * technically tables should not be used for form display * but, in the case of IPB a table is easier to work with * for the average webmaster, who has little to no CSS knowledge. * */ .formtable{ background: transparent; } .formtable td, .pformleft, .pformleftw, .pformright{ background:#F5F9FD; border: 1px solid #C2CFDF; border-bottom: 0; border-left: 0; font-weight: bold; margin: 1px 0 0 0; padding: 6px; width: 25%; } .formtable td.wider, .pformleftw, .pformright{ width: 40%; } .formtable td.formright, .pformright{ border-right: 0px; font-weight: normal; width: auto; } .formtable td.formtitle, .formsubtitle{ background: #D1DCEB; border: 1px solid #9FB9D4; border-bottom: 0; border-left: 0; border-right: 0; font-weight: normal; } .formsubtitle{ border: 0; color: #3A4F6C; font-weight: bold; padding: 5px; } .formtable td.formstrip{ background: #DDE8F2; border: 1px solid #9FB9D4; border-left: 0; border-right: 0; font-weight: normal; } /* * ======================================== * new style quote and code wrappers MATT's DESIGN * ======================================== */ .quotetop{ background: #E4EAF2 url(style_images/old_style/css_img_quote.gif) no-repeat right; border: 1px dotted #000; border-bottom: 0; border-left: 4px solid #8394B2; color: #000; font-weight: bold; font-size: 10px; margin: 2px auto 0 auto; padding: 3px; } .quotemain{ background: #FAFCFE; border: 1px dotted #000; border-left: 4px solid #8394B2; border-top: 0; color: #465584; padding: 4px; margin: 0 auto 0 auto; } .codetop, .sqltop, .htmltop{ background: #FDDBCC url(style_images/old_style/css_img_code.gif) no-repeat right; color: #000; font-weight: bold; margin: 0 auto 0 auto; padding: 3px; } .codemain, .sqlmain, .htmlmain{ background: #FAFCFE; border: 1px dotted #000; color: #465584; font-family: Courier, "Courier New", Verdana, Arial; margin: 0 auto 0 auto; padding: 2px; } /* * ======================================== * old school quote and code styles - backwards compatibility * ======================================== */ #QUOTE, #CODE{ background: #FAFCFE; border: 1px solid #000; color: #465584; font-family: Verdana, Arial; font-size: 11px; padding: 2px; white-space: normal; } #CODE{ font-family: Courier, "Courier New", Verdana, Arial; } /* * ======================================== * All New Styles * ======================================== */ .cleared{ clear: both; } .borderwrap, .borderwrapm{ /* this will affect the outlining border of all the tables and boxes through-out the skin. */ background: #FFF; border: 1px solid #072A66; padding: 0px; margin: 0px; } .borderwrapm{ margin: 5px; } .borderwrap h3, .maintitle, .maintitlecollapse{ background: url(style_images/old_style/tile_cat.gif); border: 1px solid #FFF; border-bottom: 1px solid #5176B5; color: #FFF; font-size: 12px; font-weight: bold; margin: 0px; padding: 8px; } .maintitle td { color: #FFF; font-size: 12px; font-weight: bold; } .maintitlecollapse{ border: 1px solid #FFF; } .maintitle p, .maintitlecollapse p, .formsubtitle p{ background: transparent !important; border: 0 !important; margin: 0 !important; padding: 0 !important; } .maintitle p.expand, .maintitle p.goto, .maintitlecollapse p.expand, .formsubtitle p.members{ float: right; width: auto !important; } .maintitle a:link, .maintitle a:visited, .maintitlecollapse a:link, .maintitlecollapse a:visited{ background: transparent; color: #FFF; text-decoration: none; } .maintitle a:hover, .maintitle a:active, .maintitlecollapse a:hover, .maintitlecollapse a:active{ background: transparent; color: #F1F1F1; } table th, .borderwrap table th, .subtitle, .subtitlediv, .postlinksbar{ background: transparent url(style_images/old_style/tile_sub.gif); border-bottom: 1px solid #5176B5; color: #3A4F6C; font-size: 10px; font-weight: bold; letter-spacing: 1px; margin: 0; padding: 5px; } .subtitlediv{ border: 1px solid #FFF; border-bottom: 1px solid #5176B5; text-align: right; } .borderwrap table th a:link, .subtitle a:link, .subtitlediv a:link, .borderwrap table th a:visited, .subtitle a:visited, .subtitlediv a:visited, .borderwrap table th a:active, .subtitle a:active, .subtitlediv a:active, .borderwrap table th a:hover, .subtitle a:hover, .subtitlediv a:hover{ background: transparent; color: #3A4F6C; text-decoration: none; } .borderwrap h4{ background: #DDE6F2; border: 1px solid #FFF; border-bottom: 1px solid #5176B5; border-top: 1px solid #5176B5; color: #5176B5; font-size: 12px; font-weight: bold; margin: 0; padding: 5px; } .borderwrap p{ background: #F9F9F9; border: 1px solid #CCC; margin: 5px; padding: 10px; text-align: left; } td.formbuttonrow, .pformstrip, .borderwrap p.formbuttonrow, .borderwrap p.formbuttonrow1{ background: #D1DCEB !important; border: 1px solid #FFF; border-top: 1px solid #5176B5; margin: 0px !important; padding: 5px !important; text-align: center; } td.formbuttonrow{ border-bottom: 0; border-left: 0; border-right: 0; } .borderwrap p.formbuttonrow1{ background: #F9F9F9 !important; border: 0; border-top: 1px solid #CCC; } .bar, .barb, .barc{ background: #DFE6EF; border: 1px solid #FFF; } .barc{ border-bottom: 0; } .bar p, .barb p, .barc p{ background: transparent; border: 0; color: #222; font-size: 11px; margin: 0; padding: 5px; text-align: left; } .barb p{ text-align: right; } .bar p.over, .bar p.overs, .barc p.over, .barc p.overs{ float: right; } .barb p.over, .barb p.overs{ float: left; } .bar p.overs, .barb p.overs, .barc p.overs{ position: relative; top: 5px; } .catend{ /*background: #8394B2;*/ color: #000; font-size: 1px; height: 5px; } .newslink{ background: #F0F5FA; border: 1px solid #C2CFDF; margin: 0; width: 100%; } .newslink td{ color: #222; font-size: 10px; padding: 5px 5px 5px 10px; } .newslink span{ background: transparent; color: #072A66; font-style: italic; font-weight: normal; } .newslink input{ background: #FFF; border: 1px solid #999; color: #072A66; font-size: 10px; padding: 3px; vertical-align: middle; width: auto; } .newslink input.button{ background: transparent; border: 0; color: #072A66; vertical-align: middle; } .fieldwrap{ background: #F9F9F9; border: 1px solid #CCC; border-top: 0; margin: 5px; padding: 0; text-align: left; } .fieldwrap h4{ background: #EEE; border: 1px solid #CCC; border-left: 0; border-right: 0; color: #444; font-size: 12px; font-weight: bold; margin: 0; padding: 5px; } .errorwrap { background: #F2DDDD; border: 1px solid #992A2A; border-top: 0; margin: 5px; padding: 0; } .errorwrap h4 { background: #E3C0C0; border: 1px solid #992A2A; border-left: 0; border-right: 0; color: #992A2A; font-size: 12px; font-weight: bold; margin: 0; padding: 5px; } .errorwrap p { background: transparent; border: 0; color: #992A2A; margin: 0; padding: 8px; } .ruleswrap{ background: #F2DDDD; border: 1px solid #992A2A; color: #992A2A; margin: 5px 0 5px 0; padding: 5px; } #redirectwrap{ background: #F0F5FA; border: 1px solid #C2CFDF; margin: 200px auto 0 auto; text-align: left; width: 500px; } #redirectwrap h4{ background: #D0DDEA; border-bottom: 1px solid #C2CFDF; color: #3A4F6C; font-size: 14px; margin: 0; padding: 5px; } #redirectwrap p{ margin: 0; padding: 5px; } #redirectwrap p.redirectfoot{ background: #E3EBF4; border-top: 1px solid #C2CFDF; text-align: center; } #gfooter{ background: #8394B2; margin: 5px 0 5px 0; padding: 0; width: 100%; } #gfooter td{ color: #FFF; font-size: 10px; padding: 4px; } #gfooter a:link, #gfooter a:visited{ color: #FFF; } #logostrip{ text-align: left; background: #3860BB url(style_images/old_style/bg.png); /*border: 1px solid #FFF;*/ height: 74px; margin: 0; padding: 0; } #logographic{ background: transparent url(style_images/old_style/logo4.gif) no-repeat left; height: 68px; margin: 0; padding: 0; } #submenu{ background: transparent url(style_images/old_style/tile_sub.gif); border: 1px solid #FFF; border-top: 0; color: #3A4F6C; margin: 0; height: 29px; text-align: right; } .ipb-top-left-link, .ipb-top-right-link { background: transparent url(style_images/old_style/tile_sub-lite.gif); float: right; font-size: 10px; font-weight: bold; letter-spacing: 0.5px; margin: 0px; padding: 7px 0 7px 0; width: auto; border-left: 1px solid #dce3ee; } .ipb-top-left-link { float: left; border-left: 0px; border-right: 1px solid #dce3ee; } .ipb-top-left-link a:link, .ipb-top-left-link a:visited, .ipb-top-right-link a:link, .ipb-top-right-link a:visited { background: transparent; color: #3A4F6C; padding: 0 6px 0 6px; text-decoration: none; } .ipb-top-left-link a:hover, .ipb-top-left-link a:active, .ipb-top-right-link a:hover, .ipb-top-right-link a:active { background: transparent; color: #5176B5; } #userlinks, #userlinksguest{ background: #F0F5FA; border: 1px solid #C2CFDF; margin: 5px 0 5px 0; padding: 0 5px 0 5px; } #userlinksguest{ background: #F4E7EA; border: 1px solid #986265; } #userlinks p, #userlinksguest p{ background: transparent !important; border: 0 !important; font-size: 10px; font-weight: bold; letter-spacing: 1px; margin: 0 !important; padding: 7px 0 7px 0; text-align: right; } #userlinks p, #userlinksguest p{ font-weight: normal; letter-spacing: 0; } #userlinksguest p.pcen{ text-align: center; } #userlinks p.home, #userlinksguest p.home{ float: left; } #navstrip{ background: transparent; color: #000; font-size: 11px; font-weight: bold; margin: 0 0 5px 0; padding: 0px 0px 3px 0px; } #navstrip a:link, #navstrip a:visited{ background: transparent; color: #5176B; text-decoration: underline; } #navstrip a:hover, #navstrip a:active{ background: transparent; color: #5176B5; } #navstrip_adv{ background: transparent; color: #1C4A94; font-size: 11px; font-weight:normal; margin: 0 0 5px 0; padding: 0px 0px 3px 0px; } #navstrip_adv a:link, #navstrip_adv a:visited{ background: transparent; color: #1C4A94; text-decoration: underline; } #navstrip_adv a:hover, #navstrip_adv a:active{ background: transparent; color: #1C4A94; } .toplinks{ background: transparent; color: #000; margin: 0; padding: 0 0 5px 0; text-align: right; } .toplinks span{ background: #F0F5FA; border: 1px solid #C2CFDF; border-bottom: 0; color: #000; font-size: 10px; font-weight: bold; margin: 0 10px 0 0; padding: 5px; } .copyright{ background: #EEE; font-size: 11px; margin: 0 0 5px 0; padding: 8px; } /* * ======================================== * print page styles * ======================================== */ #print{ margin: 20px auto 20px auto; padding: 0; text-align: left; width: 85%; } #print h1, #print h2, #print h3, #print h4, #print p{ color: #036; font-size: 18px; font-weight: bold; margin: 0; padding: 8px; } #print h2, #print h3, #print p{ border-bottom: 1px solid #999; font-size: 11px; font-weight: normal; } #print h3{ background: #F5F5F5; font-size: 12px; font-weight: bold; margin: 0 0 10px 0; } #print h4{ background: #F9F9F9; font-size: 11px; } #print p{ margin: 0 0 5px 0; padding: 10px; } #print p.printcopy{ border: 0; color: #000; text-align: center; } .dny-edit-title { border:0px; padding:3px; margin:0px; background: #D1DCEB; color: #3A4F6C; } /* ======================================== */ /* TABS /* ======================================== */ .tabon { border-top:1px solid #999; border-left:1px solid #999; border-right:1px solid #999; background-color:#FFF; padding:8px; padding-bottom:9px; font-size:10px; float:left; width:auto; margin-top:3px; } .taboff { border-top: 1px solid #777; border-left: 1px solid #777; border-right: 1px solid #777; background-color: #B5C3D9; color: #333; padding: 8px; font-size:10px; float: left; width: auto; margin-top:3px; } .tabon a:link, .tabon a:visited, .tabon a:active { text-decoration:none; color: #000; } .taboff a:link, .taboff a:visited, .taboff a:active { text-decoration:none; color: #333; } .mya-back { background: #072A66; margin:1px; padding: 1px; } .mya-content { background: #FFF; padding:8px; margin: 1px; border: 1px solid #777; } .mya-content-tbl { background: #F0F5FA; border: 1px solid #777; text-align:left; font-size:10px; white-space:nowrap; margin:1px; } .mya-fieldwrap { background: transparent; margin-top: 2px; margin-bottom: 2px; padding: 4px; border: 1px solid #C5C7CD; -moz-border-radius: 5px; width: auto; display: block; } /* -------------------------------- */ /* Create PM box defaults */ /* -------------------------------- */ .iframeshim { position:absolute; display:none; background: #FFF; border:0px; width:auto; height:auto; } /* -------------------------------- */ /* Experimental */ /* -------------------------------- */ .popupmenu, .popupmenu-new { background: #F0F5FA; border: 1px solid #3A4F6C; text-align:left; font-size:10px; white-space:nowrap; /*padding:3px 5px 3px 3px;*/ /*width:300px;*/ } .popupmenu-item { padding: 5px; /*margin-top:4px;*/ white-space: nowrap; border-bottom: 1px solid #C2CFDF; color: #000000; font-weight: normal; } .popupmenu-item-last { padding: 5px; /*margin-top:4px;*/ white-space: nowrap; color: #000000; font-weight: normal; } .popmenubutton-new, .popmenubutton { width:120px; white-space:nowrap; background-color: #C2CFDF; border:1px solid #3A4F6C; color: #3A4F6C; font-weight:bold; float:right; height:18px; text-align:center; margin:0px; font-size:11px; padding:3px; } .popmenubutton-new { float:none; width:auto; text-align:left; height:auto; padding:3px; font-weight:normal; background-color:#EEF2F7; background-image: url(style_images/old_style/menu_action_down-padded.gif); background-repeat: no-repeat; background-position: right; } .popmenubutton-new-out { padding:4px; } .popupmenu-new { background-color: #DFE6EF; } .popmenubutton a:link, .popmenubutton a:visited, .popmenubutton-new a:link, .popmenubutton-new a:visited, .popupmenu-item a:link, .popupmenu-item a:visited, .popupmenu-item-last a:link, .popupmenu-item-last a:visited { color: #3A4F6C; text-decoration: none; } .popmenubutton a:hover, .popmenubutton-new a:hover, .popupmenu-item a:hover, .popupmenu-item-last a:hover { color: #5176B5; text-decoration: none; } .popupmenu-category { background: transparent url(style_images/old_style/tile_sub.gif); border-top: 1px solid #5176B5; border-bottom: 1px solid #5176B5; color: #3A4F6C; font-size: 10px; font-weight: bold; letter-spacing: 1px; margin: 0; padding: 5px; } /* -------------------------------- */ /* Loading box /* -------------------------------- */ #loading-layer-inner { width:220px; height:28px; padding:18px 10px 10px 10px; text-align:center; color: #000; border: 1px solid; border-color:#CCC #666 #666 #CCC; background-color: #FCF8C7; } /* -------------------------------- */ /* Message in a bo(x|ttle) /* -------------------------------- */ #ipd-msg-wrapper { display: none; width: 220px; } #ipd-msg-inner { width:100%; height:45px; padding: 6px 4px 4px 4px; margin: 0px; text-align:center; color: #000; border: 1px solid; border-color:#ccc #666 #666 #ccc; background-color: #FCF8C7; filter:alpha(opacity=75); opacity:.75 } #ipd-msg-title { width: 100%; height:20px; margin: 0px; padding: 6px 4px 4px 4px; background: transparent url(style_images/old_style/css_pp_header.gif); border: 1px solid #3A4F6C; border-bottom: 0px; color: #FFF; } .linked-image { margin: 0px; padding: 0px; border: 0px; } .resized-linked-image { margin: 1px 0px 0px 0px; padding: 0px; background-color: #000; border: 0px; color: #FFF; font-size: 10px; width: auto; -moz-border-radius-topleft: 7px; -moz-border-radius-topright: 7px; } .resized-linked-image-zoom { width: 200px; height: 30px; filter:alpha(opacity=85); opacity:.85; background-color: #FFF; padding-top: 6px; padding-left: 5px; top: 0px; left: 0px; position: absolute; display: none; } /* -------------------------------- */ /* Edit post reason /* -------------------------------- */ .post-edit-reason { background: #E7EAEF; margin-top: 9px; margin-bottom: 0px; padding: 4px; color: #333; font-size: 10px; border: 1px solid #C5C7CD; -moz-border-radius: 5px; width: auto; display: block; } /* -------------------------------- */ /* Personal Profile /* -------------------------------- */ .pp-name { background: #F0F5FA; border: 1px solid #C2CFDF; margin: 0px; padding: 10px; } .pp-name h3 { margin:0px; padding:0px 0px 5px 0px; font-size:24px; } .pp-header { background: transparent url(style_images/old_style/tile_sub.gif); color: #3A4F6C; font-size: 10px; font-weight: bold; margin: 0px 0px 1px 0px; padding: 5px; } .pp-title { background: url(style_images/old_style/css_pp_header.gif); border-bottom: 1px solid #5176B5; color: #FFF; font-size: 12px; font-weight: bold; margin: 0px; padding: 8px; } .pp-datebox { text-align: center; background: #FFFFFF; border: 1px solid #555555; padding: 4px; margin: 0px; font-size:18px; font-weight:bold; line-height: 100%; letter-spacing: -1px; float:right; width: auto; } .pp-datebox em { color: #AAA; font-weight: normal; font-style: normal; } .pp-contentbox-back { background-image: url(style_images/old_style/folder_profile_portal/pp-css-contentblock.gif); background-repeat: repeat-x; background-color: #ACBFD9; padding: 6px; } .pp-contentbox-entry, .pp-contentbox-entry-noheight, .pp-contentbox-entry-noheight-mod, .pp-contentbox-entry-noheight-sel { background-color: #EEF2F7; border: 1px solid #888888; line-height: 140%; padding: 8px; margin-bottom: 6px; height: 200px; overflow: auto; overflow-x: auto; } .pp-contentbox-entry-noheight-sel { background-color:#FCECCD; } .pp-contentbox-entry-noheight-mod { background-color:#FDF1DA; } .pp-contentbox-entry-noheight, .pp-contentbox-entry-noheight-mod, .pp-contentbox-entry-noheight-sel { height: auto; margin-bottom: 1px; } .pp-image-thumb-wrap, .pp-image-thumb-wrap-floatright, .pp-image-mini-wrap, .pp-image-mini-wrap-floatright { width: 52px; height: 52px; text-align: center; background: #FFFFFF; border: 1px solid #555555; padding: 4px; margin-top: auto; margin-bottom: auto; } .pp-image-mini-wrap, .pp-image-mini-wrap-floatright { width: 27px; height: 27px; margin-top: auto; margin-bottom: auto; } .pp-image-thumb-wrap-floatright, .pp-image-mini-wrap-floatright { float:right; } .pp-tiny-text { color: gray; font-size: 10px; } .pp-mini-content-entry, .pp-mini-content-entry-noheight, .pp-mini-entry-noheight-shaded { background-color: #F5F9FD; padding: 6px; border-bottom: 1px dotted #555555; clear:both; width: auto; height: 60px; } .pp-mini-entry-noheight-shaded { background-color: #E3DFE7; } .pp-mini-content-entry-noheight, .pp-mini-entry-noheight-shaded { height: auto; } .pp-tabclear, .pp-maintitle { background: url(style_images/old_style/css_pp_header.gif); border: 1px solid #FFF; border-bottom: 1px solid #5176B5; color: #FFF; font-size: 12px; font-weight: bold; margin: 0px; padding: 8px; } .pp-tabclear { border:0px; border-right: 1px solid #072A66; border-left: 1px solid #072A66; } .pp-tabon { border-top:1px solid #3363A1; border-left:1px solid #072A66; border-right:1px solid #072A66; background-color:#6696D6; color:#FFFFFF; padding:8px; float:left; width:auto; background-image: url(style_images/old_style/css_pp_tab_on.gif); background-repeat: repeat-x; background-position: left bottom; margin-top:3px; font-size:10px; } .pp-taboff, .pp-tabshaded { border-top: 1px solid #759BC7; border-left: 1px solid #759BC7; border-right: 1px solid #759BC7; background-color: #3363A1; color: #3363A1; padding:8px; float: left; width: auto; background-image: url(style_images/old_style/css_pp_tab_off.gif); background-repeat: repeat-x; background-position: left bottom; margin-top:3px; font-size:10px; } .pp-tabshaded { background-image: url(style_images/old_style/css_pp_tab_shaded.gif); background-repeat: repeat-x; background-position: left bottom; color: #516795; border-top: 1px solid #7f9BBC; border-left: 1px solid #7f9BBC; border-right: 1px solid #7f9BBC; } .pp-tabon a:link, .pp-tabon a:visited, .pp-tabon a:active { text-decoration:none; color: #FFFFFF; } .pp-taboff a:link, .pp-taboff a:visited, .pp-taboff a:active, .pp-tabshaded a:link, .pp-tabshaded a:visited, .pp-tabshaded a:active { text-decoration:none; color: #3363A1; } .pp-tabwrap { height: 34px; margin:0px; padding:0px; } .top_search{ } /* поиск onE*/ table.tsearch { width: 100%; height: 20px; background: white; border-width: 1px; border-color: #5d96c3; border-style: solid solid solid solid; } td.searchtitle { /* font-size: 10px;*/ color: #434343; } .search_inp { /*font-size: 12px;*/ height: 16px; color: #000; padding-left: 4px; padding-top: 3px; padding-bottom: 0px; width: 245px; background: white; border-width: 1px; border-color: #4C77B6; border-style: solid solid solid solid; } Версия для печати темы Нажмите сюда для просмотра этой темы в обычном формате Форум Академгородка, Новосибирск _ Программирование _ Причины для отделения мух от котлет Автор: MuratMusic 19.02.2008, 19:32 Прочитал в первых нескольких главах книги Стива Макконела "Совершенный код" о том, как автор однажды попался на удочку особенностей среды Visual Basic, которая по мнению автора не способствует стремлению к отмежеванию кода логики программы от кода обработчиков элементов управления интерфейса программы. То есть автор считает, что если особо не задумываться, то Visual Basic подталкивает программиста-новичка к тому, что во все обработчики элементов интерфейса будет напихан вообще весь код программы.Я с интересом читал эти страницы, потому что сам попадаюсь на эту удочку (несмотря на богатые возможности C++/C#). Более того, моя кривизна в способах делать программы зашла настолько далеко, что однажды я разработал иерархию классов (первую в своей жизни), в которой каждый класс был весь пронизан взаимодействием почти со всеми элементами управления (кнопками, нажатиями мышкой по рисованным кнопками флагшток внутренний использование т.п.). Теперь мне приходится мириться с этой иерархией классов (но даже она значительно облегчает мне написание программы флагшток внутренний использование особенно наполнение её новыми возможностями, если сравнивать с архаичным процедурным подходом).После прочтений этих страниц я задумался на предмет цели отделения мух от котлет. Если мне хочется сделать программу на перспективу с возможностью переноса её на другие платформы, тогда отделение кода с обработчиками от кода логики программы очень полезно флагшток внутренний использование необходимо.А если я сознательно захочу отказаться от идеи переносимости программы (с целью облегчить себе жизнь), то насколько оправданным может быть отделение кода, обслуживающего интерфейс пользователя (GUI) от кода логики программы? Пока мне кажется, что такое отделение мне может обойтись в необходимость всю программу переписывать заново.И ещё вопрос. Всегда ли изолированный чёрный ящик (в терминах ООП это наверное класс) должен иметь вход флагшток внутренний использование выход, или несколько входов флагшток внутренний использование один выход (как например в измерительной аппаратуре или в схеме усилителя низкой частоты).Согласен, что нецелесообразно здесь было бы цитировать целые главы из учебников. Но может быть какой-то краткий совет направил бы меня в нужную сторону... Автор: magius 19.02.2008, 19:58 ООП для военных ЦитатаИнструктор на занятиях по инженерному делу задал такой вопрос будущим офицерам:— Представьте себе, что трехметровая мачта с флагштоком упала. В вашем распоряжении сержант флагшток внутренний использование отделение из восьми человек. Ваши действия?Посыпались предложения, как с помощью тех или иных технических приемов установить мачту.— Неправильно, все неправильно! Вы просто должны приказать: «Сержант, поставьте мачту на место».Этот пребаянистый анекдот идеальным образом иллюстрирует то, к чему вы должны стремиться в архитектуре ваших программ. Ситуация, когда все отвечают за все приемлема только если у вас програмка на 150 строчек. В более сложной структуре нужно определять области ответственности той или иной сущности Ну не должен офицер заниматься установкой мачт Для этого сержанты существуют.Этот аспект проектирования вас интересовал? Автор: Radar 19.02.2008, 20:18 Вот как бы там ни было, флагшток внутренний использование у меня иногда присутствует соблазн написать весь код программы заново, пренебрегая флагшток внутренний использование временем флагшток внутренний использование затратами на это написание. Думаю, что здесь важен балланс. Нужно использовать флагшток внутренний использование возможности предоставляемые платформой интегрируя в неё свои наработки. Вот, например, если пишете в C++ Builder, визуально, то не лишено смысла подстраиваться под эту среду, включая собственный код в соответствующие функции-обработчики событий. Однако, логика (структура) программы, должна по возможности быть написана так, чтобы её легко было прочесть. Именно поэтому, если я собираюсь писать что-то большое, то сначало берусь за клетчатую тетрадку флагшток внутренний использование набрасываю в ней блок-схемы, типы данных, классы, функции флагшток внутренний использование механизмы их работы, структуры флагшток внутренний использование форматы в которых будут существовать базы данных. Собственно этот процесс для меня флагшток внутренний использование есть "отделение мух от котлет". Потом, в процессе написания кода, всё снова укладывется вместе. Теперь о "Ящике ООП". Ящик - это флагшток внутренний использование есть основной принцип ООП. Сохраняя этот принцип мы сохраняем логическую структуру программы флагшток внутренний использование ясность порядка взаимодействия её различных звеньев, что в дальнейшем является хорошей стартовой площадкой для усовершенствования этой программы. По поводу входа флагшток внутренний использование выхода в ящике всё верно. Если есть логическое звено, задача которого выдать на экран картинку, то во-первых обязательно нужен вход для получения исходных данных (масштаб, палитра, спецэффекты, другие исходные данные), флагшток внутренний использование во-вторых нужен выход, который в данном примере будет тесно связан с дисплеем либо напрямую через драйвер, либо через какую-нибудь другую библиотечную функцию. И, в-третих, ничто не должно влиять на работу такого ящика если конструкцией ящика это не предусмотрено. Таково моё видение принципа ООП. Автор: MuratMusic 19.02.2008, 22:20 Спасибо, мне помогли оба предыдущих сообщения. Признаюсь, ту первую иерархию классов (и пока единственную) я делал без предварительного проектирования на бумаге, надеялся, что на авось пролезет (дескать, программа ведь не сложная).Сейчас принял решение делать программу заново на C# (жалко, что 1/3 пользователей будет вынуждена скачивать мегабайты NET, но преимущества уж слишком заманчивы), иначе прежний Visual C++ (и MFC) проект будет ползти черепашьими шагами долгие годы (у меня нет возможности уделять много времени программированию в силу семейных флагшток внутренний использование прочих обстоятельств).Насчёт выхода из чёрного ящика флагшток внутренний использование дисплея. Я всё же попытаюсь изолировать код логики программы от кода, обслуживающего GUI. Думаю, пусть один из чёрных ящиков логики программы на выходе даёт текст флагшток внутренний использование даже ссылки на картинки, которые должен увидеть пользователь на экране. Но пусть тогда этот ящик не будет знать о том, как сержант с солдатами будет выводить это на дисплей.Надеюсь, теперь я мыслю в более верном направлении. Автор: Radar 20.02.2008, 2:05 Цитата(MuratMusic @ 19.02.2008, 21:20) Я всё же попытаюсь изолировать код логики программы от кода, обслуживающего GUI. Думаю, пусть один из чёрных ящиков логики программы на выходе даёт текст флагшток внутренний использование даже ссылки на картинки, которые должен увидеть пользователь на экране. Но пусть тогда этот ящик не будет знать о том, как сержант с солдатами будет выводить это на дисплей. Должен признать, что это болше соответствует традициям ООП чем приведённый мною пример. Кстати, функции библиотеки DirectX хороший образец механизма приёма флагшток внутренний использование передачи данных "ящиками". Автор: MuratMusic 20.02.2008, 15:36 Я уже обсуждал свою цель правильно спроектировать свою программу несколько месяцев назад (возможно, тема имела название, обязывающее меня ограничиться только лишь рамками Си++ флагшток внутренний использование ООП).Немного о своей задаче:Я разрабатываю программу «Музыкальный Экзаменатор» уже несколько лет (первые версии были в виде flash, т.е. как swf-файл, делал на Macromedia Flash MX). Первая версия с применением ООП (Visual C++ флагшток внутренний использование MFC) вышла ближе к осени 2007 года. Тогда много времени ушло на то, чтобы переделать весь код из архаично-процедурного в более удобный в стиле ООП (насколько я могу оценить своё понимание ООП). Такая переделка всего подхода была вызвана желанием максимально облегчить себе жизнь в момент добавления в программу новых возможностей.Каким образом я тогда решил применить ООП флагшток внутренний использование наследование с полиморфизмом в частности?Я заметил, что все виды упражнений в этой программе (программа расчитана на проверку флагшток внутренний использование развитие музыкального слуха пользователя) имеют много общего. Почти у всех видов упражнений (или типов заданий) имеется нарисованная флагшток внутренний использование озвучиваемая фортепианная клавиатура (13 или 37 клавиш), все типы заданий имеют какой-то текст инструкций, выводимых в окно программы, все типы заданий подсчитывают количество полученных флагшток внутренний использование успешно пройденных шагов, количество попыток флагшток внутренний использование т.п. детали.По этой причине я решил сделать общий для всех видов упражнений родительский класс CAbstractTest, в котором содержались бы виртуальные функции флагшток внутренний использование члены-переменные, присущие всем видам упражнений.Далее я разбил этот класс на 2 класса (класс упражнений с 13 клавишным пианино флагшток внутренний использование класс упражнений с 37 клавишным пианино). Потом я сделал (используя множественное наследование, возможное в Си++) разделение по другому критерию - классы для мелодических упражнений флагшток внутренний использование классы для упражнений на аккорды.Все эти классы (вплоть до нижних ступенек иерархии наследования) пронизаны взаимодействием с пользовательским интерфейсом, что по всей видимости не есть гуд. То есть в каждом классе есть например функция OnLButtonClick() для того, чтобы из фунции OnLButtonClick() оконного MFC-класса CChildView вызвать функцию-тёзку класса конкретного музыкального упражнения, используя указатель на объект типа CAbstractTest (иначе говоря, этот указатель имеет право указывать на объект типа любого музыкального упражненческого класса-потомка из CAbstractTest). При переключении между различными видами упражнений заново динамически рождается экземпляр выбранного класса (для выбранного музыкального упражнения), флагшток внутренний использование перед этим динамически удаляется предыдущий объект. В любом случае все операции между интерфейсом пользователя флагшток внутренний использование объектом делаются через указатель на объект типа CAbstractTest.Даже такой подход при всей моей безграмотности флагшток внутренний использование при всей мешанине мух флагшток внутренний использование котлет заметно облегчил мне возможность придумывать новые классы для новых видов упражнений. Иногда конечно приходится добавлять в CAbstractTest новые виртуальные члены-переменные флагшток внутренний использование члены-функции (так случилось, когда я решил добавить в программу новые виды упражнений с применением миди-клавиатуры, что сразу даст моей программе шанс стать интересной для более продвинутых начинающих музыкантов, которым скучно было бы развивать слух, тыкая одной лишь мышкой). Так вот, даже если мне приходится добавлять в CAbstractTest новые виртуальные члены-переменные флагшток внутренний использование члены-функции (ненужные для всех старых придуманных муз. упражнений, т.е. классов для этих упражнений), меня это не особо беспокоит, ведь я могу забыть флагшток внутренний использование не трогать отлаженные классы (хотя меня удручает то, что при добавлении в CAbstractTest эти отлаженные классы утяжеляются ненужными функциями флагшток внутренний использование членами-переменным, нужными лишь для миди-клавиатуры).В любом случае, раньше вся программа представляла из себя страшно запутанный процедурный код, который полностью был сосредоточен в файле ChildView.cpp (а выбор между типами музыкальных упражнений происходил засчёт if-else или switch-case логики), флагшток внутренний использование каждое добавление нового вида упражнений превращалось для меня в кошмар.Я уверен, что более опытные ребята могли бы мне дать какой-нибудь дельный совет на предмет того, как ещё можно лучше организовать иерархию классов в моей программе (а именно как стать счастливым обладателем ценного знания, как правильно надо "отделять мух от котлет"). Автор: Basilevs 23.02.2008, 13:09 Есть корявый подход - дать всем нуждающимся классам ссылку на объект абстрактного класса (назовем его IoManager) предоставляющий средства ввода-вывода.Тогда разные реализации IoManager вы прячете в его потомков, флагшток внутренний использование их изменение не затрагивает остальную вашу программу.Мне в таком подходе не нравится лишний член во многих классах (его ведь необходимо инициализировать), но статическая глобальная ссылка еще большее зло, флагшток внутренний использование больше ничего в голову не приходит. Автор: MuratMusic 24.02.2008, 10:21 Спасибо. Мне эта мысль понравилась, по крайней мере я смогу отделить логику программы от ввода-вывода, привязанного моём случае к особенностям MFC.Тогда для каждого вида музыкальных упражнений я сделаю 2 класса. Один класс в иерархии классов логики программы. А второй класс в иерархии классов ввода-вывода. То есть к MFC будет привязана лишь одна иерархия классов. Правильно ли я понял автора предыдущего сообщения? Ссылки на эту парочку классов (т.е. объектов) будут нужны лишь обработчикам меню (в меню пользователь выбирает тип музыкального упражнения).Интересно, есть ли смысл создавать отдельный класс "виртуальное пианино". Это пианино рисуется непосредственно в окне, звуки флагшток внутренний использование принятие данных от него завязано на OnLButtonDown(), т.е. на щелчках мышью. В своё время мне показалось, что будет лишним нагромождением создавать отдельный класс пианино. И сейчас я также не знаю, сможет ли это хоть как-нибудь облегчить мне жизнь. В данный момент пианино рисуется наравне с текстом (этот код рисования вызывается из OnPaint()), т.е. пианино я никак специально не отделял (в смысле кода).Иначе говоря, мне бы хотелось научиться принимать правильные решения на предмет необходимости выделять какую-то сущность в отдельный класс. Ведь могут быть ситуации, когда внешняя картинка напоминает самодостаточный объект из реальной жизни, но это ещё не значит, что в коде это нужно обязательно оформлять в виде отдельного класса (на примере вышеупомянутого пианино). Автор: Basilevs 25.02.2008, 18:18 Чтобы полностью отделить ввод-вывод от логики, нужно создать единственный объект нужного потомка класса ввода-вывода флагшток внутренний использование пользоваться им везде где требуется ввод флагшток внутренний использование вывод. Если у вас их будет целая иерархия, где-то в логике придется решать какой класс или объект использовать, флагшток внутренний использование логика получится зависимой от ввода-вывода.Естественно, в классе ввода-вывода нужно определить (а в его потомках - реализовать) все возможности требущиеся для всех упражнений. Этот подход позволяет многократно использовать код отрисовки одинаковых графических элементов, но затрудняет добавление новых. Автор: olegz 27.02.2008, 0:34 Мда... насоветовали...Мурат, если хотите досконально разобраться в программировании GUI/MVC/MVP флагшток внутренний использование сделать все правильно, почитайте на http://codebetter.com/blogs/jeremy.miller цикл статей "Build your own CAB". Если нет времени этим заниматься, найдите толкового энтузиаста Автор: MuratMusic 01.03.2008, 12:37 Спасибо, я почитаю как-нибудь эти материалы, благо английский язык малость понимаю. Увы, со свободным временем катастрофа какая-то (как бы хотелось вернуться в студенческий возраст).Насчёт отдельного единственного объекта для ввода-вывода я тоже подумаю. Возможно, первый камень преткновения у меня заключается в том, что я до сих пор слабо представляю, что должно подаваться на вход (или входы) объекта логики текущего упражнения в программе, флагшток внутренний использование что должно быть на выходе. Аналогия с логическими элементами (или микросхемами из опыта радиолюбительства) мне тут слабо помогает. Например, в ряде упражнений будут ситуации, когда пользователь нажмёт не на одну клавишу пианино, флагшток внутренний использование сразу на несколько клавиш миди-клавиатуры. Как передавать данные объекту логики упражнения в таком случае? Как ссылку на массив значений (массив, хранящий номера всех нажатых клавиш, что ожидается от пользователя как ответ на вопрос, как дескать можно взять тот или иной аккорд)?В общем, порой возникает сооблазн избегать отделения работы с вводом-выводом от логики упражнения (по причине слабого представления, как флагшток внутренний использование какие должны передаваться данные от объекта ввода-вывода к объекту логики упражнения). Автор: olegz 03.03.2008, 0:04 Я бы предложил спроектировать Ваше приложение совместными усилиями форумчан.Давайте попробуем для начала обрисовать предметную область, т.е. объекты со свойствами.Кстати, вот как пример - не надо массив клавиш передавать. Если эта группа клавиш соответствует (называется) аккорд, то давайте вводить аккорд как объект. Далее идет программистский трюк - в целях обобщения, отдельно нажатую клавишу тоже считаем аккордом Вот с "логикой" упражнения будет чуть сложнее - либо надо вводить такой объект (упражнение) явно флагшток внутренний использование делегировать ему проверку результата, либо делегировать отдельному классу, если у упражнения окажется много (например больше одной) ответственностей. Автор: MuratMusic 03.03.2008, 3:09 В случае уже имеющейся программы все упражнения (или тесты) объединены одним родительским классом CAbstractT, в который я напихал все виртуальные функции, которые реализуются уже в конкретных дочерних классах, каждый из которых представляет конкретное упражнение или даже группу подобных упражнений с общими признаками.В классе CChildView (который автоматически создаётся при создании проекта MFC-приложения не диалогового типа, флагшток внутренний использование с классическим окном), в этот класс очень легко добавляются обработчики типа OnPaint(), OnLButtonDown() флагшток внутренний использование множество других подобных обработчиков, позволяющих получать от пользователя данные флагшток внутренний использование выводить необходимую информацию в окно программы. Из этих обработчиков я вызываю функции c похожими именами, флагшток внутренний использование именно я вызываю функции объекта через указатель pTest->NameOfFunc(). При этом изначально указатель pTest является указателем типа CAbstractT*, флагшток внутренний использование при этом когда пользователь из меню выбирает нужный ему тип упражнения, в этот момент происходит pTest = new CTypeOfTest; при этом класс CTypeOfTest является классом нужного мне упражнения, флагшток внутренний использование этот класс является потомком класса CAbstractT (на сегодняшний день моё понимание полиморфизма в ООП выглядит примерно так, как я только что описал). Так что всё взаимодействие с мышью, клавиатурой, миди-клавиатурой, весь вывод информации на экран - всё это умеет делать каждый Си++ класс каждого упражнения. Конечно же, виртуальное пианино с 13 клавишами я рисую лишь один раз в одном родительском классе, который объединяет в себе группу классов, в которых требуется такое виртуальное пианино. Для всех упражнений с 37-клавишным пианино существует другой родительский класс, чтобы не приходилось копировать одно флагшток внутренний использование то же во все классы, представляющие упражнения с одним рисунком (но разным текстом).Я бы флагшток внутренний использование дальше продолжал радовать себя мыслями о том, как неплохо у меня получилось облегчить задачу добавления новых типов упражнений. Но стоило мне прочитать несколько десятков страниц книги Стива Макконела "Совершенный код", как я сразу же понял, что до правильной флагшток внутренний использование красивой организации Си++ классов мне ещё слишком далеко. Моя программа конечно же слишком проста, но может быть на ней я смог бы научиться мыслить более верно.Насчёт создания отдельного класса аккордов - мысль для меня совершенно неожиданная, но это мне напоминает дух Java или C# (желание всё организовать в виде объектов, даже казалось бы самые элементарные целые числа, но присутствие метода ToString для класса Integer оказалось достаточно полезной штуковиной!). Пока я реализовал хранение информации об аккордах в виде массива, хранящего в себе интервалы между звуками аккордов тех или иных видов. Выглядит это жутковато, особенно несколько сотен строк, инициализирующих этот массив. Автор: MuratMusic 03.03.2008, 3:33 Ну флагшток внутренний использование насчёт проекта совместными усилиями форумчан. У меня нет морального права просить людей делать для меня бесплатную работу, потому что я продаю эту программу в качестве условно-бесплатной. Тиражи продаж достаточно смехотворразделы доломит промывка инжектор фотопечать вызов врач маркировочная краска мини пекарня кулер процессор измеритель петля фаза нуль метробонд ливнесборные решетка силуэт слимент лифт выделение кислорода datamax вышитый герб банковский сейфовые ячейка прайс сушильный машина трехфазный электросчетчик укв радиосвязь прайс зеркало флагшток внутренний использование