<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions
<<importTiddlers>>
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >> Sammlung von Aha Momenten, verzweifelten Suchergebnissen und Sonstigem>>
<<gradient horiz #cceedd #ffffff #cceedd >>
''[[Auf ein Panel Rendern]]'' - @@color(darkcyan):So einfach, das ich nur ca. eine Stunde brauchte um es zu finden.@@
''[[Wellenbewegungen (Sinus/Cosinus)]]'' - @@color(darkcyan):für gleichförmige Wellenbewegungen usw ideal.@@
''[[Keine gültige Gleitkommazahl]]'' - @@color(darkcyan):Nervige Fehlermeldung.@@
''[[Licht und Schatten]]'' - @@color(darkcyan):Wenns mal schattig werden soll....@@
<<<
<<gradient horiz #cceedd #bbccbb #cceedd >>
Ja, im ~DelphiGL Quickstart Tutorial wurde beiläufig erwähnt das man mit ~OpenGL (VCL) nicht nur in ein Fenster sonden eben auch in ein Panel rendern könne.
Sofort hatte ich Visionen von Programmen im Kopf, in denen kleine 3D Fenster integriert sind. Also war dies auch fast das erste wonach ich suchte, nachdem ich die [[ersten Schritte|Erste Schritte in OpenGL]] hinter mich gebracht hatte.
Scheinbar bin ich zu blöd zum Suchen, aber es dauerte mehr als eine geschlagene Stunde bis ich endlich fand wonach ich suchte:
<<<
<code delphi>
procedure TForm1.FormCreate(Sender: TObject);
begin
{------------------------------------------------------------------------------}
{                            OpenGL Initialisierung                            }
{------------------------------------------------------------------------------}

   DC:= GetDC(Panel1.handle); // mit Panel1.handle auf Panel rendern lassen
{... Rest der Initialisierung kann gleich bleiben ...}
end;
</code>
<<<
So simpel und trotzdem so schwer zu finden. Wodurch ich gemerkt habe, das ich zwar jetzt schon öfter davon gehört habe und auch eine Wage Vorstellung was es sein "müsste" aber es nicht richtig wusste was eigentlich genau ein ''[[Handle|Begriff Handle]]'' ist.
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>
!Was zum Kuckuck ist ein XXXXXXXXXX ?

@@color(darkcyan): XXXXXXXXXXX @@>>
[[Wikipedia|http://de.wikipedia.org/wiki/XXXXXX]] 


<<<
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>
!Was zum Kuckuck ist ein Handle ?

@@color(darkcyan): Mit meinen Worten würde ich sagen, das ein Handle so eine art Nummernschild für ein Objekt ist, eine eindeutige Identifikation, die sich im Verlauf einer Sitzung auch nicht ändert.
So ähnlich erklärt es auch ''[[Wikipedia|http://de.wikipedia.org/wiki/Handle]]''. @@>> 


<<<
<<<
<<gradient horiz #cceedd #ccddcc #cceedd >>
!Was zum Kuckuck ist ein Header?

@@color(darkcyan):Ein Header ist in dem von mir verwendeten Zusammenhang meist das Kurzwort für Header Datei. Der Begriff Header leitet sich aus dem englischen ab: Englisch the head =  der Kopf. Header steht allgemein für Kopfzeile oder Kopfbereich. Eine Header Datei ist eine Datei, die Deklarationen enthält, die immer wiederkehren und wird beim Programmieren in Delphi meist unter uses eingebunden.@@
<<<
<code delphi>
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, // Delphi eigene Header
  DGLOpenGL; // Aus dem Internet besorgter OpenGL Header
</code>
<<<
@@color(darkcyan):Besser kann ich es nicht erklären, genauer findet man es auf [[Wikipedia|http://de.wikipedia.org/wiki/Header]].@@>>
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>
!Was zum Kuckuck ist ein Template?

@@color(darkcyan):Template ist ein häufig verwendeter Begriff für eine Vorlage, Schablone oder eine immer gleiche Ausgangssituation. Beispielsweise gibt es sogenannte Template CAD Startmodelle, in denen bestimmte Dinge bereits vordefiniert sind, wie Dichte des Partbodies usw. Ein Template ist also eine Vorlage, von der aus man loslegt und man muß identische Definitionen nicht jedesmal neu schreiben, sondern hat sie bereits in seiner Vorlage definiert.

Wenn es immer noch nicht verstanden ist, dann stell dir vor, es gäbe kein liniertes und kein karriertes Papier auf der Welt. Nur blanke weisse Blätter. Wenn jemand nun aber ein liniertes Blatt möchte, weil es ihm beim Schreiben hilft müsste er sich erst mit einem Lineal Linien auf das Papier zeichnen. Um also nicht jedesmal bei einem Seitenumbruch zum Lineal greifen zu müssen, macht er sich Abends vorm Kamin gleich einen ganzen Stapel davon und hat somit genügend Vorlagen für die kommende Arbeit. 

Das gute an Templates in der virtuellen Welt ist, das man sie nur ein einziges mal definieren muß und unendlich oft kopieren kann, wohingegen Templates in der realen Welt irgendwann verbraucht sind und entweder neu erzeugt oder nachgekauft werden müssen.

Besser kann ich es nicht erklären, wer es noch genauer wissen will kann ja googeln oder bei [[Wikipedia|http://de.wikipedia.org/wiki/Template]] nachlesen.@@>>
<<<

<<<
@@color(darkcyan):Hat man erfolgreich eine [[Resource Datei erstellt und eingebunden|Eine Resource Datei erstellen und einbinden.]], so will man diese ja auch verwenden, sonst wäre doch die ganze Einbinderei ziemlich sinnlos gewesen.@@

[[Eine Wave Datei aus einer Resource abspielen]]
[[Ein GIF aus einer Resource Datei laden]]
<<<
!Fadenkreuz
<<gradient vert #aaccaa #ffffff #aaccaa >>
!!Zur Motivation
Die Idee zum Fadenkreuz habe ich bekommen als ich merkte, dass ich auf großen Bildschirmen (26 Zoll ist ja jetzt "in") bei Excel Tabellen gerne mal in der Zeile verutsche und Werte falsch ablese.
Ausserdem habe ich es mir beim Anordnen von Text und Bild in Powerpoint schon häufiger gewünscht die Dinge sauberer ausrichten zu können.

!!Zur Funktion

Das Fadenkreuz ist ein einfaches Programm und erklärt sich eigentlich von selbst. Mit den Reglern lassen sich die Breiten der Horizontalen und der Vertikalen einstellen, sowie die Transparenz - wenn beispielsweise der horizontale Balken als Lesehilfe genutzt werden soll.

!!Screenshots
[img(60px+,)[Bild1|http://file1.npage.de/003341/04/bilder/fadenkreuz_bild2.jpg][http://file1.npage.de/003341/04/bilder/fadenkreuz_bild2.jpg]] [img(60px+,)[Bild1|http://file1.npage.de/003341/04/bilder/fadenkreuz_bild_3.jpg][http://file1.npage.de/003341/04/bilder/fadenkreuz_bild_3.jpg]]
!![[Downloaden|http://file1.npage.de/003341/04/download/cross1.exe]]
<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Plugin","twversion":"--","category":"Searching and indexing tiddlers","description":"This plugin creates an area at the top of the tiddler area that displays \"breadcrumbs\" of where you've been. This is especially useful forTWs using SinglePageMode by Eric Schulman. Original author Alan Hecht."}</data>
Background: #FFFFFF
Foreground: #000
PrimaryPale: #FF8C69
PrimaryLight: #FF8C69
PrimaryMid: #8B4C39
PrimaryDark: #410
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #FFD39B
TertiaryLight: #EEC591
TertiaryMid: #CDAA7D
TertiaryDark: #8B7355 
You can change the colors by clicking on the ColorPalette tiddler and using html color codes to adjust the colors of different sections of the file. Click on [[ColorPalette color designations]] to see which parts of the ColorPalette affect which parts of the screen.

(To let you test it out I made [[a few sample color schemes|ColorSchemes]] for you. Copy and paste each one in the ColorPalette tiddler to see if you like it. If you want the current color scheme back, copy and paste the 'lilac' color scheme into the ColorPalette.)

For my two favorite tools for picking colors, see these tiddlers:

[[4096 Color wheel]]
[[Coloria color names]]

The EditTemplate controls the look of tiddlers when they are in editing mode. Below is the code for the EditTemplate for a standard ~TiddlyWiki. Each div class is an element of the tiddler that can be removed. Do you prefer the tag window above the text window in edit mode like I have in this tutorial? Just slide the line that says: 

<!--{{{-->
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->

Above the line that says:
<!--{{{-->
<div class='editor' macro='edit text'></div>
<!--}}}-->

''Here is the full EditTemplate code:''
!The toolbar
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>
!The tiddler title
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
!The text
<div class='editor' macro='edit text'></div>
!The tags
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>

The ViewTemplate controls the look of tiddlers when they are in viewing mode. Below is the code for the ViewTemplate. Each div class is an element of the tiddler that can be removed. Don't like seeing those pesky 'tagging' and 'tagged' boxes on your tiddlers? Neither do I. All my ~TWs have those boxes eliminated from the ViewTemplate. 

<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
Background: #ddeedd
Foreground: #000
PrimaryPale: #cceecc
PrimaryLight: #ddffdd
PrimaryMid: #002200
PrimaryDark: #331166
SecondaryPale: #ccddcc
SecondaryLight: #aaddcc
SecondaryMid: #66aa66
SecondaryDark: #114422
TertiaryPale: #cceecc
TertiaryLight: #bbccbb
TertiaryMid: #99aa99
TertiaryDark: #779988
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>

Mit TFileStream lassen sich ganz lustige Sachen machen... zum Beispiel große Datenfelder oder Listen in einer Datei zusammengefasst speichern.

Hier ein Beispiel, wie ich eine Flut von Bildern mit TFileStream auf Platte schiebe.

<code delphi>
procedure TForm10.Button2Click(Sender: TObject);
 var
  DC:HDC;
  screenshot: TBitmap;
  jpg:tjpegimage;
  strom:tfilestream;

  start : Cardinal;
  dauer : Cardinal;
  laengster:integer;
  laengste:integer;

  i:integer;

const
  CAPTUREBLT = $40000000;
begin

strom:=tfilestream.Create('f:\bilder\test.dat',fmcreate or fmsharedenynone); //mein Datenstrom auf platte

for i := 0 to  sqzz -1  do   // na dann renn mal los.
begin
jpg:=tjpegimage.Create;
start := GetTickCount();   //Zeitnahme
DC := GetDC (GetDesktopWindow) ;
try
  screenshot := TBitmap.Create;
//  screenshot.Width := screen.width;    // nur die harten,
//  screenshot.Height:= screen.height;   // kommen in den garten...

  screenshot.Width:=600;       // später dann nur noch so in etwa...
  screenshot.height:=400;

  screenshot.PixelFormat := pf16bit;
finally
        BitBlt(screenshot.Canvas.Handle, 0, 0, screenshot.Width, screenshot.Height, DC,
        0,0, SRCCOPY or CAPTUREBLT);
        try
//        jpg.assign(screenshot);
//        jpg.savetostream(strom);      //aha für 200kb JPG brauchst du also 200MS
        screenshot.SaveToStream(Strom); //und für 4000kb BMP nur 80MS... MACHT JA SINN!!!!!! GRRRRRRRR
        sizeremember[i]:=strom.size; //merken wie groß das file war...
        finally             // aufräumen
          DeleteDC(DC);
          screenshot.Free;    //  bmp.und-tschüss
          screenshot:=NIL;
          jpg.free;
          jpg:=NIL;
      end;
  end;
  dauer  := GetTickCount() - start;    //Zeitnahme Stopp
  panel1.Caption:=('Bild '+inttostr(i+1)+' zu speichern hat '+inttostr(dauer)+'ms gedauert');
  panel4.Caption:=('Am längsten hat bisher Bild '+inttostr(laengster)+' mit '+inttostr(laengste)+'ms gedauert');
  application.processmessages;
  if dauer > laengste then
  begin
    laengste:=dauer;
    laengster:=i;
  end;
end;
  try
inc(i);  // und weiter gehts...
  finally


end;
strom.free;
dauer:=0;
i:=0;
laengster:=0;
laengste:=0;
end;

</code>
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>
Mit TMemoryStream kann man Daten im Memory speichern um beispielsweise nach einem BitBlt das elende BMP loszuwerden. 

siehe Beispielcode:
<code delphi>
procedure TForm10.Button11Click(Sender: TObject);
 var
  ms:tmemorystream;
  {...}
begin
ms:=tmemorystream.create;
{...}
        try
        jpg.assign(bmp);
        finally
          deleteobject(bmp.handle);
          bmp.Free;    //  bmp.und-tschüss
          bmp:=NIL;
        end;
        try
         jpg.SaveToStream(ms);
        finally
         jpg.free;
         jpg:=NIL;
        end;
         ms.position:=0; // wichtig, sonst steht der 
                       // Lesegnom eventuell am Ende von (ms)
                       // und man liest Müll ein.
         try
         jpg2.loadfromstream(ms);
         finally
         ms.free;
         end;
         try
         fJpeglist.add(jpg2);
{...}
</code>
im Beispiel geht es darum, das bmp.free und so weiter erst real Wirkung zeigen (Taskmanager) wenn das jpg in einen Memorystream gespeichert und vernichtet wurde. Danach kann man die Daten dann als jpg laden.
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>

Ein Save Dialog sieht professionell aus und ist besser als im code irgendwohin zu Speichern, wie ich das zum Teil bei testsaves gemacht habe:
<code delphi>
try
gif.SaveToFile('c:\testgif\test3.gif');
except
gif.SaveToFile('d:\testgif\test.gif');
end;
</code>
ist also übelst schlechter Stil.
Aber wie geht das nun mit dem Save Dialog?
Eine Lösung die ich elegant finde ist, einfach eine kleine procedure dafür zu schreiben:
<code delphi>
  procedure tform10.saveasgif(sender:TObject);
var SaveDlg : TSaveDialog;
  begin
    SaveDlg := TSaveDialog.Create(Self);
  if SaveDlg.Execute then
  begin
    gif.SaveToFile(SaveDlg.FileName+'.gif');
  end;
    SaveDlg.Free;
  end;
</code>
und diese dann zum Beispiel mit einem Button aufzurufen:
<code delphi>
procedure TForm10.Button2Click(Sender: TObject);
begin
form10.saveasgif(nil);
end;
</code>
[[Wo bin ich?!]]
!<<gradient vert #aaeeaa #ffffff #cceeaa >>Delphi Codeschnipsel zu den Themen>>
<<gradient vert #cceedd #ffffff #cceedd >>
!![[Grafik|Delphi Grafik]]
*[[GIF Animationen]]
**[[Eine Gif Datei laden und abspielen]]
**[[Eine Gif Animation stoppen]]
**[[Ein GIF aus einer Resource Datei laden]]
*[[Grafik aus der Zwischenablage laden und anzeigen lassen]]
*[[Grafik in Zwischenablage speichern]]
*[[Grafik von Festplatte laden (OpenPictureDialog)]]
*[[Screenshot]]
**[[Einen Screenshot so machen, das alpha geblendete Fenster mit drauf sind]]
*[[SystemIcon Anzeigen]]
*[[Farbverläufe]]
>>
<<gradient vert #cceedd #ffffff #cceedd >>
!![[Sound|Delphi Sound]]
*Sprachausgabe
**[[Delphi Sprachausgabe (englisch)]]
*[[Eine Wave Datei aus einer Resource abspielen]]
*[[Sound aufnehmen]]
*[[Sound abspielen mit TMediaPlayer]]
>>
<<gradient vert #cceedd #ffffff #cceedd >>
!![[Komponenten|Delphi Komponenten]]
*Original Delphi Komponenten
**[[TTimer|Delphi Timer]]
**[[TForm|Fenster]]
***[[Fenster Größe]]
***[[Fenster Position]]
***@@color(green):[[coming soon]]: [[Fenster im Fenster, das MID System]]@@
*Externe Komponenten
>>
<<gradient vert #cceedd #ffffff #cceedd >>
!!Eingabegeräte
*[[Maus|Delphi Maus]]
**[[Mausposition abfragen|Maus Position abfragen]]
**[[Maus Cursor wechseln]] (Windows Mauscursor nutzen)
**@@color(green):[[coming soon]]: [[Maus Cursor wechseln|Delphi eigenen Mauscursor einbinden]] (Eigenen Mauscursor einbinden)@@
*[[Tastatur|Delphi Tastatur]]
**[[Einen Tastendruck simulieren]]
>>
<<gradient vert #cceedd #ffffff #cceedd >>
!!Ausgabegeräte
*[[USB Experiment Interface Board]]
>>
<<gradient vert #cceedd #ffffff #cceedd >>
!!Daten und Dateioperationen
*[[Resource Files]]
*[[Daten im Memory speichern mit TMemoryStream]]
*[[Daten auf Platte speichern mit TFileStream]]
*[[Daten via Dialog speichern mit TSaveDlg]]
*[[Sortierverfahren]]
>>
<<gradient vert #cceedd #ffffff #cceedd >>
!!Kommunikation und Interaktion
*[[Einen Link auf eine URL|Link auf URL]](Web Browser starten lassen)
*[[Eine Messagebox mit Checkbox]]
>>
<<gradient vert #cceedd #ffffff #cceedd >>
!!Anwendungen und Prozesse
*[[Die eigene Anwendung beenden]]
*[[Prozessdauer ermitteln]]
>>
<<gradient vert #cceedd #ffffff #cceedd >>
!!Mathematik
*[[Den Ganzzahlanteil einer Zahl ermitteln und als Integer zurückgeben]];
*[[Der Betrag einer Zahl]] (Vorzeichen ignorieren)
*[[Umrechnung von Rad in Deg]] (Winkelfunktionen)
*[[Winkel zwischen zwei Vektoren]] 
>>
<<gradient vert #ddccaa #ffffff #ddccaa >>
!![[Offene Fragen, ungeklärtes|Delphi ungeklärt]]
*[[ungeklärte Themen|Delphi ungeklärt]]

>>
Type the text for 'Delphi Grafik'
Type the text for 'Delphi Komponenten'
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>
@@color(darkcyan):Funktionen für die Maus:@@
*[[Position abfragen|Maus Position abfragen]]
*[[Maus Cursor wechseln]]
>>
<<<
!<<gradient vert #aaeeaa #ffffff #cceeaa >>Eigene Delphi Projekte und Programme>>
<<gradient vert #aaccaa #ffffff #aaccaa >>
!!Abgeschlossene Projekte
<<<
| Fadenkreuz | [[Download|http://file1.npage.de/003341/04/download/cross1.exe]] | [[Beschreibung|Beschreibung Fadenkreuz]] | [img(30px+,)[Bild1|http://file1.npage.de/003341/04/bilder/fadenkreuz_bild2.jpg][http://file1.npage.de/003341/04/bilder/fadenkreuz_bild2.jpg]] |
<<<
!!Projekte in Arbeit
<<<
| Wasserzeichen | [[Download|Kein Download]] | Beschreibung |
<<<
!!Kleinstprojekte
*Window Name Grabber
*Pipettinator
Type the text for 'Delphi Sound'
<<<
<<gradient horiz #cceedd #ccddcc #cceedd >>@@color(darkcyan):Für eine englische Sprachausgabe kann man dieses Beispiel verwenden. Möchte man Zahlen einzeln ausgeben, muss jeweils ein Leerzeichen eingefügt sein.


Zunächst, wie so oft einen speziellen [[Header|Begriff Header]] für die Sprachausgabe unter uses einbinden.
<code delphi>
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,  StdCtrls,
  Comobj; // Für die Sprachausgabe
</code>
Danach kann der Code dann ungefähr so aussehen:
<code delphi>
procedure TForm1.Button1Click(Sender: TObject); 
var 
  voice: OLEVariant; 
begin 
  voice := CreateOLEObject('SAPI.SpVoice'); 
  voice.Speak('Hello 1 2 3!', 0); 
end;
</code>
<<gradient vert #cceedd #ffffff #cceedd >>
[[Ungeklärt]]:
Bei der Sprachausgabe in diesem Beispiel wird der jeweils auszugebende Text im Rahmen des Forms angezeigt und verschwindet danach auch nicht. 
a) [[Wie lässt sich das verhindern?|Ungeklärt Wie kann man verhindern das bei Sprachausgabe die Caption des Forms geändert wird?]] 
b) [[Wie geht deutsche Sprachausgabe?|Ungeklärt Wie geht deutsche Sprachausgabe]]
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Was ist ein Timer in Delphi?>>
Ein Timer ist in DELPHI eine Komponente und man findet sie bei den Systemkomponenten. Unter seinen Objekteigenschaften hat ein Delphi Timer ein Interval, das beliebig *) gesetzt werden kann und welches bestimmt nach wievielen Millisekunden das Timer Ereignis ~OnTimer ausgelöst wird. 

~~*)Aus diveresen Foren kann man entnehmen, das Werte unter 25 vom Windows - Standardtimer nicht mehr korrekt abgebildet werden. Wobei die Angaben wo diese Untergrenze liegt, je nach Forum unterschiedlich ausfallen.~~

<<<
Type the text for 'Delphi eigenen Mauscursor einbinden'
[[Ungeklärt Wie geht deutsche Sprachausgabe]]
[[Ungeklärt Wie kann man verhindern das bei Sprachausgabe die Caption des Forms geändert wird?]]
<<<
Möchte man den Ganzzahlanteil einer Zahl in int zurückgeben, kann man trunc und round verwenden.

Beispiel:

<code delphi>
procedure TForm1.Button1Click(Sender: TObject);
var zahl2:real;
var ergebnis2:integer;
var ergebnis3:integer;
begin
Zahl2:=(1.75);
Ergebnis2:= round(Zahl2);
Ergebnis3:= trunc(Zahl2);
label1.Caption:='gerundet ' + inttostr(ergebnis2);
label2.caption:='abgeschnitten ' + inttostr(ergebnis3);
label3.caption:='unverändert ' + floattostr(zahl2);
end;
</code>
Dabei kommt dann raus:

[img[http://file1.npage.de/003341/04/bilder/delphi_ganzzahlanteil.jpg]]
<<<
Den Betrag einer Zahl (Beispiel: |-4| = 4 ) bekommt man in Delphi mit der Funktion abs();
<code delphi>
procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;
</code>
!<<gradient vert #aaeeaa #ffffff #cceeaa >>Drittkomponenten>>
<<gradient vert #cceedd #ffffff #cceedd >>

Drittkomponenten sind, wie der Name schon sagt, programmierte Komponenten, die man in seinen Projekten verwenden kann.
Leider hat Borland mit Turbo Delphi dem Privatuser die Möglichkeit genommen, diese in die IDE zu integrieren.

Das kann schon ganz schön frustrierend wirken, wenn man genau weiss, das in früheren Delphi Versionen diese Möglichkeit besteht man aber dort wiederum auf andere tolle Eigenschaften der IDE verzichten muß.

Einige auf dem Delphi Praxis Forum schreiben nun, das man trotzdem jede Komponente fast genausogut verwenden kann indem man sie eben zur Laufzeit erzeugt.

Wie das funktioniert wird hier am Beispiel der Komponente CoolTrayIcon zusammengefasst:

1.) [[Komponente Bereitstellen]]
2.) [[Komponente im Projekt einbinden]]
3.) [[Instanz der Klasse erzeugen]]

''horizontal:''
{{{
* menu #1
** [[item #1-1]]
** [[item #1-2]]
** [[item #1-3]]
* menu #2
** [[item #2-1]]
** [[item #2-2]]
** [[menu #2-3]]
* menu #3
** [[item #2-1]]
** [[item #2-2]]
** [[menu #2-3]]
<<dropMenu>>
}}}
* menu #1
** [[item #1-1]]
** [[item #1-2]]
** [[item #1-3]]
* menu #2
** [[item #2-1]]
** [[item #2-2]]
** [[menu #2-3]]
* menu #3
** [[item #2-1]]
** [[item #2-2]]
** [[menu #2-3]]
<<dropMenu>>

''vertical:''
{{{
* menu #1
** [[item #1-1]]
** [[item #1-2]]
** [[item #1-3]]
* menu #2
** [[item #2-1]]
** [[item #2-2]]
** [[menu #2-3]]
<<dropMenu vertical>>
}}}

* menu #1
** [[item #1-1]]
** [[item #1-2]]
** [[item #1-3]]
* menu #2
** [[item #2-1]]
** [[item #2-2]]
** [[menu #2-3]]
<<dropMenu vertical>>


/% %/
/***
|''Name:''|DropDownMenuPlugin|
|''Description:''|Create dropdown menus from unordered lists|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#DropDownMenuPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.1|
|''Date:''|11/04/2007|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.5|

!!Usage:
* create a two-level unordered list using wiki syntax, and place {{{<<dropMenu>>}}} on the line after it.
* to create a vertical menu use {{{<<dropMenu vertical>>}}} instead.
* to assign custom classes to the list, just pass them as parameters to the macro {{{<<dropMenu className1 className2 className3>>}}}

!!Features:
*Supports just a single level of drop-downs, as anything more usually provides a poor experience for the user.
* Very light weight, about 1.5kb of JavaScript and 4kb of CSS.
* Comes with two built in css 'themes', the default horizontal and vertical. 

!!Customizing:
* to customize the appearance of the menu's, you can either add a custom class as described above or, you can edit the CSS via the StyleSheetDropDownMenu shadow tiddler.

!!Examples:
* [[DropDownMenuDemo]]

***/
// /%
//!BEGIN-PLUGIN-CODE
config.macros.dropMenu={

	dropdownchar: "\u25bc",

	handler : function(place,macroName,params,wikifier,paramString,tiddler){
		list = findRelated(place.lastChild,"UL","tagName","previousSibling");
		if (!list)
			return;
		addClass(list,"suckerfish");
		if (params.length){
			addClass(list,paramString);
		}
		this.fixLinks(list);
	},
	
	fixLinks : function(el){
		var els = el.getElementsByTagName("li");
		for(var i = 0; i < els.length; i++) {
			if(els[i].getElementsByTagName("ul").length>0){
				var link = findRelated(els[i].firstChild,"A","tagName","nextSibling");
				if(!link){
					var ih = els[i].firstChild.data;
					els[i].removeChild(els[i].firstChild);
					var d = createTiddlyElement(null,"a",null,null,ih+this.dropdownchar,{href:"javascript:;"});
					els[i].insertBefore(d,els[i].firstChild);
				}
				else{
					link.firstChild.data = link.firstChild.data + this.dropdownchar;
					removeClass(link,"tiddlyLinkNonExisting");
				}
			}
			els[i].onmouseover = function() {
				addClass(this, "sfhover");
			};
			els[i].onmouseout = function() {
				removeClass(this, "sfhover");
			};
		}
	}	
};

config.shadowTiddlers["StyleSheetDropDownMenuPlugin"] = 
	 "/*{{{*/\n"+
	 "/***** LAYOUT STYLES -  DO NOT EDIT! *****/\n"+
	 "ul.suckerfish, ul.suckerfish ul {\n"+
	 "	margin: 0;\n"+
	 "	padding: 0;\n"+
	 "	list-style: none;\n"+
	 "	line-height:1.4em;\n"+
	 "}\n\n"+
	 "ul.suckerfish  li {\n"+
	 "	display: inline-block; \n"+
	 "	display: block;\n"+
	 "	float: left; \n"+
	 "}\n\n"+
	 "ul.suckerfish li ul {\n"+
	 "	position: absolute;\n"+
	 "	left: -999em;\n"+
	 "}\n\n"+
	 "ul.suckerfish li:hover ul, ul.suckerfish li.sfhover ul {\n"+
	 "	left: auto;\n"+
	 "}\n\n"+
	 "ul.suckerfish ul li {\n"+
	 "	float: none;\n"+
	 "	border-right: 0;\n"+
	 "	border-left:0;\n"+
	 "}\n\n"+
	 "ul.suckerfish a, ul.suckerfish a:hover {\n"+
	 "	display: block;\n"+
	 "}\n\n"+
	 "ul.suckerfish li a.tiddlyLink, ul.suckerfish li a, #mainMenu ul.suckerfish li a {font-weight:bold;}\n"+
	 "/**** END LAYOUT STYLES *****/\n"+
	 "\n\n"+
	 "/**** COLORS AND APPEARANCE - DEFAULT *****/\n"+
	 "ul.suckerfish li a {\n"+
	 "	padding: 0.5em 1.5em;\n"+
	 "	color: #FFF;\n"+
	 "	background: #0066aa;\n"+
	 "	border-bottom: 0;\n"+
	 "	font-weight:bold;\n"+
	 "}\n\n"+
	 "ul.suckerfish li:hover a, ul.suckerfish li.sfhover a{\n"+
	 "	background: #00558F;\n"+
	 "}\n\n"+
	 "ul.suckerfish li:hover ul a, ul.suckerfish li.sfhover ul a{\n"+
	 "	color: #000;\n"+
	 "	background: #eff3fa;\n"+
	 "	border-top:1px solid #FFF;\n"+
	 "}\n\n"+
	 "ul.suckerfish ul li a:hover {\n"+
	 "	background: #e0e8f5;\n"+
	 "}\n\n"+
	 "ul.suckerfish li a{\n"+
	 "	width:9em;\n"+
	 "}\n\n"+
	 "ul.suckerfish ul li a, ul.suckerfish ul li a:hover{\n"+
	 "	display:inline-block;\n"+
	 "	width:9em;\n"+
	 "}\n\n"+
	 "ul.suckerfish li {\n"+
	 "	border-left: 1px solid #00558F;\n"+
	 "}\n"+
	 "/***** END COLORS AND APPEARANCE - DEFAULT *****/\n"+
	 "\n\n"+
	 "/***** LAYOUT AND APPEARANCE: VERTICAL *****/\n"+
	 "ul.suckerfish.vertical li{\n"+
	 "	width:10em;\n"+
	 "	border-left: 0px solid #00558f;\n"+
	 "}\n\n"+
	 "ul.suckerfish.vertical ul li, ul.suckerfish.vertical li a, ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a {\n"+
	 "	border-left: 0.8em solid #00558f;\n"+
	 "}\n\n"+
	 "ul.suckerfish.vertical li a, ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a,  ul.suckerfish.vertical li.sfhover a:hover{\n"+
	 "	width:8em;\n"+
	 "}\n\n"+
	 "ul.suckerfish.vertical {\n"+
	 "	width:10em; text-align:left;\n"+
	 "	float:left;\n"+
	 "}\n\n"+
	 "ul.suckerfish.vertical li a {\n"+
	 "	padding: 0.5em 1em 0.5em 1em;\n"+
	 "	border-top:1px solid  #fff;\n"+
	 "}\n\n"+
	 "ul.suckerfish.vertical, ul.suckerfish.vertical ul {\n"+
	 "	line-height:1.4em;\n"+
	 "}\n\n"+
	 "ul.suckerfish.vertical li:hover ul, ul.suckerfish.vertical li.sfhover ul { \n"+
	 "	margin: -2.4em 0 0 10.9em;\n"+
	 "}\n\n"+
	 "ul.suckerfish.vertical li:hover ul li a, ul.suckerfish.vertical li.sfhover ul li a {\n"+
	 "	border: 0px solid #FFF;\n"+
	 "}\n\n"+
	 "ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a{\n"+
	 "	padding-right:1.1em;\n"+
	 "}\n\n"+
	 "ul.suckerfish.vertical li:hover ul li, ul.suckerfish.vertical li.sfhover ul li {\n"+
	 "	border-bottom:1px solid  #fff;\n"+
	 "}\n\n"+
	 "/***** END LAYOUT AND APPEARANCE: VERTICAL *****/\n"+
	 "/*}}}*/";
store.addNotification("StyleSheetDropDownMenuPlugin",refreshStyles);
//!END-PLUGIN-CODE
// %/
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>
Ein GIF lädt man wie folgt aus einer Resource Datei:

>> 
<code Delphi>
  try
    imagegif.LoadFromResourceName( hinstance, 'animation' );
    imagegif.Animate;
    form6.image1.picture.Assign(imagegif);
  finally
    imagegif.Free;
    form6.show;
  end;
</code>
<<gradient horiz #cceedd #ffffff #cceedd >>
Natürlich muß vorher das ganze auch in der [[Resource eingebunden|Eine Resource Datei erstellen und einbinden.]] werden.
Ausserdem braucht man für dieses Beispiel einen speziellen [[Header|Begriff Header]] für GIF's.
Siehe auch: [[GIF Animationen]]>>
<<<
@@color(green)://Hat man eine Animation gestartet und will sie wieder stoppen hat man das Problem, das sich das ~TImage das man assigned hat leider nicht mit .Animate ansprechen lässt. Deswegen habe ich mir hier folgende Krücke gebastelt//@@

<code delphi>
procedure TForm1.Button2Click(Sender: TObject);
var pic1: TGifImage;
begin
 pic1 := TGifImage.Create;
 pic1.Assign(image1.picture.graphic);//Wichtig das Graphic
 pic1.Animate:=false;
 image1.picture.assign(pic1);
 pic1.Free;

end;

end.
</code>
@@color(green)://Bei diesem Beispiel wird die Animation aufs erste Bild zurückgesetzt, egal wo sie zum Zeitpunkt des Stopps stand.//@@
<<<
@@color(darkcyan):So, man hat also ein schönes GIF gebastelt und möchte dies nun in seinem Programm auf ein Ereignis hin ablaufen lassen. Zur Vorbereitung benötigen wir ein ~TImage Feld auf dem Formular und für das Beispiel hier einen Button. 

Zunächst muß ~GifImage unter ''uses'' eingebunden sein, sonst geht garnix:@@

<code delphi>
interface

uses
  Windows, ...usw usw... , GifImage;
</code>
@@color(darkcyan):Danach muß das Bild geladen werden und mit Assign wird ~TImage beigebracht das es jetzt ein GIF ist.@@
<code delphi>
procedure TForm1.Button1Click(Sender: TObject);
var pic1 :Tgifimage;

begin

 pic1 := TGifImage.Create;
 try
  pic1.LoadFromFile('17.gif');
  image1.Picture.Assign(pic1);
 finally
  pic1.Free;

 end;
end;
</code>
Will man eine Messagebox mit Checkbox

[img[MessageBox mit Checkbox|http://file1.npage.de/003341/04/bilder/messagebox_checkbox.jpg]]

so kann man diesen Code verwenden:
<code delphi>
PROCEDURE TForm1.Button1Click(Sender: TObject);
VAR
  AMsgDialog                  : TForm;
  ACheckBox                   : TCheckBox;
BEGIN
  AMsgDialog := CreateMessageDialog('This is a test message.', mtWarning, [mbYes, mbNo]);
  ACheckBox := TCheckBox.Create(AMsgDialog);
  WITH AMsgDialog DO
    TRY
      Caption := 'Dialog Title';
      Height := 169;
      WITH ACheckBox DO
        BEGIN
          Parent := AMsgDialog;
          Caption := 'Don''t show me again.';
          width := 120;
          top := 110;
          Left := 8;
        END;

      CASE ShowModal OF
        ID_YES: ;                                      //your code here after dialog closed
        ID_NO: ;
      END;
      IF ACheckBox.Checked THEN
        BEGIN
      //...
        END;
    FINALLY
      ACheckBox.Free;
      Free;
    END;

END;
</code>
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>

''Eine Resource Datei erstellen in einzelnen Schritten''

''1.)'' Dateien in einem eigenen Ordner zusammenkopieren.
''2.)'' Mit einem Editor oder Textprogramm eine .txt Datei erstellen mit folgendem Inhalt:
<<<
''~ResourcenName ~ResourcenTyp ~DateiName''
<<<
Beispiel:
<<<
''Heuler WAVE howl.wav''
<<<
@@color(darkcyan):Wobei ''~ResourcenName'' bzw. ''Heuler'' der Name ist, mit dem die eingebettete Datei später im eigentlichen Code aufgerufen werden kann. Wohingegen mit ''Dateiname'', bzw ''howl.wav'' der Name der ursprünglichen Datei gemeint ist, also im Beispiel eine .wav Datei mit Wolfsgeheul.@@

''3.)'' txt Datei abspeichern im selben Ordner, in dem zuvor die Resource Dateien hineinkopiert wurden.
''4.)'' Jetzt mit Start -> Ausführen -> cmd ein DOS Fenster öffnen und dort in den entsprechenden Resource Ordner wechseln. (cd c:\Eigene... usw) Ist man dort angelangt, so ist folgendes einzugeben:
<<<
''~BRC32 -r datei.txt''
<<<
@@color(darkcyan):Wobei natürlich ''datei.txt'' durch den vorher gewählten Namen der txt Datei zu ersetzen ist. 
Hat man alles richtig gemacht, wird eine Datei erzeugt mit dem Namen ''Datei.RES''. Welche man sich nun in sein eigentliches Projektverzeichnis des Programms kopiert, in das die Resource eingebunden werden soll.@@

''5.)'' Das eigentliche Einbinden geschieht recht unspektakulär unter implementation und sieht wie folgt aus:>>
<code delphi>
implementation
 
{$R *.dfm} //Diese Zeile stehen lassen!
{$R Datei.RES} //eingebundene Resource Datei
</code>
<<<
''Eine Wave Datei aus einer Resource abspielen''
@@color(green)://
Im Beispiel geht es darum eine Wave Datei abzuspielen, die zuvor als [[Resource eingebunden|Eine Resource Datei erstellen und einbinden.]] wurde. Zunächst muß ''~MMSystem'' unter ''uses'' eingebunden sein://
<code delphi>
interface

uses
  Windows, ... usw usw ..., MMSystem;
</code>
// Danach kann die Wave Datei auf zwei Arten abgespielt werden://
<code delphi>
PlaySound(PChar('Heulen'), hInstance, SND_RESOURCE);
</code>
//Hierbei wird das Programm für die Dauer des Sounds angehalten.
oder://
<code delphi>
PlaySound(PChar('Heulen'), hInstance, SND_RESOURCE or SND_ASYNC);
</code>
//Hierbei läuft das Programm weiter und der Sound spielt im Hintergrund.//
Hiernach habe ich wochenlang gesucht und letztlich wurde mir die Lösung von einem Profi auf Delphipraxis.net gesagt:

<code delphi>

const 
  CAPTUREBLT = $40000000; 

DC := GetWindowDC(0); 
try 
  BitBlt(BackBuf.Canvas.Handle, 0, 0, BackBuf.Width, BackBuf.Height, 
                                                 DC, 0, 0, SRCCOPY or CAPTUREBLT); 
finally 
  ReleaseDC(0, DC); 
end;

</code>
Um bei Druck auf einen Button einen Tastendruck zu simulieren habe ich folgendes gefunden:

<code delphi>
procedure TForm1.Button1Click(Sender: TObject);
begin
keybd_event( vk_snapshot, MapVirtualKey( vk_snapshot, 0 ), 0, 0 );
keybd_event( vk_snapshot, MapVirtualKey( vk_snapshot, 0 ), KEYEVENTF_KEYUP, 0 );
end;
</code>

Dabei ist unschwer zu erkennen, das hier die Druckentaste simuliert werden soll, um einen Screenshot vom gesamten Bildschirm zu machen.
Man kann so auch andere Tasten simulieren.
<<<

<code delphi>
procedure TForm1.ErrorHandler;
begin
  Form1.Caption := gluErrorString(glGetError);
end;
</code>
<<<
<<<

!<<gradient vert #aaccbb #ffffff #aaccbb >>~OpenGL, 3D! Ja ich will! Aber wie?>>
<<gradient horiz #cceedd #ffffff #cceedd >>
@@color(darkcyan):Laut dem Quickstart Tutorial auf ''[[DelphiGL|http://www.delphigl.com/index.php]]'' benötigt man für den Start in ~OpenGL lediglich 2 Dinge:@@
# @@color(darkcyan):Einen ''[[OpenGL Header]]''.@@
# @@color(darkcyan):Ein sogenanntes ''[[OpenGL Template]]'', von dem aus man starten kann.@@>>
!@@color(darkcyan):Interessante externe Links nach Themenblöcken.@@
<<<
!!@@color(darkcyan):Delphi@@

*''[[Tech-Ecke|http://tech-ecke.de]]'' @@color(green)://Birgers Homepage mit echt guten Tipps und ~Code-Schnipseln.//@@
*''[[Ein Delphi 5 Entwicklerhandbuch im PDF Format|http://mwilhelm.hs-harz.de/scripte/delphi/Delphi5_Entwicklerhandbuch.pdf]]'' @@color(green)://Umfangreiches Entwicklerhandbuch, interessant gegliedert.//@@
*''[[Free Delphi Programming|http://www.freebyte.com/programming/delphi/]]'' @@color(green):// interessante Seite mit Infos zu Delphi//@@
*''[[VCL_Components|http://www.vclcomponents.com/s/0__/select_checkbox_in_datagrid_messagebox]]''@@color(green):// Englische Seite mit Komponenten für Delphi und andere Sprachen//@@
*''[[DelphiPraxis|http://www.delphipraxis.net]]''@@color(green):// Deutsches Delphi Forum mit vielen tollen Beispielen!//@@
*''[[Delphi Einsteigerforum|http://www.computerbase.de/forum/forumdisplay.php?f=39]]''@@color(green):// deutsches Programmierforum auch für Einsteiger.//@@
*''[[Delphi Dabbler|http://www.delphidabbler.com/software/cbview]]''@@color(green):// englische Seite mit vielen Komponenten (nicht gerade Einsteigertauglich)//@@

!!@@color(darkcyan):Open GL@@

*''[[DelphiGL|http://www.delphigl.com/index2.php]]'' @@color(green):// Delphi ~OpenGL Community, mit vielen Tutorials, Downloads, gutem Forum rund um ~OpenGL in Delphi.//@@
*''[[Sulaco OpenGL Projects|http://www.sulaco.co.za/opengl.htm]]''@@color(green):// Delphi ~OpenGL Demos, inclusive gut kommentiertem Source Code. Sehr beeindruckend.//@@
*''[[Nitrogen OpenGL Projects|http://www.nitrogen.za.org/projectlist.asp?cat=dogl]]''@@color(green):// Delphi ~OpenGL Demos, inclusive Source Codes.//@@
*''[[Nehe|http://nehe.gamedev.net/]]''@@color(green):// Open GL Tutorials auf einer professionellen Game developement Seite. Hier scheint Saluco zu seiner Zeit gelernt zu haben.//@@


*''[[Umfangreiche Seite rund um 3D|http://www.3dlinks.com/oldsite/tutorials_zbrush.cfm]]''@@color(green):// Nicht unbedingt direkt ~OpenGL aber rund um 3D gibts hier jede Menge Infos//@@

!!@@color(darkcyan):~TiddlyWiki@@
*''[[VisualTW|http://visualtw.ouvaton.org/VisualTW.html]]'' @@color(green)://Gute Seite mit interessanten Plugins//@@
*''[[TiddlyWiki for the Rest of us|http://www.giffmex.org/twfortherestofus.html]]'' @@color(green)://Gute Seite mit super Tipps zum Style ändern von Tiddly Wiki und vielem mehr.//@@
*''[[TiddlyWiki-Cheat-Sheet|http://jamwiki.org/files/2007/8/tiddlywiki_cheatsheet-22040121.pdf]]'' @@color(green):// Hilfreiches Sheet mit Befehlen für die ''~TiddlyWiki'' Formatierung.//@@
*''[[TiddlyWiki-Tutorial|http://www.blogjones.com/TiddlyWikiTutorial.html]]''@@color(green):// Richtig gute ~TiddlyWiki Seite für Einsteiger, alles leicht erklärt... wenn ich die nur früher gehabt hätte!//@@
*''[[TiddlySpot|http://www.tiddlyspot.com]]''@@color(green):// Online Portal um sein eigenes ~TiddlyWiki Online stellen zu können nach bestimmten Regeln. ''Interessante blanko Vorlagen.''//@@
*''[[TiddlyWikiHelp|http://twhelp.tiddlyspot.com/]]''@@color(green):// Gute ~TiddlyWiki Info Seite mit Erklärungen vielen weiterführenden Beispielen und Links zum Umgang mit ~TiddlyWiki.//@@

!!@@color(darkcyan):Sonstiges@@

*''[[Code-Wölfchen|http://www.code-woelfchen.de]]''@@color(green)://Meine eigene Homepage.//@@
*''[[Ein 3D Loader|http://www.codeproject.com/KB/openGL/wrl_viewer.aspx]]''@@color(green):// Ein Beispiel eines ~OpenGL Loaders, allerdings wohl C oder C++. Trotzdem interessant wegen der generellen Methodik... den Link lösche ich aber wieder.//@@
*''[[CAD Viewer|http://www.cadsofttools.com/]]''@@color(green):// Viewer Software angeblich mit C++ und delphi Code, die Formate klingen sehr CAD mässig, könnte durchaus interessant sein...//@@
*''[[Datei Endungen|http://www.blien.de/ralf/cad/db/datform/xtension.htm]]'' @@color(green)://Umfangreiche Endungsliste mit kurzer Erklärung@@
Zum Thema Farbverläufe und Gradients in Delphi auf Forms, oder panels, gibt es im Netz (wie so oft) Millionen von Treffern.

Einiges, das funktioniert hat habe ich hier:

<code delphi>
uses ... math ...

//...//

procedure TForm1.GradHorizontal(Canvas:TCanvas; Rect:TRect; FromColor, ToColor:TColor) ;
var
  X:integer;
  dr,dg,db:Extended;
  C1,C2:TColor;
  r1,r2,g1,g2,b1,b2:Byte;
  R,G,B:Byte;
  cnt:integer;
begin
  C1 := FromColor;
  R1 := GetRValue(C1) ;
  G1 := GetGValue(C1) ;
  B1 := GetBValue(C1) ;

  C2 := ToColor;
  R2 := GetRValue(C2) ;
  G2 := GetGValue(C2) ;
  B2 := GetBValue(C2) ;

  dr := (R2-R1) / Rect.Right-Rect.Left;
  dg := (G2-G1) / Rect.Right-Rect.Left;
  db := (B2-B1) / Rect.Right-Rect.Left;

  cnt := 0;
  for X := Rect.Left to Rect.Right-1 do
  begin
    R := R1+Ceil(dr*cnt) ;
    G := G1+Ceil(dg*cnt) ;
    B := B1+Ceil(db*cnt) ;

    Canvas.Pen.Color := RGB(R,G,B) ;
    Canvas.MoveTo(X,Rect.Top) ;
    Canvas.LineTo(X,Rect.Bottom) ;
    inc(cnt) ;
  end;
end;

procedure TForm1.GradVertical(Canvas:TCanvas; Rect:TRect; FromColor, ToColor:TColor) ;
var
  Y:integer;
  dr,dg,db:Extended;
  C1,C2:TColor;
  r1,r2,g1,g2,b1,b2:Byte;
  R,G,B:Byte;
  cnt:Integer;
begin
   C1 := FromColor;
   R1 := GetRValue(C1) ;
   G1 := GetGValue(C1) ;
   B1 := GetBValue(C1) ;

   C2 := ToColor;
   R2 := GetRValue(C2) ;
   G2 := GetGValue(C2) ;
   B2 := GetBValue(C2) ;

   dr := (R2-R1) / Rect.Bottom-Rect.Top;
   dg := (G2-G1) / Rect.Bottom-Rect.Top;
   db := (B2-B1) / Rect.Bottom-Rect.Top;

   cnt := 0;
   for Y := Rect.Top to Rect.Bottom-1 do
   begin
      R := R1+Ceil(dr*cnt) ;
      G := G1+Ceil(dg*cnt) ;
      B := B1+Ceil(db*cnt) ;

      Canvas.Pen.Color := RGB(R,G,B) ;
      Canvas.MoveTo(Rect.Left,Y) ;
      Canvas.LineTo(Rect.Right,Y) ;
      Inc(cnt) ;
   end;
end;
</code>
das lässt sich dann beispielsweise auf eine Paintbox anwenden über:
<code delphi>
procedure TForm1.Button3Click(Sender: TObject);
begin
   GradHorizontal(PaintBox1.Canvas, PaintBox1.ClientRect, clRed, clBlue) ;

   PaintBox1.Canvas.Brush.Style := bsClear;
   PaintBox1.Canvas.TextOut(5,10,'Transparent text') ;
end;
</code>

Alternativ dazu habe ich für horizontale Farbverläufe diese Procedur gefunden:

<code delphi>
procedure TForm1.FormPaint(Sender: TObject) ;
var Row, Ht: Word ;
begin
  Ht := (ClientHeight + 255) div 256 ;
  for Row := 0 to 255 do
   with Canvas do begin
     Brush.Color := RGB(0, 0, Row) ;
     FillRect(Rect(0, Row * Ht,
                   ClientWidth, (Row + 1) * Ht)) ;
   end;
end;
</code>
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>
!~TForm Fenster in Delphi:
Fenster  haben bereits unzählige Objekteigenschaften und Ereignisprozeduren. Deshalb Liste ich hier nur einige Funktionen auf, die man nicht so rasch durch herumprobieren findet:

*[[Fenster Größe]]
*[[Fenster Position]]
>>
<<<
<<<
@@color(darkcyan):Fenstergröße ändern bei Ereignis:@@

<code delphi>
ReleaseCapture;
Perform(WM_SysCommand,$f008, 0);
</code>
@@color(darkcyan):Das Beispiel oben erlaubt die Größenänderung
eines Fensters auf ein Ereignis hin und zwar an der rechten unteren Ecke.
Mit anderen Zahlen kann diese "Zupfposition" geändert werden.
Alternativ folgt unten ein etwas anderer Code, der etwas leichter zu lesen und zu ändern ist. Die Zupfposition kann nun durch Austausch von {{{WMSZ_BOTTOMRIGHT}}} in z.B. {{{WMSZ_BOTTOMLEFT}}} bestimmt werden.@@ 

<code delphi>
ReleaseCapture;
Perform(WM_SysCommand, SC_SIZE or WMSZ_BOTTOMRIGHT, 0);
</code>

Folgende weiterführende Themen:

*[[Verschiebung bei Resize verhindern]]
*[[Seitenverhältnis beibehalten bei Resize]]

<<<
<<<

@@color(darkcyan):Fensterposition ändern bei Ereignis:@@
<code delphi>
ReleaseCapture;
Perform(WM_SysCommand,$f012, 0);
</code>
<<<
Type the text for 'Fenster im Fenster, das MID System'
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>
@@color(darkcyan):Klar will man früher oder später auch mal eine Animation in seinem Programm laufen haben, dazu habe ich mir die Komponente ''~TGifImage'' aus dem Netz installiert ([[siehe hier|http://melander.dk/delphi/gifimage/]]), denn ohne diese kann DELPHI zunächst mit GIF Dateien nicht viel anfangen.@@

*[[Eine Gif Datei laden und abspielen]] 
*[[Eine Gif Animation stoppen]]
>>
<<<
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
!<<gradient horiz #cceedd #ffffff #cceedd >>Dies ist ein Test
<<gradient vert #cceedd #ffffff #cceedd >>
<<<
Hat man einen Screenshot gemacht mit der Drucken Taste oder ALT+Drucken Taste, dann kann man ihn darstellen lassen:

<code delphi>
form1.image1.picture.BitMap.LoadFromClipBoardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_Bitmap), 0);
</code>

Zuvor, muß allerdings, wie so oft, ein [[Header|Begriff Header]] hinzugefügt werden:

<code delphi>
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtDlgs, ExtCtrls, jpeg, StdCtrls,
  clipbrd;    //Um Daten (hier Grafik) aus dem Clipboard laden zu können.
</code>

Ebenso wie beim Speichern in die Zwischenablage, kann man auch über Assign laden:
Beispiele zu clipboard.Assign:
<code delphi>
Clipboard.Assign(Image1.Picture);
Clipboard.Assign(SpeedButton1.Glyph); // Glyph is a TBitmap
Image1.Picture.Assign(Clipboard);
</code>
<<<
<<gradient vert #cceedd #ffffff #cceedd >>
<<<
Analog zum laden aus der Zwischenablage kann man genauso auch in die Zwischenablage speichern, 

<code delphi>
form1.image1.picture.BitMap.SaveToClipBoardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_Bitmap), 0);
</code>

Zuvor, muß ebenfalls der [[Header|Begriff Header]] hinzugefügt werden:

<code delphi>
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtDlgs, ExtCtrls, jpeg, StdCtrls,
  clipbrd;    //Um Daten (hier Grafik) aus dem Clipboard laden zu können.
</code>


Eine weitere und eventuell bequemere Methode geht über Assign:
<code delphi>
clipboard.Assign(form5.Image1.picture);
</code>

weitere Beispiel zu clipboard.Assign:
<code delphi>
Clipboard.Assign(Image1.Picture);
Clipboard.Assign(SpeedButton1.Glyph); // Glyph is a TBitmap
Image1.Picture.Assign(Clipboard);
</code>
<<<
<<gradient vert #cceedd #ffffff #cceedd >>
<<<

<code delphi>
 procedure TfrChild.LoadPicture;
var OpenPicDlg : TOpenPictureDialog;
begin
 OpenPicDlg := TOpenPictureDialog.Create(Self);
 if OpenPicDlg.Execute then
 begin
  Image1.Picture.LoadFromFile(OpenPicDlg.FileName);
 end;
 OpenPicDlg.Free;
end;
</code>
<code delphi>
{die AdjustHeap Prozedur ist dafür verantwortlich, die Baumstruktur aufzubauen}

procedure AdjustHeap(n: integer; var Data: array of integer; knot: integer);
var
  temp_knot_value, subknot: integer;
begin
  temp_knot_value := Data[knot];

  while knot < n div 2 do
  begin
    subknot := 2*knot+1; //Formel um Unterknoten herauszufinden, 
wobei 2*knot+2 der 2. Unterknoten ist.

    {Überprüfung, welcher der beiden Unterknoten größer ist; 
subknot wird der Index des größeren zugewiesen.}
    if (subknot < n - 1) and (Data[subknot] < Data[subknot + 1]) then
      Inc(subknot);


    {Wenn der größere der beiden Unterknoten nicht größer als der betrachtete
 Knoten ist, breche die Schleife ab ...}
    if temp_knot_value >= Data[subknot] then
      break;


    {... andernfalls tausche die Werte.}
    Data[knot] := Data[subknot];

    {Ein neuer Knotenindex wird gesetz, um eine Ebene im Baum tiefer zu wandern
 und den Unterknoten unter den gleichen Aspekten zu betrachten.}
    knot := subknot;

  end;
  Data[knot] := temp_knot_value;
end;

{eigentlich Prozedur}
procedure HeapSort(var Data: array of integer);
var
  knot, temp, i: integer;
begin
  i := Length(Data);

{Erstsortierung des Heaps/Baumes}
  knot := i div 2; //begonnen wird mit einem Knoten in der Mitte des Arrays
  while knot > 0 do
  begin
    Dec(knot);
    AdjustHeap(i, Data, knot);
  end;

  while i >= 0 do
  begin
   
    {da nun das erste Feld den größten Wert enthält, 
wird dieser mit dem letzten Feld vertauscht ...}
    temp := Data[0];
    Data[0] := Data[i];
    Data[i] := temp;

    AdjustHeap(i, Data, 0);
    Dec(i); {... und da der größte Wert nun am Ende steht, 
also schon einsortiert ist, wird der zu betrachtenden
 Bereich auf den noch unsortierten Teil festgesetzt}
  end;
end;
</code>

Quelle: Delphi Praxis
/***
{{menubox{
{{big{Several ways to write "Hello World" macro}}}
}}}
***/
/***
!!Create a text DOM element:
***/
//{{{
config.macros.helloWorld1 = {
	msg: "Hello World!",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		createTiddlyText(place,this.msg);
	}
}
//}}}
/***
>{{{<<helloWorld1>>}}}
><<helloWorld1>>
***/
/***
!!Render wiki-formatted text:
***/
//{{{
config.macros.helloWorld2 = {
	msg: "//Hello World!//",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		wikify(this.msg,place);
	}
}
//}}}
/***
>{{{<<helloWorld2>>}}}
><<helloWorld2>>
***/
/***
!!Render HTML-formatted text
***/
//{{{
config.macros.helloWorld3 = {
	msg: "<b>Hello World!</b>",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var span=createTiddlyElement(place,span);
		span.innerHTML=this.msg;
	}
}
//}}}
/***
>{{{<<helloWorld3>>}}}
><<helloWorld3>>
***/
/***
!!Create an 'onclick' command
***/
//{{{
config.macros.helloWorld4 = {
	label: "Hi There",
	tooltip: "click me to see a message",
	msg: "Hello World!",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var btn=createTiddlyButton(place,this.label,this.tooltip,this.action);
	},
	action: function() {
		alert(config.macros.helloWorld4.msg);
	}
}
//}}}
/***
>{{{<<helloWorld4>>}}}
><<helloWorld4>>
***/
/***
!!Create an 'onclick' command
***/
// // //(with optional macro parameters for label, tooltip, and message)//
//{{{
config.macros.helloWorld5 = {
	label: "Hi There",
	tooltip: "click me to see a message",
	msg: "Hello World!",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var label=params[0] || this.label;
		var tooltip=params[1] || this.tooltip;
		var msg=params[2] || this.msg;
		var btn=createTiddlyButton(place,label,tooltip,this.action);
		btn.setAttribute("msg",msg);
	},
	action: function() {
		alert(this.getAttribute("msg"));
	}
}
//}}}
/***
>{{{<<helloWorld5>>}}}
><<helloWorld5>>
>{{{<<helloWorld5 "Yo, Dude!" "press here" "Surf's Up!">>}}}
><<helloWorld5 "Yo, Dude!" "press here" "Surf's Up!">>
***/
/***
!!Create an 'onclick' command
***/
// // //(read data from //[[Greetings]]// tiddler and randomly select message text)//
//{{{
config.macros.helloWorld6 = {
	label: "Hi There",
	tooltip: "click me to see a message",
	msg: "Hello World!",
	tid: "Greetings",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var label=params[0] || this.label;
		var tooltip=params[1] || this.tooltip;
		var btn=createTiddlyButton(place,label,tooltip,this.action);
	},
	action: function() {
		var tid=config.macros.helloWorld6.tid; // title of data tiddler
		var msg=config.macros.helloWorld6.msg; // default message text
		var msgs=store.getTiddlerText(tid,msg).split("\n----\n");
		var index=Math.floor(Math.random()*msgs.length);
		alert(msgs[index]);
	}
}
//}}}
/***
>{{{<<helloWorld6>>}}}
><<helloWorld6>>
***/
HoverMenuPlugin updated to fix error with SelectThemePlugin
Plugins are tiddlers embedded with codes that add special functions to ~TiddlyWiki files. Plugins are easier to install than I thought they would be. Here's how:
*Find the plugin you want and grab the url of the page it's on. (Copy the url from your browser's search window).
*In your own ~TiddlyWiki file, click on ImportTiddlers, found in the backstage area for versions 2.2 and beyond, and on the InterfaceOptions panel in the righthand sidebar of earlier versions.
*Paste the url you've copied into the top window of the import tiddlers tiddler that appears. Then click Fetch.
*A list of all the tiddlers found in the other file will appear. Find the tiddler of the plugin you want, then check the box next to it.
*Below the list is a menu that says "More actions..." Choose "Import these tiddlers."
*Your screen will blink and change several times while your file is being updated. If you have your ~TiddlyWiki configured to automatically save every change (which is default), the box will appear in the top right corner saying it has saved the change. If you have it configured another way, then click on "save changes".
*Hit the 'refresh' or 'reload' button on your browser.
*The plugin should now be installed and usable on your file. That's it!
This package defines a set of small icons appear adjacent to the title of each tiddler and indicate various information about the tiddler, such as whether it has unsaved changes, or has been changed recently, or has been tagged as<<tag Trash>>.  Additional icons indicate important categories of tiddlers (based on tags), such as plugins, scripts, templates, attachments, bookmarks, tasks, etc.

----
<<tiddler ShowAllIcons>>
----

{{fine italic{
Note: this package includes icons that are part of the "Silk" icon set: http://www.famfamfam.com/lab/icons/silk/ containing 1000 16-by-16 pixel icons in PNG format, created by Mark James, a part-time web developer, part-time student currently living in Birmingham, UK, and is licensed under a Creative Commons Attribution 2.5 License. Please visit http://www.famfamfam.com/ for further information and licensing details.}}}
/***
|Name|ImagePathPlugin|
|Source|http://www.TiddlyTools.com/#ImagePathPlugin|
|Version|0.7.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin,formatter|
|Requires||
|Overrides|'image' formatter|
|Description|Tell TiddlyWiki where to look for image files.  Permits multiple 'fallback' locations|
|Status|ALPHA - initial development/testing only - may be unstable - do not distribute|

!!!!!Usage
<<<
This plugin adds "resolvePath()" fallback processing to the {{{[img[...]]}}} formatter's handler, so that local image file references can be successfully resolved, even if the files cannot be located on the local filesystem.

The plugin tries alternative file "paths" that are listed, one per line, in an optional tiddler, [[ImagePathList]].  Each path in the list is combined with the image filename, which is then checked for existence, until the file is located.  If no alternative is found, or [[ImagePathList]] is not present, then a 'last-ditch' fallback is attempted using the remote system and path specified in [[SiteUrl]] (if present).

If no fallback attempt is successful (i.e., because no [[ImagePathList]] OR [[SiteUrl]] tiddlers have been defined), the plugin simply passes the original image file value along for default handling by the browser without any "path resolution" being applied.(i.e, the current TW core behavior occurs).

| ''Important note: This plugin may cause one or more security alert messages to appear, because it uses browser-specific functions that can require security permission in order to access the local filesystem to check for the existence of a given image file.  If you block local access, the 'last-ditch' fallback using the remote [[SiteUrl]] (if present) will be attempted.'' |

Note: the image formatter code contained here also includes support for AttachFilePlugin extensions (if installed).  AttachFilePlugin includes its own fallback mechanism for handling embedded vs. local file vs. remote URL references to the attached binary file.  Both methods may be used: ImagePathPlugin provides fallback for images contained in tiddler content, while AttachFilePlugin works well for access to non-image binary files (or images used in CSS as backgrounds, textures, etc.)
<<<
!!!!!Examples
<<<
coming soon...
<<<
!!!!!Revisions
<<<
''2007.04.13 [0.7.1]'' in testFile(), convert any file:// references to local native format before checking for existence.
''2007.03.26 [0.7.0]'' for IE, use onError handling to trigger call to resolvePath() so it will only be invoked if the original path/file is not found by the browser-native lookup.  This avoids an unneeded call to fileExists() and the accompanying ActiveX security alert message box (as well as being slightly more efficient...)
''2007.03.25 [0.6.0]'' code cleanup (moved global functions into config.formatterHelpers) plus documentation re-write
''2007.03.24 [0.5.0]'' initial implementation - ALPHA - do not distribute
<<<
!!!!!Code
***/
//{{{
version.extensions.ImagePathPlugin= {major: 0, minor: 7, revision: 1, date: new Date(2007,4,13)};
//}}}
//{{{
// name of path definition tiddler
if (config.options.txtPathTiddler==undefined) config.options.txtPathTiddler="ImagePathList";
//}}}
//{{{
// low-level wrapper for platform-specific tests for local file existence
// returns true/false without visible error display
// Uses Components for FF and ActiveX FSO object for MSIE
// NOTE: this can cause a security warning on some browsers
config.formatterHelpers.fileExists=function(theFile) {
	var found=false;
	// DEBUG: alert('testing fileExists('+theFile+')...');
	if(window.Components) {
		try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); }
		catch(e) { return false; } // security access denied
		var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
		try { file.initWithPath(theFile); }
		catch(e) { return false; } // invalid directory
		found = file.exists();
	}
	else { // use ActiveX FSO object for MSIE 
		var fso = new ActiveXObject("Scripting.FileSystemObject");
		found = fso.FileExists(theFile)
	}
	// DEBUG: alert(theFile+" "+(found?"exists":"not found"));
	return found;
}
//}}}
//{{{
// higher-level logic for checking local file existence.
// with secondary check for finding relative file references
// and automatic OK of http-based references without checking local filesystem
config.formatterHelpers.testFile=function(theFile) {
	if (document.location.protocol!="file:") return true; // viewing remote document, can't test local filesystem... assume OK
	if (theFile.substr(0,5)=="http:") return true; // remote HTTP reference... assume OK
	if (theFile.substr(0,5)=="file:") theFile=getLocalPath(theFile); // convert local FILE reference to native format
	if (this.fileExists(theFile)) return true; // file exists locally... OK to use!
	// file might have been relative, add path from current document and try again
	var docPath=document.location.href;
	var slashpos=docPath.lastIndexOf("/"); if (slashpos==-1) slashpos=docPath.lastIndexOf("\\"); 
	if (slashpos!=-1 && slashpos!=docPath.length-1) docPath=docPath.substr(0,slashpos+1); // trim off filename
	if (this.fileExists(getLocalPath(docPath+theFile)))
		return true; // ah ha!... file exists relative to current document... OK to use!
	return false; // file not found on local system
}
//}}}
//{{{
// given a path/file string, check for existence and
// try alternatives (if any) defined in a tiddler
// with last-ditch using system/path from SiteUrl (if any)
config.formatterHelpers.resolvePath=function(theFile,testoriginal) {
	if (testoriginal && this.testFile(theFile)) return theFile; // FOUND FILE - use specified path/file without modification
	// get the filename portion only
	var slashpos=theFile.lastIndexOf("/"); if (slashpos==-1) slashpos=theFile.lastIndexOf("\\"); 
	var theName=(slashpos==-1)?theFile:theFile.substr(slashpos+1);
	// get list of fallbacks (if any)
	var pathText=store.getTiddlerText(config.options.txtPathTiddler);
	if (pathText && pathText.length) {
		var paths=pathText.split("\n");
		for (p=0; p<paths.length; p++) // combine path+filename until one works...
			if (this.testFile(paths[p]+theName))
				return paths[p]+theName; // FOUND FILE - use alternative path+filename
	}
	// try "last ditch" fallback using SiteURL - assumes that original path/file was relative to document location
	var siteURL=store.getTiddlerText("SiteUrl");
	if (!siteURL||!siteURL.length) return theFile; // NO FALLBACK - use original path/file and hope for the best
	// trim filename (if any) from site URL
	var slashpos=siteURL.lastIndexOf("/"); if (slashpos==-1) slashpos=siteURL.lastIndexOf("\\"); 
	if (slashpos!=-1 && slashpos!=siteURL.length-1) siteURL=siteURL.substr(0,slashpos+1);
	return siteURL+theFile; // LAST DITCH: use system/path from SiteUrl combined with original file/path
}
//}}}
//{{{
// replace standard handler for image formatter
// adds call to resolvePath() to handle fallback processing
// includes support for AttachFilePlugin as well
config.formatters[config.formatters.findByField("name","image")].handler=function(w) {
	if (!this.lookaheadRegExp)  // fixup for TW2.0.x
		this.lookaheadRegExp = new RegExp(this.lookahead,"mg");
	this.lookaheadRegExp.lastIndex = w.matchStart;
	var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
	if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
		// Simple bracketted link
		var e = w.output;
		if(lookaheadMatch[5]) {
			var link = lookaheadMatch[5];
			if (!config.formatterHelpers.isExternalLink) // fixup for TW2.0.x
				var external=!store.tiddlerExists(link)&&!store.isShadowTiddler(link);
			else
				var external=config.formatterHelpers.isExternalLink(link);
			if (external) {
				if (config.macros.attach && config.macros.attach.isAttachment(link)) { // ELS - attachments
					e = createExternalLink(w.output,link);
					e.href=config.macros.attach.getAttachment(link);
					e.title = config.macros.attach.linkTooltip + link;
				} else
					e = createExternalLink(w.output,link);
			} else 
				e = createTiddlyLink(w.output,link,false,null,w.isStatic);
			addClass(e,"imageLink");
		}
		var img = createTiddlyElement(e,"img");
		if(lookaheadMatch[1])
			img.align = "left";
		else if(lookaheadMatch[2])
			img.align = "right";
		if(lookaheadMatch[3])
			img.title = lookaheadMatch[3];
		if (config.macros.attach!=undefined && config.macros.attach.isAttachment(lookaheadMatch[4])) // ELS - attachments
			img.src=config.macros.attach.getAttachment(lookaheadMatch[4]);
		else {
			if (config.browser.isIE || config.browser.isSafari) { // ELS - path processing
				// IE and Safari use browser's onError handling to check the original file...
				// avoids extra security alert messages due to use of Components/ActiveX for filesystem access
				img.onerror=(function(){this.src=config.formatterHelpers.resolvePath(this.src,false);return false;});
				img.src=lookaheadMatch[4]; // ELS - path processing
			} else {
				// if NOT IE or Safari, always check the original path/file before rendering
				img.src=config.formatterHelpers.resolvePath(lookaheadMatch[4],true);
			}
		}
		w.nextMatch = this.lookaheadRegExp.lastIndex;
	}
}
//}}}
/***
|Name|ImageSizePlugin|
|Source|http://www.TiddlyTools.com/#ImageSizePlugin|
|Version|1.2.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin,formatter|
|Requires||
|Overrides|'image' formatter|
|Description|adds support for resizing images|
This plugin adds optional syntax to scale an image to a specified width and height and/or interactively resize the image with the mouse.
!!!!!Usage
<<<
The extended image syntax is:
{{{
[img(w+,h+)[...][...]]
}}}
where ''(w,h)'' indicates the desired width and height (in CSS units, e.g., px, em, cm, in, or %). Use ''auto'' (or a blank value) for either dimension to scale that dimension proportionally (i.e., maintain the aspect ratio). You can also calculate a CSS value 'on-the-fly' by using a //javascript expression// enclosed between """{{""" and """}}""". Appending a plus sign (+) to a dimension enables interactive resizing in that dimension (by dragging the mouse inside the image). Use ~SHIFT-click to show the full-sized (un-scaled) image. Use ~CTRL-click to restore the starting size (either scaled or full-sized).
<<<
!!!!!Examples
<<<
{{{
[img(100px+,75px+)[images/meow2.jpg]]
}}}
[img(100px+,75px+)[images/meow2.jpg]]
{{{
[<img(34%+,+)[images/meow.gif]]
[<img(21% ,+)[images/meow.gif]]
[<img(13%+, )[images/meow.gif]]
[<img( 8%+, )[images/meow.gif]]
[<img( 5% , )[images/meow.gif]]
[<img( 3% , )[images/meow.gif]]
[<img( 2% , )[images/meow.gif]]
[img(  1%+,+)[images/meow.gif]]
}}}
[<img(34%+,+)[images/meow.gif]]
[<img(21% ,+)[images/meow.gif]]
[<img(13%+, )[images/meow.gif]]
[<img( 8%+, )[images/meow.gif]]
[<img( 5% , )[images/meow.gif]]
[<img( 3% , )[images/meow.gif]]
[<img( 2% , )[images/meow.gif]]
[img(  1%+,+)[images/meow.gif]]
{{tagClear{
}}}
<<<
!!!!!Revisions
<<<
2009.02.24 [1.2.1] cleanup width/height regexp, use '+' suffix for resizing
2009.02.22 [1.2.0] added stretchable images
2008.01.19 [1.1.0] added evaluated width/height values
2008.01.18 [1.0.1] regexp for "(width,height)" now passes all CSS values to browser for validation
2008.01.17 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.ImageSizePlugin= {major: 1, minor: 2, revision: 1, date: new Date(2009,2,24)};
//}}}
//{{{
var f=config.formatters[config.formatters.findByField("name","image")];
f.match="\\[[<>]?[Ii][Mm][Gg](?:\\([^,]*,[^\\)]*\\))?\\[";
f.lookaheadRegExp=/\[([<]?)(>?)[Ii][Mm][Gg](?:\(([^,]*),([^\)]*)\))?\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg;
f.handler=function(w) {
	this.lookaheadRegExp.lastIndex = w.matchStart;
	var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
	if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
		var floatLeft=lookaheadMatch[1];
		var floatRight=lookaheadMatch[2];
		var width=lookaheadMatch[3];
		var height=lookaheadMatch[4];
		var tooltip=lookaheadMatch[5];
		var src=lookaheadMatch[6];
		var link=lookaheadMatch[7];

		// Simple bracketted link
		var e = w.output;
		if(link) { // LINKED IMAGE
			if (config.formatterHelpers.isExternalLink(link)) {
				if (config.macros.attach && config.macros.attach.isAttachment(link)) {
					// see [[AttachFilePluginFormatters]]
					e = createExternalLink(w.output,link);
					e.href=config.macros.attach.getAttachment(link);
					e.title = config.macros.attach.linkTooltip + link;
				} else
					e = createExternalLink(w.output,link);
			} else 
				e = createTiddlyLink(w.output,link,false,null,w.isStatic);
			addClass(e,"imageLink");
		}

		var img = createTiddlyElement(e,"img");
		if(floatLeft) img.align="left"; else if(floatRight) img.align="right";
		if(width||height) {
			var x=width.trim(); var y=height.trim();
			var stretchW=(x.substr(x.length-1,1)=='+'); if (stretchW) x=x.substr(0,x.length-1);
			var stretchH=(y.substr(y.length-1,1)=='+'); if (stretchH) y=y.substr(0,y.length-1);
			if (x.substr(0,2)=="{{")
				{ try{x=eval(x.substr(2,x.length-4))} catch(e){displayMessage(e.description||e.toString())} }
			if (y.substr(0,2)=="{{")
				{ try{y=eval(y.substr(2,y.length-4))} catch(e){displayMessage(e.description||e.toString())} }
			img.style.width=x.trim(); img.style.height=y.trim();
			config.formatterHelpers.addStretchHandlers(img,stretchW,stretchH);
		}
		if(tooltip) img.title = tooltip;

		// GET IMAGE SOURCE
		if (config.macros.attach && config.macros.attach.isAttachment(src))
			src=config.macros.attach.getAttachment(src); // see [[AttachFilePluginFormatters]]
		else if (config.formatterHelpers.resolvePath) { // see [[ImagePathPlugin]]
			if (config.browser.isIE || config.browser.isSafari) {
				img.onerror=(function(){
					this.src=config.formatterHelpers.resolvePath(this.src,false);
					return false;
				});
			} else
				src=config.formatterHelpers.resolvePath(src,true);
		}
		img.src=src;
		w.nextMatch = this.lookaheadRegExp.lastIndex;
	}
}

config.formatterHelpers.addStretchHandlers=function(e,stretchW,stretchH) {
	e.title=((stretchW||stretchH)?'DRAG=stretch/shrink, ':'')
		+'SHIFT-CLICK=show full size, CTRL-CLICK=restore initial size';
	e.statusMsg='width=%0, height=%1';
	e.style.cursor='move';
	e.originalW=e.style.width;
	e.originalH=e.style.height;
	e.minW=Math.max(e.offsetWidth/20,10);
	e.minH=Math.max(e.offsetHeight/20,10);
	e.stretchW=stretchW;
	e.stretchH=stretchH;
	e.onmousedown=function(ev) { var ev=ev||window.event;
		this.sizing=true;
		this.startX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
		this.startY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
		this.startW=this.offsetWidth;
		this.startH=this.offsetHeight;
		return false;
	};
	e.onmousemove=function(ev) { var ev=ev||window.event;
		if (this.sizing) {
			var s=this.style;
			var currX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
			var currY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
			var newW=(currX-this.offsetLeft)/(this.startX-this.offsetLeft)*this.startW;
			var newH=(currY-this.offsetTop )/(this.startY-this.offsetTop )*this.startH;
			if (this.stretchW) s.width =Math.floor(Math.max(newW,this.minW))+'px';
			if (this.stretchH) s.height=Math.floor(Math.max(newH,this.minH))+'px';
			clearMessage(); displayMessage(this.statusMsg.format([s.width,s.height]));
		}
		return false;
	};
	e.onmouseup=function(ev) { var ev=ev||window.event;
		if (ev.shiftKey) { this.style.width=this.style.height=''; }
		if (ev.ctrlKey)  { this.style.width=this.originalW; this.style.height=this.originalH; }
		this.sizing=false;
		clearMessage();
		return false;
	};
	e.onmouseout=function(ev) { var ev=ev||window.event;
		this.sizing=false;
		clearMessage();
		return false;
	};
}
//}}}
!<<gradient vert #aaeeaa #ffffff #cceeaa >>Instanz der Klasse erzeugen>>
<<gradient vert #cceedd #ffffff #cceedd >>

<code delphi>
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
    MeinIcon : TCoolTrayIcon;
  public
    { Public-Deklarationen }
  end;
</code>
<<gradient vert #cceedd #ffffff #cceedd >>
so, jetzt weiss ~TForm1, das es eine Instanz von ~TCoolTrayIcon beherbergt mit dem schönen Namen ~MeinIcon.
Aber das reicht leider noch nicht.

<code delphi>
procedure TForm1.FormCreate(Sender: TObject);
begin
MeinIcon := TCoolTrayIcon.Create(self);  //also hier wird dann die Instanz geboren
MeinIcon.MinimizeToTray:=true;       // und hier werden Eigenschaften vergeben
MeinIcon.Hint:='Mein Icon';
MeinIcon.DesignPreview:=true;
MeinIcon.Icon.LoadFromFile('G:\Icons\temp.ico');
end;
</code>

Bei der Eigenschaft ~MinimizeToTray ist unbedingt zu beachten, das die Form mit
<code delphi>
MeinIcon.ShowMainForm;
</code>
wieder hervorgeholt wird.

Womit das nächste Problem entsteht, denn man kommt an die Ereignisse ja nicht heran, mangels Objektinspektor.

Der Workaround sieht wie folgt aus:

<code delphi>
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    MeinIcon : TCoolTrayIcon;
    procedure OwnClick(Sender : TObject); //eigene clickprocedure
//..................................................
procedure TForm1.FormCreate(Sender: TObject);
begin
//...
MeinIcon.OnClick := OwnClick; // Zuweisung des Ereignisses
end;

procedure TForm1.OwnClick(Sender : TObject);
begin
  MeinIcon.ShowMainForm;
end;
</code>
Dieser Download steht zur Zeit (noch) nicht zur Verfügung.
<<<
<<gradient horiz #cceedd #bbccbb #cceedd >>
Die Fehlermeldung 1.00 ist keine gültige Gleitkommazahl raubte mir ein paar Nerven als ich versuchte die Vektorinformationen aus einer Listbox in die glvertex3f(strtofloat(listbox1.items[1])) zu zaubern.

Obwohl in Listbox 1 Einträge exakt so standen dass sie eingegeben im code an entsprechender Stelle funktioniert haben, meinte Delphi trotzdem:
1.00 ist keine gültige Gleitkommazahl.

Die Lösung war wie so oft einfach, man muß sie nur finden:
<code delphi>
DecimalSeparator:= '.';
</code>
!<<gradient vert #aaeeaa #ffffff #cceeaa >>Komponente Bereitstellen>>
<<gradient vert #cceedd #ffffff #cceedd >>
Zunächst muß die entsprechende Komponente in einem Verzeichnis vorliegen, und dieses muß Delphi bekanntgegeben werden. 
Für das Beispiel liegt der Pfad bei mir so: C:\Programme\Borland\BDS\4.0\lib\Cool Tray Icon 4-4-0.

Dieses muß man dann unter Tools\Optionen\Umgebungsoptionen\~Delphi-Optionen hinzufügen.

Jetzt lässt sich die Komponente [[CoolTrayIcon.pas in ein Projekt einbinden|Komponente im Projekt einbinden]].
!<<gradient vert #aaeeaa #ffffff #cceeaa >>Komponente einbinden>>
<<gradient vert #cceedd #ffffff #cceedd >>

Das ist leicht, sie wird einfach unter uses eingebunden:

<code delphi>
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, CoolTrayIcon;
</code>
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Kontakt>>
<<gradient horiz #cceedd #ffffff #cceedd >>
@@color(darkcyan):Wer Anregungen, Fragen, Lob oder Kritik zu dieser Seite äußern möchte, kann mir eine e-mail schreiben an:@@
!nelphin@live.de
<<<
Hat man es in ~OpenGL geschafft einen räumlichen Körper zu erschaffen so sieht der erstmal ziemlich langweilig aus...

mit den drei Zeilen:
<code delphi>
  glEnable(GL_LIGHTING);
  glEnable(GL_Light0);
  glEnable(GL_COLOR_MATERIAL);
</code>
Erzielt man einen dreidimensionaleren Effekt - dabei müssen allerdings die Flächennormalen stimmen.
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>
@@color(darkcyan):Häufig sieht man in Programmen innerhalb des "abouts" einen Link auf eine URL. Das wollte ich auch können und habe folgendes gefunden:@@

<code delphi>
procedure TForm3.Label3Click(Sender: TObject);
var
  URL			: string;
begin
  URL := TLabel(Sender).Caption;
  ShellExecute(Application.Handle, nil, PChar(URL), nil, nil, SW_SHOWNORMAL);
end;
</code>

@@color(darkcyan):Damit die ~ShellExecute funktioniert muss unter uses noch der ''shellapi'' [[Header|Begriff Header]] hinzugefügt werden:@@

<code delphi>
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,GifImage,
  shellapi; //Für ShellExecute
</code>
<<gradient horiz #aaccbb #ddeedd #ffffff>>
!Willkommen@@color(white):{{{.}}}@@
[[Wo bin ich?!]] @@color(white):{{{.}}}@@
[[Wie geht das hier?]] @@color(white):{{{.}}}@@
[[Kontakt]] @@color(white):{{{.}}}@@
!Delphi@@color(white):{{{.}}}@@
[[Was ist das?|Was ist Delphi?]]@@color(white):{{{.}}}@@
[[Codeschnipsel|Delphi Codeschnipsel]]@@color(white):{{{.}}}@@
[[Eigene Programme|Delphi Projekte]]@@color(white):{{{.}}}@@
[[Drittkomponenten]]@@color(white):{{{.}}}@@
[[XY ungelöst|Delphi ungeklärt]]@@color(white):{{{.}}}@@
!~OpenGL@@color(white):{{{.}}}@@
[[Was ist das?|Was ist OpenGL?]]@@color(white):{{{.}}}@@
[[Erste Schritte|Erste Schritte in OpenGL]]@@color(white):{{{.}}}@@
[[Aha Momente|Aha Momente mit OpenGL]]@@color(white):{{{.}}}@@
!~TiddlyWiki@@color(white):{{{.}}}@@
[[Was ist das?|Was ist TiddlyWiki?]]@@color(white):{{{.}}}@@
[[GettingStarted]]@@color(white):{{{.}}}@@
[[How to install Plugins|How to install a plugin]]@@color(white):{{{.}}}@@
!![[Links|Externe Links]]@@color(white):{{{.}}}@@
!![[coming soon]]@@color(white):{{{.}}}@@
!![[Begriffe]]@@color(white):{{{.}}}@@

<<<
@@color(darkcyan):Eine Möglichkeit einen anderen Mauscursor zu setzen ist diese:@@
<code delphi>
SetCursor(LoadCursor(0, IDC_HAND));
</code>
@@color(darkcyan):Im Beispiel wird die Maus zur Hand.
Weitere Mauszeiger und deren Benennung findet man leicht bei den ''Objekteigenschaften'' eines ''Forms'' unter ''Cursor''.@@
<<<
<<<
@@color(darkcyan):Eine Möglichkeit die Position der Maus abzufragen ist diese:@@

<code delphi>
var P: TPoint;
begin
  GetCursorPos(P);
  Label1.Caption:=(IntToStr(P.X)+', '+IntToStr(P.Y));
end;
</code>
@@color(darkcyan):Das schöne daran ist, daß die Position auch außerhalb des Programmeigenen Forms gegriffen wird und man dadurch jede Mauskoordinate erhält.@@
<<<
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Endlich! Mein erstes ~OpenGL Template (VCL)>>

<code delphi>
unit OpenGL_VCL_Template_001;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,
  DGLOpenGL, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure IdleHandler(Sender: TObject; var Done: Boolean);
    procedure FormResize(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    StartTime, TimeCount, FrameCount  : Cardinal; //FrameCounter
    Frames, DrawTime                  : Cardinal; //& Timebased Movement
    procedure SetupGL;
    procedure Render;
    procedure ErrorHandlerGL;
  public
  { Public-Deklarationen }
    DC                                : HDC;  //Handle auf Zeichenfläche
    RC                                : HGLRC;//Rendering Context

  end;

var
  Form1: TForm1;
{------------------------------------------------------------------------------}
{                        Globale Variablen für OpenGL                          }
{------------------------------------------------------------------------------}

  const Nearclipping = 1;
  const FarClipping = 1000;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
{------------------------------------------------------------------------------}
{                            OpenGL Initialisierung                            }
{------------------------------------------------------------------------------}

   DC:= GetDC(Handle);
   if not InitOpenGL then Application.Terminate;
   RC:= CreateRenderingContext( DC,
                                [opDoubleBuffered],
                                32,
                                24,
                                0,0,0,
                                0);
   ActivateRenderingContext(DC, RC);

{------------------------------------------------------------------------------}
{                 Aufruf zusätzlicher OpenGL Initialisierungen                 }
{------------------------------------------------------------------------------}
  SetupGL;
{------------------------------------------------------------------------------}
{                    Aufruf der Zeichenschleife OnIdle                         }
{------------------------------------------------------------------------------}
  Application.OnIdle := IdleHandler;
end;
{------------------------------------------------------------------------------}
{                          OpenGL zusätzliches Setup                           }
{------------------------------------------------------------------------------}

procedure TForm1.SetupGL;
begin
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
end;
{------------------------------------------------------------------------------}
{                            Ereignishandler Resize                            }
{------------------------------------------------------------------------------}
procedure TForm1.FormResize(Sender: TObject);
var tmpBool : Boolean;
begin
  glViewport(0, 0, ClientWidth, ClientHeight);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
 
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  IdleHandler(Sender, tmpBool);
end;
{------------------------------------------------------------------------------}
{                             OpenGL Render Routine                            }
{------------------------------------------------------------------------------}
procedure TForm1.Render;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
 
  glTranslatef(0, 0, -5);
 
  glBegin(GL_QUADS);
    glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
    glColor3f(0, 1, 0); glVertex3f(1, 0, 0);
    glColor3f(0, 0, 1); glVertex3f(1, 1, 0);
    glColor3f(1, 1, 0); glVertex3f(0, 1, 0);
  glEnd;

  SwapBuffers(DC);
end;
{------------------------------------------------------------------------------}
{                          OpenGL Render Aufruf OnIdle                         }
{------------------------------------------------------------------------------}
procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
begin
  StartTime:= GetTickCount;
  Render;
  DrawTime:= GetTickCount - StartTime;
  Inc(TimeCount, DrawTime);
  Inc(FrameCount);

  if TimeCount >= 1000 then begin
    Frames:= FrameCount;
    TimeCount:= TimeCount - 1000;
    FrameCount:= 0;
    Caption:= InttoStr(Frames) + 'FPS';
    ErrorHandlerGL;
  end;

  Done:= false;
end;
{------------------------------------------------------------------------------}
{                                 FormDestroy                                  }
{------------------------------------------------------------------------------}
procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeactivateRenderingContext;
  DestroyRenderingContext(RC);
  ReleaseDC(Handle, DC);
end;
{------------------------------------------------------------------------------}
{                              OpenGL ErrorHandler                             }
{------------------------------------------------------------------------------}
procedure TForm1.ErrorHandlerGL;
begin
  Form1.Caption := gluErrorString(glGetError);
end;
end.
</code>
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Das zweite ~OpenGL Template arbeitet mit Timer (VCL)>>

@@color(darkcyan):Zu beachten ist bei diesem Template noch, das man sich einen [[Timer|Delphi Timer]] auf das Form ziehen muß. 

<code delphi>
unit OpenGL_VCL_Template_002_Timer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,
  DGLOpenGL, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }

    FrameCount  : Cardinal; //FrameCounter

    procedure SetupGL;
    procedure Render;
    procedure ErrorHandlerGL;

  public
  { Public-Deklarationen }
    DC                                : HDC;  //Handle auf Zeichenfläche
    RC                                : HGLRC;//Rendering Context

  end;

var
  Form1: TForm1;
{------------------------------------------------------------------------------}
{                        Globale Variablen für OpenGL                          }
{------------------------------------------------------------------------------}

  const Nearclipping = 1;
  const FarClipping = 1000;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
{------------------------------------------------------------------------------}
{                            OpenGL Initialisierung                            }
{------------------------------------------------------------------------------}

   DC:= GetDC(Handle);
   if not InitOpenGL then Application.Terminate;
   RC:= CreateRenderingContext( DC,
                                [opDoubleBuffered],
                                32,
                                24,
                                0,0,0,
                                0);
   ActivateRenderingContext(DC, RC);

{------------------------------------------------------------------------------}
{                 Aufruf zusätzlicher OpenGL Initialisierungen                 }
{------------------------------------------------------------------------------}
  SetupGL;
{------------------------------------------------------------------------------}
{                    Aufruf der Zeichenschleife OnIdle                         }
{------------------------------------------------------------------------------}
end;
{------------------------------------------------------------------------------}
{                          OpenGL zusätzliches Setup                           }
{------------------------------------------------------------------------------}

procedure TForm1.SetupGL;
begin
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
end;
{------------------------------------------------------------------------------}
{                            Ereignishandler Resize                            }
{------------------------------------------------------------------------------}
procedure TForm1.FormResize(Sender: TObject);

begin
  glViewport(0, 0, ClientWidth, ClientHeight);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
 
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

end;
{------------------------------------------------------------------------------}
{                             OpenGL Render Routine                            }
{------------------------------------------------------------------------------}
procedure TForm1.Render;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
 
  glTranslatef(0, 0, -5);
 
  glBegin(GL_QUADS);
    glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
    glColor3f(0, 1, 0); glVertex3f(1, 0, 0);
    glColor3f(0, 0, 1); glVertex3f(1, 1, 0);
    glColor3f(1, 1, 0); glVertex3f(0, 1, 0);
  glEnd;

  SwapBuffers(DC);
end;
{------------------------------------------------------------------------------}
{                        OpenGL Render Aufruf mit Timer                        }
{------------------------------------------------------------------------------}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   inc(FrameCount);
   Render;
   If FrameCount = 20 then
      begin
           ErrorHandlerGL;
           FrameCount := 0;
      end;
end;
{------------------------------------------------------------------------------}
{                                 FormDestroy                                  }
{------------------------------------------------------------------------------}
procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeactivateRenderingContext;
  DestroyRenderingContext(RC);
  ReleaseDC(Handle, DC);
end;
{------------------------------------------------------------------------------}
{                              OpenGL ErrorHandler                             }
{------------------------------------------------------------------------------}
procedure TForm1.ErrorHandlerGL;
begin
  Form1.Caption := gluErrorString(glGetError);
end;
end.
</code>
/***

|Name|NavigationMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#NavigationMacro|
|Version|0.3 |
|Requires|~TW2.08+|
!Description:
*Creates Next and Prev buttons on tiddlers, to cycle through tiddlers in order.
**you can create next and previous buttons to navigate through your journals, or the tiddlers of a tutorial.
*You can exclude certain tiddlers, or navigate through tiddlers with a specific tag only.
*The tiddlers can be sorted by modified or created.
*Custom ordering will be available after the release of TW 2.1
*Needs to be added to the ViewTemplate
*Buttons are updated dynamically and are hidden if there is no next or previous tiddler.

!Usage
{{{<<navigation>>}}}
or for more options:
{{{<<navigation sort exclude tag labelPrevious labelNext >>}}}
where sort is ''created'' (default) or ''modified''
exlcude is the tag to exclude.
tag is the tag to navigate through.
labelPrevious is the label for the previous button.
labelNext is the label for the next button. 

I recommend adding it to the ViewTemplate in the viewer div:
{{{<div class='viewer'>
<span macro='view text wikified'></span>
<span macro='navigation "" "" plugin'></span></div>}}}



!Example:
The next and previous buttons at the bottom of this tiddler will cycle through all of my extensions for TW.
!History
* 25-06-06 : version 0.3, first release

!Code
***/
//{{{
window.refreshNavLink = function (e) {
             var title = e.getAttribute("here");
             var sort = e.getAttribute("sort");
             var exclude =  e.getAttribute("exclude");
             if (e.getAttribute("tag")!=undefined) var tag = e.getAttribute("tag");
             var navtype = e.getAttribute("navtype");
              if (tag) {var tiddlers = store.getTaggedTiddlers(tag,sort);}
              else {var tiddlers = store.getTiddlers(sort,exclude);}
              for (var g=0; g<tiddlers.length; g++)
                  {if (title==tiddlers[g].title)
                       {if(navtype=="next" && !tiddlers[g+1])                             
                             e.className += " navNonExisting"
                        else if (navtype=="prev" && !tiddlers[g-1])
                             e.className += " navNonExisting"
                        else e.className = "button";}
                  }
}


config.refreshers.navLink = function(e,changeList){         
             refreshNavLink(e);
} 



config.macros.navigation={};
config.macros.navigation.handler = function(place,macroName,params,wikifier,paramString,tiddler){

          var sort = (params[0] && params[0]!=".")? params[0]: "created";
          var exclude =(params[1] && params[1]!=".")? params[1]: undefined;
          if (params[2])
                {var tag= params[2];
                 if(tiddler.tags.contains(tag)==false)
                 return false;
                }
          var labelPrev = params[3] ? params[3] : "Previous";
          var labelNext = params[4] ? params[4] : "Next";

          var next = function(e){
              if (!e) var e=window.event;
              var theTarget = resolveTarget(e);
              var navtype = theTarget.getAttribute("navtype");
              if (tag) {var tiddlers = store.getTaggedTiddlers(tag,sort);}
              else {var tiddlers = store.getTiddlers(sort,exclude);}
              for (var g=0; g<tiddlers.length; g++)
                  {if (tiddler.title==tiddlers[g].title)
                        {if (navtype == "next")
                            story.displayTiddler(theTarget,tiddlers[g+1].title)
                        else if (navtype == "prev")
                            story.displayTiddler(theTarget,tiddlers[g-1].title)}
                  }
              }

     var createNavBtn = function(text,theId,mode){
         var nextBtn = createTiddlyButton(place,text,text,next,null,theId);
         nextBtn.setAttribute("refresh","navLink");
         nextBtn.setAttribute("here",tiddler.title);
         nextBtn.setAttribute("sort",sort);
         nextBtn.setAttribute("exclude",exclude);
         nextBtn.setAttribute("navtype",mode);
         if (tag) nextBtn.setAttribute("tag",tag);
         refreshNavLink(nextBtn);
         }
    createNavBtn(labelNext+" ►","NavNext","next");
    createNavBtn("◄ "+labelPrev,"NavPrevious","prev");

}

setStylesheet(
"#NavNext {float:right;}\n"+
"#NavPrevious {float:left;}\n"+
".navNonExisting {display:none;}\n"+
 "",
"NavMacroStyles");
//}}}
<<gradient horiz #cceedd #ffffff #cceedd >>

19.July 2009

Lange ist es her, gefühlte 10 Jahre habe ich mich nicht mit Delphi beschäftigt, in Wirklichkeit waren es nur 4 Monate. Jetzt zeigt sich wie wertvoll diese Seite hier wirklich ist, denn ich habe sie schon mehrmals zu Rate gezogen um mich zu erinnern wie ich einfache Dinge in Delphi machen konnte. (Ich weiss dann stets genau, das ich das schon mal hinbekommen hatte aber wie... ?)
Warum die Pause so lange war hat sich einfach ergeben, eigentlich wollte ich nur 2 Wochen bis Ostern Pause machen, das hat sich dann bis mitte July gezogen. In diesem Sinne: FROHE OSTERN!
/***
|Name:|NewMeansNewPlugin|
|Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
|Version:|1.1.1 ($Rev: 2263 $)|
|Date:|$Date: 2007-06-13 04:22:32 +1000 (Wed, 13 Jun 2007) $|
|Source:|http://mptw.tiddlyspot.com/empty.html#NewMeansNewPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Note: I think this should be in the core
***/
//{{{

// change this or set config.newMeansNewForJournalsToo it in MptwUuserConfigPlugin
if (config.newMeansNewForJournalsToo == undefined) config.newMeansNewForJournalsToo = true;

String.prototype.getNextFreeName = function() {
       var numberRegExp = / \(([0-9]+)\)$/;
       var match = numberRegExp.exec(this);
       if (match) {
               var num = parseInt(match[1]) + 1;
               return this.replace(numberRegExp," ("+num+")");
       }
       else {
               return this + " (1)";
       }
}

config.macros.newTiddler.checkForUnsaved = function(newName) {
	var r = false;
	story.forEachTiddler(function(title,element) {
		if (title == newName)
			r = true;
	});
	return r;
}

config.macros.newTiddler.getName = function(newName) {
       while (store.getTiddler(newName) || config.macros.newTiddler.checkForUnsaved(newName))
               newName = newName.getNextFreeName();
       return newName;
}


config.macros.newTiddler.onClickNewTiddler = function()
{
	var title = this.getAttribute("newTitle");
	if(this.getAttribute("isJournal") == "true") {
		title = new Date().formatString(title.trim());
	}

	// ---- these three lines should be the only difference between this and the core onClickNewTiddler
	if (config.newMeansNewForJournalsToo || this.getAttribute("isJournal") != "true")
		title = config.macros.newTiddler.getName(title);

	var params = this.getAttribute("params");
	var tags = params ? params.split("|") : [];
	var focus = this.getAttribute("newFocus");
	var template = this.getAttribute("newTemplate");
	var customFields = this.getAttribute("customFields");
	if(!customFields && !store.isShadowTiddler(title))
		customFields = String.encodeHashMap(config.defaultCustomFields);
	story.displayTiddler(null,title,template,false,null,null);
	var tiddlerElem = story.getTiddler(title);
	if(customFields)
		story.addCustomFields(tiddlerElem,customFields);
	var text = this.getAttribute("newText");
	if(typeof text == "string")
		story.getTiddlerField(title,"text").value = text.format([title]);
	for(var t=0;t<tags.length;t++)
		story.setTiddlerTag(title,tags[t],+1);
	story.focusTiddler(title,focus);
	return false;
};

//}}}

<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>OnIdle>>
~OnIdle ist ein besonderes Ereignis, welches das gesamte Programm betrifft. Wenn die Anwendung nichts zu tun hat, also faul ist (englisch idle), tritt das Ereignis ein. 
<<<
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Der ~OpenGL Header von ~DelphiGL>>
@@color(darkcyan):Zum ~OpenGL [[Header|Begriff Header]] gibt es nicht viel zu sagen *), man lädt ihn wie auf  ''[[ DelphiGL|http://www.delphigl.com/index.php]]''  beschrieben herunter und pappt ihn so auf den eigenen Rechner, wie es erklärt wird. Hat man es richtig angestellt, steht er fortan zur Verfügung und man kann ihn unter uses einbinden:@@

<code delphi>
interface

uses
  Windows, Messages, SysUtils, Variants,
  Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,
  DGLOpenGL; // Der Open GL Header von www.delphiGL.com
</code>

~~@@color(darkcyan):*)Ich habe einfach mal den Worten auf ''[[DelphiGL|http://www.delphigl.com/index.php]]''  geglaubt, das dieser Header um Welten besser sei, als der von Borland mitgelieferte ~OpenGL Header, der sich angeblich nicht an GL Normen hält, veraltet und blöde ist... und ich glaube stinken soll er auch.
<<
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Ein ~OpenGL Template (VCL)>>

@@color(darkcyan):So, den  ''[[OpenGL Header]]'' haben wir also, dann kann es ja losgehen mit einem sogenannten [[Template|Begriff Template]].
Nachdem ich das Quickstart (VCL) Tutorial zweimal gelesen und einmal ausprobiert habe, dämmert mir langsam wie denn nun das ganze ungefähr funtioniert.

Folgende Grundbausteine werden im Quickstart Tutorial für das eigene (VCL) Template empfohlen und erklärt:@@
#@@color(darkcyan):Die ''[[Initialisierung von OpenGL|OpenGL Template Initialisierung von OpenGL]]''@@ @@color(green)://   //@@
#@@color(darkcyan):Ein ''[[Eventhandler OnResize|OpenGL Template Eventhandler OnResize]]''@@ @@color(green)://   //@@
#@@color(darkcyan):Die eigentliche ''[[Zeichenroutine|OpenGL Template Zeichenroutine]]''@@ @@color(green)://   //@@
#@@color(darkcyan):Das ''[[Aufrufen der Zeichenroutine|OpenGL Template Aufruf zum Rendern Vergleich]]'' über@@
##@@color(darkcyan): Eine ''[[Timerfunktion|OpenGL Template Timerfunktion]]''@@ @@color(green)://   //@@
##@@color(darkcyan):Ein ''[[Event OnIdle|OpenGL Template Event OnIdle]]''@@ @@color(green)://   //@@
#@@color(darkcyan):Ein ''[[FormDestroy|OpenGL Template FormDestroy]]''@@ @@color(green)://   //@@
#@@color(darkcyan):Ein ''[[Errorhandler|OpenGL Template Errorhandler]]''@@ @@color(green)://   //@@
#@@color(darkcyan):Ein ''[[Setup|OpenGL Template zusätzliche Initialisierungen SetupGL]]''@@ @@color(green):// Für zusätzliche Starteigenschaften von ~OpenGL //@@
#@@color(darkcyan):Festlegung von ''[[globalen Variablen für OpenGL|OpenGL Template zusätzliche Initialisierungen globale Variablen]]''@@
@@color(darkcyan):Hat man alles richtig zusammengesetzt und noch ein wenig dabei mitgedacht, entsteht ein fertiges Template:@@
| <<gradient vert #aaccbb #ffffff #aaccbb >>''[[Mein erstes OpenGL Template (VCL)]]'' >> | Mit Zeichenroutine auf ''~OnIdle'' |
| <<gradient vert #aaccbb #ffffff #aaccbb >>''[[Mein zweites OpenGL Template (VCL)]]'' >> | Mit Zeichenroutine auf ''Timer'' |
<<<
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Die beiden Möglichkeiten im direkten Vergleich>>

@@color(darkcyan): Im ~Quickstart-Tutorial auf http://www.DelpgiGL.com wird von Methode 1 und 2 gesprochen - soweit ich das mit meinem Anfängerwissen zur Zeit abschätzen kann, gibt es aber noch viele weitere Methoden um den [[Render-Kontext|Open GL Template Zeichenroutine]] aufzurufen. Sei es drum, schauen wir uns an, wo genau die Unterschiede liegen zwischen:@@
##[[Aufruf OnIdle|OpenGL Template Event OnIdle]]
##[[Aufruf mit Timer|OpenGL Template Timerfunktion]]
@@color(darkcyan): Mit meinen Worten würde ich es so beschreiben: Bei OnIdle holt man zwar das maximale aus dem Rechner heraus, weil man ihn zwingt immer dann, wenn er im Leerlauf ist (OnIdle) das Bild neu zu zeichnen, völlig egal ob dies erforderlich ist oder nicht; treibt allerdings dadurch auch die Leerlaufleistung (erkennbar im Taskmanager) meist auf 100% - Der sogenannte ~Akku-Killer für Laptops. Bei [[OnTimer|OpenGL Template Timerfunktion]] steuert man das Geschehen direkter und kontrolliert direkter wann genau und vor allem wie oft neu zu zeichnen ist.

Auf [[DelphiGL|http://www.delphigl.com/index2.php]] gibt es hierzu diese schöne Tabelle:@@


|<<gradient vert #aaccbb #ffffff #aaccbb >> |
| ''Argument'' | ''OnIdle'' | ''Timer'' |
|Max Framezahl erreichbar| ja | nein |
|Framezahl steuerbar |bedingt | ja |
|Flüssige Animationen? (Egoshooter) | ja | bedingt |
|Für Menüs nutzbar?| ja | ja |
|Für einfache Animationen nutzbar? (Strategiespiele) | ja | ja |
|Laptopfreundlich (Anti-Akku-Killer) | nein | ja |
>>|
@@color(darkcyan):Wie man sieht gibt es für beide Varianten Argumente und man muß selbst entscheiden, was man möchte.@@
<<<

<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Der ~OpenGL ~ErrorHandler>>
<code delphi>
{------------------------------------------------------------------------------}
{                              OpenGL ErrorHandler                             }
{------------------------------------------------------------------------------}
procedure TForm1.ErrorHandlerGL;
begin
  Form1.Caption := gluErrorString(glGetError);
end;
</code>

@@color(darkcyan):Wie man sieht, sieht man nicht viel... die Procedure hier gibt lediglich gl Fehler auf der Form Caption aus. Zu bemerken ist noch, das glGetError {{{GL_NO_ERROR}}} zurückliefert, wenn alles ok ist. Im Tutorial wird erwähnt, das man den Fehler selbstverständlich auch in ein logfile schreiben lassen kann und man ihn keineswegs auf den Fensterrahmen pinseln muß.@@
<<<
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Wenn du nix zu tun hast, kehr den Hof. Der Aufruf "wenn untätig, dann" - ~OnIdle>>
<code delphi>
{------------------------------------------------------------------------------}
{                          OpenGL Render Aufruf OnIdle                         }
{------------------------------------------------------------------------------}
procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
begin
  StartTime:= GetTickCount;
  Render;
  DrawTime:= GetTickCount - StartTime;
  Inc(TimeCount, DrawTime);
  Inc(FrameCount);
 
  if TimeCount >= 1000 then begin
    Frames:= FrameCount;
    TimeCount:= TimeCount - 1000;
    FrameCount:= 0;
    Caption:= InttoStr(Frames) + 'FPS';
    ErrorHandler;
  end;
 
  Done:= false;
end;
</code>

Hier werden zwei Dinge gemacht, bei jedem ''[[OnIdle]]'' Ereignis wird "Render" aufgerufen - also unser ''[[Render-Kontext|OpenGL Template Zeichenroutine]]'', zugleich wird aber auch noch die allseits bekannte und beliebte Framerate errechnet und in Fensterrahmen ausgegeben.
<<<
<<<
@@color(darkcyan):Hier nun also unsere Antwort auf das Ereignis Resize... Laut Tutorial ist dies deshalb so wichtig, weil ja direkt auf die Form (oder ein Panel) gezeichnet wird. @@

<code delphi>
{------------------------------------------------------------------------------}
{                            Ereignishandler Resize                            }
{------------------------------------------------------------------------------}
procedure TForm1.FormResize(Sender: TObject);
var tmpBool : Boolean;
begin
  glViewport(0, 0, ClientWidth, ClientHeight);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);    
 
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  IdleHandler(Sender, tmpBool);
end;
</code>

@@color(darkcyan):Aber was passiert denn hier genau? @@
#@@color(darkcyan):Die Variable tmpBool ist laut Tutorial ein Dummy, der für den [[IdleHandler|OpenGL Template Event OnIdle]] benötigt wird.@@
#@@color(darkcyan):Der [[glViewport]] bestimmt die Größe der Ausgabe, die sich durch das Resize ja verändert hat.@@
#@@color(darkcyan):GL_PROJECTION wird benutzt, um nachfolgend die ~OpenGL-Ausgabe zu manipulieren.@@
#@@color(darkcyan):[[glLoadIdentity]] füllt die aktuelle Matrix mit der Identitätsmatrix.@@ @@color(green):// Das nehmen wir jetzt mal unverstanden hin...und wundern uns, warum es gleich zweimal da steht.//@@
#@@color(darkcyan):[[gluPerspective]] bestimmt, wie der Betrachter die Welt sehen soll.@@
#@@color(darkcyan):GL_MODELVIEW wird benutzt, um ~OpenGL mit Daten zu füttern.@@
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>{{{KAPUTTMACHEN!}}} ~FormDestroy.>>
<code delphi>
{------------------------------------------------------------------------------}
{                                 FormDestroy                                  }
{------------------------------------------------------------------------------}
procedure TForm1.FormDestroy(Sender: TObject);
begin
  DeactivateRenderingContext;
  DestroyRenderingContext(RC);
  ReleaseDC(Handle, DC);
end;
</code>
@@color(darkcyan):Bei ~FormDestroy wird der ~RenderingContext deaktiviert und freigegeben, den wir zuvor so mühevoll in der Initialisierung gestartet haben.@@
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Die Initialisierung von ~OpenGL>>
@@color(darkcyan):Die Initialisierung von ~OpenGL soll laut Quickstart Tutorial bereits innerhalb von ~FormCreate stattfinden und sieht unspektakulär kurz aber dennoch ersteinmal wenig verständlich aus:@@

<code delphi>
procedure TForm1.FormCreate(Sender: TObject);
begin
{------------------------------------------------------------------------------}
{                            OpenGL Initialisierung                            }
{------------------------------------------------------------------------------}

  DC:= GetDC(Handle);
  if not InitOpenGL then Application.Terminate;
  RC:= CreateRenderingContext( DC,
                               [opDoubleBuffered],
                               32,
                               24,
                               0,0,0,
                               0);
  ActivateRenderingContext(DC, RC);

{------------------------------------------------------------------------------}
{                 Aufruf zusätzlicher OpenGL Initialisierungen                 }
{------------------------------------------------------------------------------}
  SetupGL;
{------------------------------------------------------------------------------}
{                    Aufruf der Zeichenschleife OnIdle                         }
{------------------------------------------------------------------------------}
  Application.OnIdle := IdleHandler;
end;
</code>
@@color(darkcyan):Das Tutorial gibt uns hierfür zunächst folgende Erleuterungen:@@

<<gradient horiz #cceedd #ffffff #cceedd >>''Zeile 07'': Hier wird der Gerätekontext (Device Context) von Formular Form1 abgefragt.
@@color(green)://Um ehrlich zu sein, sagt mir das nicht viel... nehmen wir es jetzt einfach ersteinmal so hin.//@@
''Zeile 08'': Das versteht man schon eher, wenn ~InitOpenGL nicht klappt, dann mach ma aus hier... 
''Zeile 09'': Hier wird der Renderkontext erzeugt. Den braucht ~OpenGL zum Zeichnen auf das Formular. 
@@color(green)://Das Tutorial verspricht weitere Erleuterungen zu einem späteren Zeitpunkt... nun gut, warten wirs ab.//@@
''Zeile15'': Hier wird der zuvor erzeugte Kontext aktiviert.
''Zeile20'': Die zusätzlichen Bedingungen werden aufgerufen.
''Zeile24'': Die Zeichenschleife wird gestartet.>>

@@color(darkcyan):Die zusätzlichen ~OpenGL Initialisierungen, die im Tutorial ~QuickstartVCL beschrieben werden im Einzelnen:@@
##''[[SetupGL|OpenGL Template zusätzliche Initialisierungen SetupGL]]''
##''[[Globale Variablen für OpenGL definieren|OpenGL Template zusätzliche Initialisierungen globale Variablen]]''
<<<
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Der Render Aufruf über einen Timer>>

<code delphi>
{------------------------------------------------------------------------------}
{                        OpenGL Render Aufruf mit Timer                        }
{------------------------------------------------------------------------------}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   inc(FrameCount);
   Render;
   If FrameCount = 20 then
      begin
           ErrorHandler;
           FrameCount := 0;
      end;
end;
</code>

@@color(darkcyan): Auf ~DelphiGL gibt es im Quickstart Tutorial hierzu keine weitere Erläuterung, was in Delphi ein [[Timer|Delphi Timer]] ist, wird nochmals in Erinnerung gerufen. Der [[ErrorHandler|OpenGL Template Errorhandler]] wird separat erklärt.@@
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Das Herzstück>>
@@color(darkcyan):Hier wird nun endlich bestimmt, was zu zeichnen ist.
<code delphi>
{------------------------------------------------------------------------------}
{                             OpenGL Render Routine                            }
{------------------------------------------------------------------------------}
procedure TForm1.Render;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
 
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
 
  glTranslatef(0, 0, -5);
 
  glBegin(GL_QUADS);
    glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
    glColor3f(0, 1, 0); glVertex3f(1, 0, 0);
    glColor3f(0, 0, 1); glVertex3f(1, 1, 0);
    glColor3f(1, 1, 0); glVertex3f(0, 1, 0);
  glEnd;
 
  SwapBuffers(DC);
end;
</code>
Einiges davon kennen wir ja bereits aus dem ''[[Resize Event|Open GL Template Eventhandler OnResize]]''. Aber der Reihe nach:@@

<<gradient vert #aaccbb #ffffff #aaccbb >>''Zeile 06'': Dieser Aufruf sorgt dafür, dass Farbpuffer und Tiefenpuffer gelöscht werden. Wobei genau genommen nichts gelöscht, sondern mit der, bei der ''[[zusätzlichen Initilisierung im Setup|Open GL Template zusätzliche Initialisierungen SetupGL]]'' festgelegten Clearcolor überschrieben wird. 
''Zeile 10'': Auch hier wird die Perspektive gesetzt, genau wie im ''[[Resize Event|Open GL Template Eventhandler OnResize]]''.Damit nach einem Resize sich nicht plötzlich die Perspektive ändert, sollten die beiden Werte auch gleich sein.
''Zeile 15'': Hier rückt man etwas weg, indem man in negativer Z Richtung (die -5) Abstand vom Geschehen nimmt. Damit verhindert man, das die Darstellung durch das ~NearClipping teilweise oder ganz weggeschnitten wird.
''Zeilen 17-22'': Hier wird also gezeichnet... das Ergebnis ist ein buntes Viereck...Dabei sind wohl die Zahlen hinter glVertex3f jeweils die Eckpunkte, die Zahlen vorn hinter glColor3f bestimmen die Farben.
''Zeilen 24'':SwapBuffers sorgt dafür, dass der Inhalt des FrameBuffers auf dem Bildschirm erscheint. Ohne diesen Befehl sieht man laut Tutorial nichts in ~OpenGL @@color(green)://Wieder nehmen wir das hin, ohne es bis ins letzte zu verstehen.//@@>>

!!!<<gradient vert #aaccbb #ffffff #aaccbb >>Nagut, jetzt haben wir bestimmt, was zu zeichnen ist, aber ohne das auch aufzurufen, wird nicht viel passieren.>>
Sofern sich etwas bewegen soll (Spiele, Demos, Animationen) muß dieser Aufruf regelmässig erfolgen. Für einen solchen schleifenartigen Aufruf gibt es zwei verschiedene Möglichkeiten.
##@@color(darkcyan): Eine ''[[Timerfunktion|Open GL Template Timerfunktion]]''@@ @@color(green)://   //@@
##@@color(darkcyan):Ein ''[[Event OnIdle|OpenGL Template Event OnIdle]]''@@ @@color(green)://   //@@
<<<
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>~SetupGL>>
@@color(darkcyan):Dieses zusätzliche Setup für ~OpenGL wird im Tutorial empfohlen *) um vordefinierte Randbedingungen, welche es eigentlich sowieso immer gibt zu setzen.

<code delphi>
{------------------------------------------------------------------------------}
{                          OpenGL zusätzliches Setup                           }
{------------------------------------------------------------------------------}

procedure TForm1.SetupGL;
begin
  glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  glEnable(GL_DEPTH_TEST);          //Tiefentest aktivieren
  glEnable(GL_CULL_FACE);           //Backface Culling aktivieren
end;
</code>

~~*)Im Quickstart Tutorial wird dieses Setup zwar empfohlen, jedoch ist bis auf die Hintergrundfarbe kein erkennbarer Unterschied zu sehen, egal ob man die Zeilen auskommentiert oder nicht. Was sich hinter ''[[Tiefentest]]'' und ''[[Backface Culling]]'' verbirgt kommt in späteren Lektionen. Auch ist nicht angegeben, was die Maximalwerte für die Farben sind, warum es 4 Werte sind anstelle von 3.
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Globale Variablen für das ~OpenGL Template>>

@@color(darkcyan):Laut Tutorial benötigen wir noch ein paar globale Variable:@@

<code delphi>
var
  Form1: TForm1;
{------------------------------------------------------------------------------}
{                        Globale Variablen für OpenGL                          }
{------------------------------------------------------------------------------}

  const Nearclipping = 1;
  const FarClipping = 1000;

implementation
</code>
@@color(darkcyan):Dabei ist Nearclipping dafür zuständig, wie nah man an Objekte heran kann, bevor sie nicht mehr gerendert werden und Farclipping legt fest, wie weit Objekte weg sein können bevor sie nicht mehr gerendert werden.@@
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
Als ich am Wassergrabscher gearbeitet habe, und zum echtzeit Motion Capture kam, stellte ich fest, irgendeiner meiner unterprozesse scheint zu langsam zu sein um bei größerem Rahmen noch in "Echtzeit" mitzukommen.
Leider wusste ich nicht wie man ermittelt wie lange ein bestimmter Prozess eigentlich dauert.

Auf ~DelphiPraxis.net wurde ich fündig:

<code delphi>
procedure Test();
var
  start : Cardinal;
  dauer : Cardinal;
begin
  start := GetTickCount();
  // Mach was langes
  dauer  := GetTickCount() - start;
end;
</code>

Das hat für meine Zwecke ersteinmal genügt, weiterführend wurde im Verlauf des Forumthreads darauf hingewiesen, dass dies im Einzelfall zu ungenau sein könnte und man mit anderen Methoden exakter arbeiten könne. Leider gabs kein so schönes Code Beispiel und ich war bereits wundgegoogelt an dem Tag. Hier das Zitat aus dem Thread:
<<<
@@color(darkgreen):vielleicht noch ein Hinweis: ~GetTickCount ist nicht so hochauflösend, wie das Ergebnis glauben macht, da die Auflösung vom Systemtimer abhängig ist. Dieser arbeitet aber meist mit weit geringerer Auflösung als 1 ms. Mit Suche im Microsoft Developers ~NetworkGetSystemTimeAdjustment lässt sich dieser Wert herausfinden.
Evtl. wäre Suche im Microsoft Developers ~NetworkQueryPerformanceCounter zusammen mit Suche im Microsoft Developers ~NetworkQueryPerformanceFrequency besser. Die erreichte Auflösung geht ja nach PC bis zur Prozessorfrequenz.@@
<<<
<code delphi>
procedure QuickSort(var A: array of Integer; iLo, iHi: Integer) ;
var
  Lo, Hi, Pivot, T: Integer;
begin
  Lo := iLo;
  Hi := iHi;
  Pivot := A[(Lo + Hi) div 2];
  repeat
    while A[Lo] < Pivot do Inc(Lo) ;
    while A[Hi] > Pivot do Dec(Hi) ;
    if Lo <= Hi then
    begin
      T := A[Lo];
      A[Lo] := A[Hi];
      A[Hi] := T;
      Inc(Lo) ;
      Dec(Hi) ;
    end;
  until Lo > Hi;
  if Hi > iLo then QuickSort(A, iLo, Hi) ;
  if Lo < iHi then QuickSort(A, Lo, iHi) ;
end;
</code>
/***
|Name|RecentChangesPlugin|
|Source|http://www.TiddlyTools.com/#RecentChangesPlugin|
|Version|2.1.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|display droplist of recently changed tiddlers with goto, edit, and preview buttons|
!!!!!Usage
<<<
The {{{<<recentChanges>>}}} macro displays a droplist of all tiddlers that have been changed within the last N days (default=10 days).  
<<<
!!!!!Examples
<<<
{{smallform{
{{{<<recentChanges>>}}}
><<recentChanges>>
or
{{{<<recentChanges #ofdays summary>>}}}
>where:
>* #ofdays specifies the time limit for list changed tiddlers.  Use 0 (zero) to list all tiddlers in the document
>* "summary" is a keyword that outputs only the summary text (without the droplist or buttons)
>{{{<<recentChanges 14 summary>>}}}
><<recentChanges 14 summary>>
or
{{{<<recentChanges #ofdays previewheight previewclass>>}}}
>where:
>* #ofdays specifies the time limit for list changed tiddlers.  Use 0 (zero) to list all tiddlers in the document
>* previewheight is a CSS height measurement and sets the FIXED height of the tiddler preview area (default is 15em)
>* previewclass is any CSS classname, and can be used to apply custom styles to the preview area (default is to use the standard 'viewer' class)
>{{{<<recentChanges 14 10em groupbox>>}}}
><<recentChanges 14 10em groupbox>>
}}}
<<<
!!!!!Revisions
<<<
2008.07.01 [2.1.0] added optional "summary" keyword for simply text output
2008.05.01 [2.0.1] fixup for titles with double-quotes
2007.07.26 [2.0.0] re-written as plugin
2006.10.02 [1.0.0] initial release (as inline script ShowRecentChanges)
<<<
!!!!!Code
***/
//{{{
version.extensions.RecentChangesPlugin= {major: 2, minor: 1, revision: 0, date: new Date(2008,7,1)};

config.shadowTiddlers.RecentChanges="<<recentChanges>>";

config.macros.recentChanges = {
	layout: '<form><!--\
		--><select size=1 name="list" style="width:69.5%" \
			onchange=" \
				this.form.goto.disabled=this.form.edit.disabled=this.form.preview.disabled=!this.value.length; \
				var target=this.parentNode.parentNode.nextSibling; removeChildren(target); \
				if (!this.value.length) \
					{ target.style.display=\'none\'; this.form.preview.value=\'preview\'; } \
				else if (target.style.display==\'block\') { \
					wikify(\'<\'+\'<tiddler [[\'+this.value+\']]>\'+\'>\',target); \
					target.style.display=\'block\'; \
					this.form.preview.value=\'done\'; \
				} \
			"><!--\
		-->%options%<!--\
		--></select><!--\
		--><input type="button" name="goto" value="goto" disabled title="view selected tiddler" style="width:10%" \
			onclick="var target=this.parentNode.parentNode.nextSibling; removeChildren(target); \
				target.style.display=\'none\'; this.form.preview.value=\'preview\'; \
				story.displayTiddler(story.findContainingTiddler(this),this.form.list.value); \
			"><!--\
		--><input type="button" name="edit" value="edit" disabled title="edit selected tiddler" style="width:10%" \
			onclick="var target=this.parentNode.parentNode.nextSibling; removeChildren(target); \
				target.style.display=\'none\'; this.form.preview.value=\'preview\'; \
				story.displayTiddler(story.findContainingTiddler(this),this.form.list.value,DEFAULT_EDIT_TEMPLATE); \
			"><!--\
		--><input type="button" name="preview" value="preview" disabled title="show/hide tiddler preview" style="width:10%" \
			onclick="var target=this.parentNode.parentNode.nextSibling; \
				if (this.value==\'preview\') { \
					removeChildren(target); \
					wikify(\'<\'+\'<tiddler [[\'+this.form.list.value+\']]>\'+\'>\',target); \
					target.style.display=this.form.list.value.length?\'block\':\'none\'; this.value=\'done\'; \
				} else { \
					removeChildren(target); \
					target.style.display=\'none\'; this.value=\'preview\'; \
				} \
			"><!--\
		--></form>',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var days=10; if (!isNaN(params[0])) days=parseInt(params[0]); // time limit in days (use 0 for all tiddlers)
		var summary=params[1]&&params[1].toLowerCase()=="summary"; if (summary) params.shift();
		var height='15em'; if (params[1]) height=params[1]; // preview area fixed height
		var previewclass='viewer'; if (params[2]) previewclass=params[2]; // preview area CSS class
		var tiddlers=store.getTiddlers('modified','excludeLists').reverse();
		var count=tiddlers.length;
		if (days) {
			var timelimit=(new Date()).getTime()-86400000*days;
			for (var count=0; count<tiddlers.length && tiddlers[count].modified>timelimit; count++);
		}
		var s=count+' Einträge geändert seit  ';
		s+=new Date(timelimit).formatString("DDD, MMM DDth YYYY 0hh:0mm");
		s+=' ('+days+' days ago)';
		if (summary)
			{ wikify(s,place); return; }
		var opts='<option value="">'+s+'</option>';
		for (var i=0; i<count; i++) { var t=tiddlers[i];
			opts+='<option value="'+t.title.replace(/"/g,"&#x22;")+'">';
			opts+=t.modified.formatString('YYYY.0MM.0DD 0hh:0mm')+' - '+t.title;
			opts+='</option>';
		}
		createTiddlyElement(place,"div").innerHTML=this.layout.replace(/%options%/,opts);
		var preview=createTiddlyElement(place,"div",null,previewclass);
		preview.style.display='none';
		preview.style.whiteSpace='normal';
		preview.style.overflow='auto';
		preview.style.height=height;
	}
}
//}}}
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>
@@color(darkcyan):Resource ''Dateien'' habe ich erstmals kennengelernt, als es darum ging eine Grafik und einen kleinen Sound in meine exe Datei ''einzubinden'', so dass sie mitgeliefert wird und nicht auf einem fremden Rechner erst vorhanden sein muß.@@

*[[Eine Resource Datei erstellen und einbinden.]]
*[[Beispiele zur Verwendung von Resource Dateien]]
*[[Verschiedene Resourcentypen]]
>>
<<<
Hier entsteht die Linkliste für die STL Betrachter Credits
/***
|Name|SearchOptionsPlugin|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Documentation|http://www.TiddlyTools.com/#SearchOptionsPluginInfo|
|Version|2.9.2|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.search, TiddlyWiki.prototype.search, config.macros.search.onKeyPress|
|Options|##Configuration|
|Description|extend core search function with additional user-configurable options|
Extend core search function with additional user-configurable options including selecting which data items to search, enabling/disabling incremental key-by-key searches, and generating a ''list of matching tiddler'' instead of immediately displaying all matches.  This plugin also adds syntax for rendering 'search links' within tiddler content to embed one-click searches using pre-defined 'hard-coded' search terms.
!!!!!Documentation
>see [[SearchOptionsPluginInfo]]
!!!!!Configuration
<<<
Search in:
<<option chkSearchTitles>> titles <<option chkSearchText>> text <<option chkSearchTags>> tags <<option chkSearchFields>> fields <<option chkSearchShadows>> shadows
<<option chkSearchList>> Show list of matches
<<option chkSearchListTiddler>> Write list to [[SearchResults]] tiddler
<<option chkIncrementalSearch>> Incremental (key-by-key) searching
<<option chkSearchTitlesFirst>> Show title matches first
<<option chkSearchByDate>> Sort matching tiddlers by date
<<<
!!!!!Revisions
<<<
2008.08.25 [2.9.2] added animation to #searchResults DIV.  Also, DIV is only auto-created if it does not exist ... and when closed, the DIV is simply hidden rather than removed.  This allows custom placement of search results report in the PageTemplate definition.
|please see [[SearchOptionsPluginInfo]] for additional revision details|
2005.10.18 [1.0.0] Initial Release
<<<
!!!!!Code
***/
//{{{
version.extensions.searchOptions = {major: 2, minor: 9, revision: 2, date: new Date(2008,8,25)};

if (config.options.chkSearchTitles===undefined) config.options.chkSearchTitles=true;
if (config.options.chkSearchText===undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags===undefined) config.options.chkSearchTags=true;
if (config.options.chkSearchFields===undefined) config.options.chkSearchFields=true;
if (config.options.chkSearchTitlesFirst===undefined) config.options.chkSearchTitlesFirst=true;
if (config.options.chkSearchList===undefined) config.options.chkSearchList=true;
if (config.options.chkSearchListTiddler===undefined) config.options.chkSearchListTiddler=false;
if (config.options.chkSearchByDate===undefined) config.options.chkSearchByDate=false;
if (config.options.chkIncrementalSearch===undefined) config.options.chkIncrementalSearch=true;
if (config.options.chkSearchShadows===undefined) config.options.chkSearchShadows=true;
if (config.macros.search.reportTitle==undefined)
	config.macros.search.reportTitle="SearchResults"; // note: not a cookie!
//}}}

//{{{
// searchLink formatter:
// syntax: [search[text to find]] OR [search[text to display|text to find]]
config.formatters.push( {
	name: "searchLink",
	match: "\\[search\\[",
	lookaheadRegExp: /\[search\[(.*?)(?:\|(.*?))?\]\]/mg,
	prompt: "search for: '%0'",
	handler: function(w)
	{
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var label=lookaheadMatch[1];
			var text=lookaheadMatch[2]||label;
			var prompt=this.prompt.format([text]);
			var btn=createTiddlyButton(w.output,label,prompt,
				function(){story.search(this.getAttribute("searchText"))},"searchLink");
			btn.setAttribute("searchText",text);
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
});
//}}}

//{{{
config.macros.search.searchOptions_onKeyPress = config.macros.search.onKeyPress;
config.macros.search.onKeyPress = function(e)
{
	if(!e) var e = window.event;
	if (config.options.chkIncrementalSearch || e.keyCode==13 || e.keyCode==10 || e.keyCode==27)
		config.macros.search.searchOptions_onKeyPress.apply(this,arguments);
}
//}}}

//{{{
Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
	highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
	var matches = store.search(highlightHack,config.options.chkSearchByDate?"modified":"title","excludeSearch");
	if (config.options.chkSearchByDate) matches=matches.reverse(); // most recent changes first
	var q = useRegExp ? "/" : "'";
	clearMessage();
	if (!matches.length) {
		if (config.options.chkSearchListTiddler) discardSearchResults();
		displayMessage(config.macros.search.failureMsg.format([q+text+q]));
	} else {
		if (config.options.chkSearchList||config.options.chkSearchListTiddler) 
			reportSearchResults(text,matches);
		else {
			var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);
			this.closeAllTiddlers(); story.displayTiddlers(null,titles);
			displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));
		}
	}
	highlightHack = null;
}
//}}}

//{{{
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)
{
	var candidates = this.reverseLookup("tags",excludeTag,false,sortField);

	// scan for matching titles first...
	var results = [];
	if (config.options.chkSearchTitles) {
		for(var t=0; t<candidates.length; t++)
			if(candidates[t].title.search(searchRegExp)!=-1)
				results.push(candidates[t]);
		if (config.options.chkSearchShadows)
			for (var t in config.shadowTiddlers)
				if ((t.search(searchRegExp)!=-1) && !store.tiddlerExists(t))
					results.push((new Tiddler()).assign(t,config.shadowTiddlers[t]));
	}
	// then scan for matching text, tags, or field data
	for(var t=0; t<candidates.length; t++) {
		if (config.options.chkSearchText && candidates[t].text.search(searchRegExp)!=-1)
			results.pushUnique(candidates[t]);
		if (config.options.chkSearchTags && candidates[t].tags.join(" ").search(searchRegExp)!=-1)
			results.pushUnique(candidates[t]);
		if (config.options.chkSearchFields && store.forEachField!=undefined) // requires TW2.1 or above
			store.forEachField(candidates[t],
				function(tid,field,val) {
					if (val.search(searchRegExp)!=-1) results.pushUnique(candidates[t]);
				},
				true); // extended fields only
	}
	// then check for matching text in shadows
	if (config.options.chkSearchShadows)
		for (var t in config.shadowTiddlers)
			if ((config.shadowTiddlers[t].search(searchRegExp)!=-1) && !store.tiddlerExists(t))
				results.pushUnique((new Tiddler()).assign(t,config.shadowTiddlers[t]));

	// if not 'titles first', or sorting by modification date,  re-sort results to so titles, text, tag and field matches are mixed together
	if(!sortField) sortField = "title";
	var bySortField=function (a,b) {if(a[sortField] == b[sortField]) return(0); else return (a[sortField] < b[sortField]) ? -1 : +1; }
	if (!config.options.chkSearchTitlesFirst || config.options.chkSearchByDate) results.sort(bySortField);

	return results;
}
//}}}

//{{{
// SearchResults REPORT GENERATOR

// hijack core <<search>> macro to add "report" and "simple inline" output
config.macros.search.SOP_handler=config.macros.search.handler;
config.macros.search.handler = function(place,macroName,params)
{
	// if "report", use SearchOptionsPlugin report generator for inline output
	if (params[1]&&params[1].substr(0,6)=="report") {
		var keyword=params[0];
		var options=params[1].split("=")[1]; // split "report=option+option+..."
		var heading=params[2]?params[2].unescapeLineBreaks():"";
		var matches=store.search(new RegExp(keyword.escapeRegExp(),"img"),"title","excludeSearch");
		if (matches.length) wikify(heading+window.formatSearchResults(keyword,matches,options),place);
	} else if (params[1]) {
		var keyword=params[0];
		var heading=params[1]?params[1].unescapeLineBreaks():"";
		var seperator=params[2]?params[2].unescapeLineBreaks():", ";
		var matches=store.search(new RegExp(keyword.escapeRegExp(),"img"),"title","excludeSearch");
		if (matches.length) {
			var out=[];
			for (var m=0; m<matches.length; m++) out.push("[["+matches[m].title+"]]");
			wikify(heading+out.join(seperator),place);
		}
	} else
		config.macros.search.SOP_handler.apply(this,arguments);
};

if (!window.reportSearchResults) window.reportSearchResults=function(text,matches)
{
	// create/update the tiddler
	var body=window.formatSearchResults(text,matches);
	if (config.options.chkSearchListTiddler) {
		var title=config.macros.search.reportTitle;
		var who=config.options.txtUserName;
		var when=new Date();
		var tags="excludeLists excludeSearch temporary";
		var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
		tiddler.set(title,body,who,when,tags);
		store.addTiddler(tiddler);
		story.closeTiddler(title);
		story.displayTiddler(null,title);
		store.notify(title,true);
	} else {
		var sr=document.getElementById("searchResults");
		if (!sr) {
			sr=createTiddlyElement(null,"div","searchResults","tiddler");
			var da=document.getElementById("displayArea");
			da.insertBefore(sr,da.firstChild);
		}
		addClass(sr,"tiddler");
		sr.onmouseover = function(e){ addClass(this,"selected"); }
		sr.onmouseout = function(e){ removeClass(this,"selected"); }
		sr.style.zIndex = "1000";
		removeChildren(sr);
		if (config.macros.moveablePanel) wikify("<<moveablePanel>>",sr); /* see MoveablePanelPlugin */
		var tb=createTiddlyElement(sr,"div",null,"toolbar");
		var b=createTiddlyButton(tb, "open all", "open all matching tiddlers", function() {
				story.displayTiddlers(null,this.getAttribute("list").readBracketedList());
			},"button");
		var list=""; for(var t=0;t<matches.length;t++) list+='[['+matches[t].title+']] ';
		b.setAttribute("list",list);
		var b=createTiddlyButton(tb, "close", "dismiss search results", function() {
				var sr=document.getElementById("searchResults");
				if(!config.options.chkAnimate) {
					sr.style.display="none";
					removeChildren(sr);
				} else {
					var s=new Slider(sr,false,false,"children");
					anim.startAnimating(s);
				}
			}, "button");
		createTiddlyText(createTiddlyElement(sr,"div",null,"title"),"Search Results");
		wikify(body,createTiddlyElement(sr,"div",null,"viewer"));
		if (sr.style.display!="block") {
			if(!config.options.chkAnimate)
				sr.style.display="block";
			else {
				var s=new Slider(sr,true,false,"none");
				s.callback=function(e,p){e.style.overflow="visible";}
				anim.startAnimating(s);
			}
		}
		window.scrollTo(0,ensureVisible(sr));
	}
}

if (!window.formatSearchResults) window.formatSearchResults=function(text,matches,opt)
{
	var title=config.macros.search.reportTitle
	var q = config.options.chkRegExpSearch ? "/" : "'";
	var body="";
	if (!opt) var opt="all";
	var parts=opt.split("+");
	for (var i=0; i<parts.length; i++) { var p=parts[i].toLowerCase();
		if (p=="summary"||p=="all")
			body+=window.formatSearchResults_summary(text,matches);
		if (p=="list"||p=="all")
			body+=window.formatSearchResults_list(text,matches);
		if (p=="buttons"||p=="all")
			body+=window.formatSearchResults_buttons(text,matches);
		if (p=="again"||p=="all")
			body+=window.formatSearchResults_again(text,matches);
	}
	return body;
}

if (!window.formatSearchResults_summary) window.formatSearchResults_summary=function(text,matches)
{
	// summary: nn tiddlers found matching '...', options used
	var title=config.macros.search.reportTitle
	var q = config.options.chkRegExpSearch ? "/" : "'";
	var body="";
	body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\n";
	body+="^^//searched in:// ";
	body+=(config.options.chkSearchTitles?"''titles'' ":"");
	body+=(config.options.chkSearchText?"''text'' ":"");
	body+=(config.options.chkSearchTags?"''tags'' ":"");
	body+=(config.options.chkSearchFields?"''fields'' ":"");
	body+=(config.options.chkSearchShadows?"''shadows'' ":"");
	if (config.options.chkCaseSensitiveSearch||config.options.chkRegExpSearch) {
		body+=" //with options:// ";
		body+=(config.options.chkCaseSensitiveSearch?"''case sensitive'' ":"");
		body+=(config.options.chkRegExpSearch?"''text patterns'' ":"");
	}
	body+="^^\n";
	return body;
}

if (!window.formatSearchResults_list) window.formatSearchResults_list=function(text,matches)
{
	// bullet list of links to matching tiddlers
	var body="";
	for(var t=0;t<matches.length;t++) {
		var date=config.options.chkSearchByDate?(matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" "):"";
		body+="* "+date+"[["+matches[t].title+"]]\n";
	}
	return body;
}

if (!window.formatSearchResults_buttons) window.formatSearchResults_buttons=function(text,matches)
{
	// embed buttons only if writing SearchResults to tiddler
	if (!config.options.chkSearchListTiddler) return "";

	// open all matches button
	var body="";
	var title=config.macros.search.reportTitle;
	body+="@@diplay:block;<html><input type=\"button\" href=\"javascript:;\" ";
	body+="onclick=\"story.displayTiddlers(null,["
	for(var t=0;t<matches.length;t++)
		body+="'"+matches[t].title.replace(/\'/mg,"\\'")+"'"+((t<matches.length-1)?", ":"");
	body+="],1);\" accesskey=\"O\" value=\"open all matching tiddlers\"></html> ";

	// discard search results button
	body+="<html><input type=\"button\" href=\"javascript:;\" ";
	body+="onclick=\"discardSearchResults()\" value=\"discard "+title+"\"></html>";
	body+="@@\n";
	return body;
}

if (!window.formatSearchResults_again) window.formatSearchResults_again=function(text,matches)
{
	var title=config.macros.search.reportTitle
	var body="";
	// search again
	body+="!!!Search again:\n";
	body+="<<search \""+text+"\">>\n";
	body+="<<option chkSearchTitles>>titles ";
	body+="<<option chkSearchText>>text ";
	body+="<<option chkSearchTags>>tags";
	body+="<<option chkSearchFields>>fields";
	body+="<<option chkSearchShadows>>shadows";
	body+="<br>";
	body+="<<option chkCaseSensitiveSearch>>case-sensitive ";
	body+="<<option chkRegExpSearch>>text patterns";
	body+="<<option chkSearchByDate>>sort by date";
	body+="<br>";
	return body;
}


if (!window.discardSearchResults) window.discardSearchResults=function()
{
	// remove the tiddler
	story.closeTiddler(config.macros.search.reportTitle);
	store.deleteTiddler(config.macros.search.reportTitle);
	store.notify(config.macros.search.reportTitle,true);
}
//}}}
<<<

Manchmal möchte man das Seitenverhältnis beim Resize beibehalten, das funktioniert ganz gut, indem man die Message zum Resize abfängt:

<code delphi>
  private
    { Private-Deklarationen }
       procedure FWM_Sizing(var AMsg: TMessage); message wm_sizing;
</code>

und ein Beispiel wie das dann aussieht folgt hier:
<code delphi>
procedure TForm3.FWM_Sizing(var AMsg: TMessage);
var lRect      : PRect;

    lNewHeight,
    lNewWidth  : Integer;
begin

  lRect := PRect(AMsg.LParam);
  lNewHeight := lRect.Bottom - lRect.Top + 1;
  lNewWidth  := lRect.Right - lRect.Left + 1;
  case AMsg.WParam of
    WMSZ_BOTTOM, WMSZ_TOP: lRect.Right  := lRect.Left + Round(lNewHeight * WZSeitenV);
    WMSZ_LEFT, WMSZ_RIGHT: lRect.Bottom := lRect.Top + Round(lNewWidth * WZSeitenV);
    //übrig bleibt noch was passieren soll wenn jemand direkt eine Ecke anpackt
  end;
  inherited;
end;
</code>

<<<
/***
|Name|SetIconPlugin|
|Source|http://www.TiddlyTools.com/#SetIconPlugin|
|Documentation|http://www.TiddlyTools.com/#SetIconPluginInfo|
|Version|1.8.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.3|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|add an image to a toolbar, macro, or slider link|
!!!!!Documentation
>see [[SetIconPluginInfo]]
!!!!!Configuration
<<<
<<option chkIconsShowImage>> show images on links
<<option chkIconsShowText>> include link text with images
default image style: {{stretch{<<option txtIconsCSS>>}}}
<<<
!!!!!Revisions
<<<
2008.05.11 [1.8.0] added optional 'notext' value for iconpos to force text to be hidden for specific links
| see [[SetIconPluginInfo]] for additional revision details |
2008.05.09 [1.0.0] initial release (as inline script)
<<<
!!!!!Code
***/
//{{{
version.extensions.SetIconPlugin= {major: 1, minor: 8, revision: 0, date: new Date(2008,5,11)};

if (config.options.chkIconsShowImage===undefined)
	config.options.chkIconsShowImage=true;
if (config.options.chkIconsShowText===undefined)
	config.options.chkIconsShowText=true;
if (config.options.txtIconsCSS===undefined)
	config.options.txtIconsCSS="vertical-align:middle;width:auto;height:auto";

config.macros.setIcon = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		if (!config.options.chkIconsShowImage) return; // text-only - do nothing
		if (!params[0]) return; // no image src specified - do nothing

		// find nearest link element
		var btn=place.lastChild; // look for sibling link
		while (btn && btn.nodeName!="A") btn=btn.previousSibling;
		if (!btn) { // look for child link
			var links=place.getElementsByTagName("A");
			if (links.length) btn=links[links.length-1];
		}
		if (!btn) { // look for parent link
			var btn=place.parentNode.lastChild;
			while (btn && btn.nodeName!="A") btn=btn.previousSibling;
		}
		if (!btn) { // look for cousin link
			var links=place.parentNode.getElementsByTagName("A");
			if (links.length) btn=links[links.length-1];
		}
		if (!btn) return; // can't find a link - do nothing

		// set icon and command text/tip
		var txt=btn.innerHTML;
		var src=params[0];  // default to direct URL
		if (config.macros.attach && config.macros.attach.isAttachment(src))
			src=config.macros.attach.getAttachment(src); // retrieve attachment (if any)
		var css=params[1]; if (!css||!css.length) css=config.options.txtIconsCSS;
		var after=params[2]&&params[2].toUpperCase()=="RIGHT";
		var notext=params[2]&&params[2].toUpperCase()=="NOTEXT";
		btn.innerHTML="<img src='"+src+"' style='"+css+"'>";
		if (config.options.chkIconsShowText && !notext)
			btn.innerHTML=after?txt+btn.innerHTML:btn.innerHTML+txt;
		else
			btn.title=txt.toUpperCase()+": "+btn.title; // add text to tooltip

		// adjust nested slider button text/tip
		if (btn.getAttribute("closedtext")!=null) {
			btn.setAttribute("closedtext",btn.innerHTML);
			btn.setAttribute("openedtext",btn.innerHTML);
			if (!config.options.chkIconsShowText || notext) {
				btn.setAttribute("closedtip",txt.toUpperCase()+": "+btn.getAttribute("closedtip"));
				btn.setAttribute("openedtip",txt.toUpperCase()+": "+btn.getAttribute("openedtip"));
			}
		}
	}
};
//}}}
/***
|Name|SetIconPlugin|
|Source|http://www.TiddlyTools.com/#SetIconPlugin|
|Documentation|http://www.TiddlyTools.com/#SetIconPluginInfo|
|Version|1.8.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.3|
|Type|documentation|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|documentation for SetIconPluginInfo|
!!!!!Syntax
<<<
{{{
<<setIcon image style iconpos>>
}}}
where:
*''image''<br>is a tiddlername for an attached image or a URL for an external image
*''style''<br>(optional) is CSS style attributes applied to the image (default="vertical-align:middle;width:auto;height:auto")
*''iconpos''<br>(optional) indicates the placement of the image relative to the link text.  Use keywords: ''left'', ''right'' or ''notext'' (default=''left'', i.e., the text follows the image).  ''notext'' hides the link text, even if the global option (see Configuration section, below) is set to display the link text along with image.  //Note:  when specifying the non-default //''right''// or //''notext''// value, you can use "" as a placeholder for the ''style'' parameter to apply the standard CSS styles)//
<<<
!!!!!Usage
<<<
First, create a link element using any of:
* ''links:''<br>&nbsp;&nbsp;"""[[TiddlerName]]""" or """[[text|TiddlerName]]""" or """[[text|URL]]"""
* ''macros that generate links:''<br>&nbsp;&nbsp;"""<<toolbar ...>>""", """<<slider ...>>""", """<<saveChanges>>""", etc.
* ''inline sliders:'' (using NestedSlidersPlugin)<br>&nbsp;&nbsp;"""+++[sliderlabel]...==="""
* '''onclick' scripts:'' (using InlineJavascriptPlugin)<br>&nbsp;&nbsp;"""<script label="...">...</script>"""
* ''~HTML-based links:''<br>&nbsp;&nbsp;"""<html><a href="...">...</a></html>"""
* ''transcluded links:'' (where the output of the specified ~TiddlerName contains a link)<br>&nbsp;&nbsp;"""<<tiddler TiddlerName>>""" 
Then, ''embed the """<<setIcon>>""" macro immediately following the generated link''.  The macro looks for the last rendered //sibling// link element that occurs within the same DOM container and adds the specified image to that link.  It is important to note that the macro does not initially look within the //child// DOM elements of the current container.  This is necessary so that 'sliderPanel' content created by the """<<slider>>""" macro can be skipped over, allowing the correct 'sliderButton' link element to be located.

When you use the """<<tiddler>>""" macro to transclude content containing a link, or you directly embed a link using HTML syntax, the resulting link element will //always// be rendered within a //child// DOM element container.  However, the """<<setIcon>>""" macro only looks within //child// DOM elements when no //sibling// link elements are found within the current DOM container.  In order to ensure that the """<<setIcon>>""" macro will not inadvertently find a sibling link element, you will need to isolate the child DOM element container link along with the associated """<<setIcon>>""" macro that follows it by enclosing the both elements within a surrounding SPAN 'class wrapper' element, like this:
{{{
{{span{<<tiddler SomeTranscludedLink>><<setIcon ...>>}}}
{{span{<html><a href="...">...</a></html><<setIcon ...>>}}}
}}}
This same technique should also be applied for any other macros that may generate output that is nested within their own containing DOM elements.  Similarly, in addition to """<<tiddler>>""" and ~HTML-based content, link elements that are defined directly within a ViewTemplate or EditTemplate definition using """<span macro='...'></span>""" are also rendered within their own DOM element containers.  In order to ensure that the associated """<span macro='setIcon ...'></span>""" macro will locate the correct template-defined link element, it should be inserted //within// the span that invokes the link-generating macro, like this:
{{{
<span macro='...'><span macro='setIcon ...'></span></span>
}}}
or, your can surround the paired link+icon sequence in an enclosing span, like this:
{{{
<span><span macro='...'></span><span macro='setIcon ...'></span></span>
}}}
so that the span containing the link element is a //cousin// (i.e., a //child// of the //parent// container) of the span that invokes the setIcon macro.

''In general, whether the link element is rendered in tiddler content or directly from a template, if you are uncertain when an 'isolation span' is needed, you can always choose to surround every link+icon sequence within a enclosing span, regardless of the type of link content being rendered.''
<<<
!!!!!Examples
<<<
''~TiddlyLink:'' [[About]]<<setIcon information.png>>
{{{
[[About]]<<setIcon information.png>>
}}}
''toolbar command:'' <<toolbar jump>><<setIcon page_go.png>>
{{{
in tiddler content:
	<<toolbar jump>><<setIcon page_go.png>>
in template definitions:
	<span class='toolbar' macro='toolbar jump'><span macro='setIcon page_go.png'></span></span>
}}}
''slider macro:''<<slider "" PluginManager Plugins "view installed plugin status">><<setIcon cog.png>>
{{{
in tiddler content:
	<<slider "" PluginManager Plugins "view installed plugin status">><<setIcon cog.png>>
in template definitions:
	<span macro='slider ...'><span macro='setIcon page_go.png'></span></span>
}}}
''nested (inline) slider:'' +++[settings]<<list filter [tag[settings]]>>===<<setIcon wrench.png>>
{{{
+++[settings]
	<<list filter [tag[settings]]>>
===<<setIcon wrench.png>>
}}}
''onclick script:'' <script label="print document">window.print();</script><<setIcon printer.png>>
{{{
<script label="print document">
	window.print();
</script><<setIcon printer.png>>
}}}
''tiddler macro:'' {{span{<<tiddler SiteUrl>><<setIcon exclamation.png>>}}}
{{{
in tiddler content:
	{{span{<<tiddler SiteUrl>><<setIcon exclamation.png>>}}}
in template definitions:
	<span macro='tiddler ...'><span macro='setIcon exclamation.png'></span></span>
}}}
''HTML link:'' {{span{<html><a href="http://www.TiddlyWiki.com">TiddlyWiki.com</a></html><<setIcon server_go.png>>}}}
{{{
in tiddler content:
	{{span{<html><a href="http://www.TiddlyWiki.com">TiddlyWiki.com</a></html><<setIcon server_go.png>>}}}
in template definitions:
	<span><a href="http://www.TiddlyWiki.com">TiddlyWiki.com</a><span macro='setIcon server_go.png'></span></span>
}}}
''macro link:'' {{span{<<saveChanges>><<setIcon disk.png>>}}}
{{{
in tiddler content:
	{{span{<<saveChanges>><<setIcon disk.png>>}}}
in template definitions:
	<span macro='saveChanges'><span macro='setIcon disk.png'></span></span>
}}}
<<<
!!!!!Configuration
<<<
<<option chkIconsShowImage>> show icons on links //(unchecked=text-only)//
^^{{{<<option chkIconsShowImage>>}}}^^
<<option chkIconsShowText>> include link text with images //(unchecked=icons-only, ignored if no icons displayed)//
^^{{{<<option chkIconsShowText>>}}}^^
default image style: {{stretch{<<option txtIconsCSS>>}}}
^^{{{<<option txtIconsCSS>>}}}^^
<<<
!!!!!Revisions
<<<
2008.05.11 [1.8.0] added optional 'notext' value for iconpos to force text to be hidden for specific links
2008.05.11 [1.7.0] support use within template definitions by looking for nearest link using: siblings, children, parents, or cousins.  Also, major documentation re-write with improved examples
2008.05.11 [1.6.0] added optional iconpos param to control icon placement ("left" or "right", default="left")
2008.05.10 [1.5.0] converted to plugin/macro and reduced code size by moving documentation into SetIconPluginInfo
2008.05.10 [1.4.0] handle links contained in {{{<<tiddler>>}}} and {{{<html>...</html}}}
2008.05.10 [1.3.0] added support for setting styles on images
2008.05.09 [1.2.0] handle links created by TiddlyLinks, sliders, and nested sliders syntax
2008.05.09 [1.1.0] added support for external URLs and options for displaying text with images
2008.05.09 [1.0.0] initial release (as inline script)
<<<
<<search>><<closeAll>><<permaview>><<newTiddler label: "Neuer Eintrag">><<newTiddler label:"Neuer Begriff" tag:"Begriffe" text:{{store.getTiddlerText('Begriff Blanko')}}>>
<<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
/***
!Metadata:
|''Name:''|SimpleClockPlugin|
|''Description:''||
|''Version:''|1.0.0|
|''Date:''|Apr 16, 2007|
|''Source:''|http://sourceforge.net/project/showfiles.php?group_id=150646|
|''Author:''|BramChen (bram.chen (at) gmail (dot) com)|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License]]|
|''~CoreVersion:''|2.2.0|
|''Browser:''|Firefox 1.5+,IE6,Opera9|
!Usage:
{{{

<<simpleclock scFormat simpleClock>>
}}}
!Revision History:
|''Version''|''Date''|''Note''|
|1.0.0|Apr 16, 2007|Initial release|
!Code section:
***/

//{{{
version.extensions.simpleclock = {major: 1, minor: 0, revision: 0, date: new Date("Apr 16, 2007")};

if (typeof ptwAddons == "undefined") ptwAddons = {};

merge(ptwAddons, {
	simpleClock:{
		scFormat:"YYYY-0MM-0DD 0hh:0mm:0ss", 
		scName: "simpleClock",
		scRefresh: function (wrapper,scFormat){
			var now = new Date();
			wrapper.innerHTML = now.formatString(scFormat);
			return false;
		}
	}
});

config.macros.simpleclock = {};

config.macros.simpleclock.handler = function(place,macroName,params){
	var scFormat = params[0]?params[0]:ptwAddons.simpleClock.scFormat;
	var scName = params[1]?params[1]:ptwAddons.simpleClock.scName;
	var wrapper = createTiddlyElement(place,'span',scName,scName);
	var scInterval = setInterval(function(){ptwAddons.simpleClock.scRefresh(wrapper,scFormat);},1000);
}
//}}}
meine kleine Codeschnipselsammlung für ''DELPHI'' und ''~OpenGL''
''~Code-Wölfchen''
<<gradient vert #cceedd #ffffff #cceedd >>

Will man ein Array von Zahlen sortieren stehen einem verschiedene Sortieralgorythmen zur Verfügung.
Unterschieden werden hauptsächlich:

# ~Bubble-Sort
# ~Insertion-Sort
# ~Selection-Sort
# ~Merge-Sort
# ~Shell-Sort
# [[Quicksort]] 
# [[Heapsort]].

Zusammengefasst kann man sagen, das Quicksort, wohl das beliebteste sein dürfte, da es in vielen Fällen das schnellste ist. Allerdings kann es unter bestimmten Umständen auch sehr langsam sein. Den zweiten Platz in meinem persönlichen Ranking nimmt deswegen Heapsort ein, das zwar einen Ticken langsamer als Quicksort ist, aber nie langsam werden kann.

Näheres lernt man hier:
http://www.delphipraxis.net/topic344_tutorial+sortieralgorithmen+iii.html&highlight=tutorial+sortieren 
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Sound aufnehmen>>

Sound lässt sich recht simpel aufnehmen indem man ~mmSystem unter uses einbindet.
<code delphi>
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, mmSystem, MPlayer;
</code>

danach lässt sich über folgenden Code durch Buttonklick ein Sound aufnehmen.

<code delphi>
procedure TForm1.Button1Click(Sender: TObject);
begin
panel3.Caption:='AUFNAHME!';

     mciSendString('OPEN NEW TYPE WAVEAUDIO ALIAS mySound',nil,0,Handle);
     mciSendString('SET mySound ' +
                   'TIME FORMAT MS ' +
                   'BITSPERSAMPLE 16 ' +
                   'CHANNELS 2 ' +
                   'SAMPLESPERSEC 44100 ' +
                   'BYTESPERSEC 176400 ' +
                   'ALIGNMENT 4',
                   nil,0,handle);
     mciSendString('RECORD mySound',nil,0,Handle);

end;
</code>

durch einen zweiten Button lässt sich dieser Sound dann als wave abspeichern:

<code delphi>
procedure TForm1.Button2Click(Sender: TObject);
begin
    panel3.Caption:='Aufnahme gestoppt!';
     mciSendString('STOP mySound',nil,0,Handle);
     mciSendString('SAVE mySound "g:\sounddatei.wav"',nil,0,Handle);
     mciSendString('CLOSE mySound',nil,0,Handle);
end;
</code>
/***
StyleSheet for ~SyntaxHighlighter
***/

/*{{{*/
.dp-highlighter
{
	font-family: "Consolas", "Courier New", Courier, mono, serif;
	font-size: 12px;
	background-color: #E7E5DC;
	width: 99%;
	overflow: auto;
	margin: 18px 0 18px 0 !important;
	padding-top: 1px; /* adds a little border on top when controls are hidden */
}

/* clear styles */
.dp-highlighter ol,
.dp-highlighter ol li,
.dp-highlighter ol li span 
{
	margin: 0;
	padding: 0;
	border: none;
}

.dp-highlighter a,
.dp-highlighter a:hover
{
	background: none;
	border: none;
	padding: 0;
	margin: 0;
}

.dp-highlighter .bar
{
	padding-left: 45px;
}

.dp-highlighter.collapsed .bar,
.dp-highlighter.nogutter .bar
{
	padding-left: 0px;
}

.dp-highlighter ol
{
	list-style: decimal; /* for ie */
	background-color: #fff;
	margin: 0px 0px 1px 45px !important; /* 1px bottom margin seems to fix occasional Firefox scrolling */
	padding: 0px;
	color: #5C5C5C;
}

.dp-highlighter.nogutter ol,
.dp-highlighter.nogutter ol li
{
	list-style: none !important;
	margin-left: 0px !important;
}

.dp-highlighter ol li,
.dp-highlighter .columns div
{
	list-style: decimal-leading-zero; /* better look for others, override cascade from OL */
	list-style-position: outside !important;
	border-left: 3px solid #6CE26C;
	background-color: #F8F8F8;
	color: #5C5C5C;
	padding: 0 3px 0 10px !important;
	margin: 0 !important;
	line-height: 14px;
}

.dp-highlighter.nogutter ol li,
.dp-highlighter.nogutter .columns div
{
	border: 0;
}

.dp-highlighter .columns
{
	background-color: #F8F8F8;
	color: gray;
	overflow: hidden;
	width: 100%;
}

.dp-highlighter .columns div
{
	padding-bottom: 5px;
}

.dp-highlighter ol li.alt
{
	background-color: #FFF;
	color: inherit;
}

.dp-highlighter ol li span
{
	color: black;
	background-color: inherit;
}

/* Adjust some properties when collapsed */

.dp-highlighter.collapsed ol
{
	margin: 0px;
}

.dp-highlighter.collapsed ol li
{
	display: none;
}

/* Additional modifications when in print-view */

.dp-highlighter.printing
{
	border: none;
}

.dp-highlighter.printing .tools
{
	display: none !important;
}

.dp-highlighter.printing li
{
	display: list-item !important;
}

/* Styles for the tools */

.dp-highlighter .tools
{
	padding: 3px 8px 3px 10px;
	font: 9px Verdana, Geneva, Arial, Helvetica, sans-serif;
	color: silver;
	background-color: #f8f8f8;
	padding-bottom: 10px;
	border-left: 3px solid #6CE26C;
}

.dp-highlighter.nogutter .tools
{
	border-left: 0;
}

.dp-highlighter.collapsed .tools
{
	border-bottom: 0;
}

.dp-highlighter .tools a
{
	font-size: 9px;
	color: #a0a0a0;
	background-color: inherit;
	text-decoration: none;
	margin-right: 10px;
}

.dp-highlighter .tools a:hover
{
	color: red;
	background-color: inherit;
	text-decoration: underline;
}

/* About dialog styles */

.dp-about { background-color: #fff; color: #333; margin: 0px; padding: 0px; }
.dp-about table { width: 100%; height: 100%; font-size: 11px; font-family: Tahoma, Verdana, Arial, sans-serif !important; }
.dp-about td { padding: 10px; vertical-align: top; }
.dp-about .copy { border-bottom: 1px solid #ACA899; height: 95%; }
.dp-about .title { color: red; background-color: inherit; font-weight: bold; }
.dp-about .para { margin: 0 0 4px 0; }
.dp-about .footer { background-color: #ECEADB; color: #333; border-top: 1px solid #fff; text-align: right; }
.dp-about .close { font-size: 11px; font-family: Tahoma, Verdana, Arial, sans-serif !important; background-color: #ECEADB; color: #333; width: 60px; height: 22px; }

/* Language specific styles */

.dp-highlighter .comment, .dp-highlighter .comments { color: #008200; background-color: inherit; }
.dp-highlighter .string { color: blue; background-color: inherit; }
.dp-highlighter .keyword { color: #069; font-weight: bold; background-color: inherit; }
.dp-highlighter .preprocessor { color: gray; background-color: inherit; }

/*}}}*/

/*{{{*/
/***** LAYOUT STYLES -  DO NOT EDIT! *****/
ul.suckerfish, ul.suckerfish ul {
	margin: 0;
	padding: 0;
	list-style: none;
	line-height:1.4em;
}

ul.suckerfish  li {
	display: inline-block; 
	display: block;
	float: left; 
}

ul.suckerfish li ul {
	position: absolute;
	left: -999em;
}

ul.suckerfish li:hover ul, ul.suckerfish li.sfhover ul {
	left: auto;
}

ul.suckerfish ul li {
	float: none;
	border-right: 0;
	border-left:0;
}

ul.suckerfish a, ul.suckerfish a:hover {
	display: block;
}

ul.suckerfish li a.tiddlyLink, ul.suckerfish li a, #mainMenu ul.suckerfish li a {font-weight:bold;}
/**** END LAYOUT STYLES *****/


/**** COLORS AND APPEARANCE - DEFAULT *****/
ul.suckerfish li a {
	padding: 0.5em 1.5em;
	color: #FFF;
	background: #224422;
	border-bottom: 0;
	font-weight:bold;
}

ul.suckerfish li:hover a, ul.suckerfish li.sfhover a{
	background: #336633;
}

ul.suckerfish li:hover ul a, ul.suckerfish li.sfhover ul a{
	color: #000;
	background: #eeffee;
	border-top:1px solid #FFF;
}

ul.suckerfish ul li a:hover {
	background: #ccddcc;
}

ul.suckerfish li a{
	width:9em;
}

ul.suckerfish ul li a, ul.suckerfish ul li a:hover{
	display:inline-block;
	width:9em;
}

ul.suckerfish li {
	border-left: 1px solid #005500;
}
/***** END COLORS AND APPEARANCE - DEFAULT *****/


/***** LAYOUT AND APPEARANCE: VERTICAL *****/
ul.suckerfish.vertical li{
	width:10em;
	border-left: 0px solid #005500;
}

ul.suckerfish.vertical ul li, ul.suckerfish.vertical li a, ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a {
	border-left: 0.8em solid #005500;
}

ul.suckerfish.vertical li a, ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a,  ul.suckerfish.vertical li.sfhover a:hover{
	width:8em;
}

ul.suckerfish.vertical {
	width:10em; text-align:left;
	float:left;
}

ul.suckerfish.vertical li a {
	padding: 0.5em 1em 0.5em 1em;
	border-top:1px solid  #fff;
}

ul.suckerfish.vertical, ul.suckerfish.vertical ul {
	line-height:1.4em;
}

ul.suckerfish.vertical li:hover ul, ul.suckerfish.vertical li.sfhover ul { 
	margin: -2.4em 0 0 10.9em;
}

ul.suckerfish.vertical li:hover ul li a, ul.suckerfish.vertical li.sfhover ul li a {
	border: 0px solid #FFF;
}

ul.suckerfish.vertical li:hover a, ul.suckerfish.vertical li.sfhover a{
	padding-right:1.1em;
}

ul.suckerfish.vertical li:hover ul li, ul.suckerfish.vertical li.sfhover ul li {
	border-bottom:1px solid  #fff;
}

/***** END LAYOUT AND APPEARANCE: VERTICAL *****/
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/

/***
!Metadata:
|''Name:''|SyntaxHighlighterPlugin|
|''Description:''|Code Syntax Highlighter Plugin for TiddlyWiki.|
|''Version:''|1.1.3|
|''Date:''|Oct 24, 2008|
|''Source:''|http://www.coolcode.cn/show-310-1.html|
|''Author:''|Ma Bingyao (andot (at) ujn (dot) edu (dot) cn)|
|''License:''|[[GNU Lesser General Public License|http://www.gnu.org/licenses/lgpl.txt]]|
|''~CoreVersion:''|2.4.1|
|''Browser:''|Firefox 1.5+; InternetExplorer 6.0; Safari; Opera; Chrome; etc.|

!Syntax:
{{{
<code options>
codes
</code>
}}}

!Examples:
{{{
<code java>
public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("HelloWorld!");
    }
}
</code>
}}}

!Revision History:
|''Version''|''Date''|''Note''|
|1.1.2|Oct 15, 2008|Optimize Highlight|
|1.0.0|Oct 13, 2008|Initial release|

!Code section:
***/
//{{{
var dp={sh:{Toolbar:{},Utils:{},RegexLib:{},Brushes:{},Strings:{AboutDialog:"<html><head><title>About...</title></head><body class=\"dp-about\"><table cellspacing=\"0\"><tr><td class=\"copy\"><p class=\"title\">dp.SyntaxHighlighter</div><div class=\"para\">Version: {V}</p><p><a href=\"http://www.dreamprojections.com/syntaxhighlighter/?ref=about\" target=\"_blank\">http://www.dreamprojections.com/syntaxhighlighter</a></p>&copy;2004-2007 Alex Gorbatchev.</td></tr><tr><td class=\"footer\"><input type=\"button\" class=\"close\" value=\"OK\" onClick=\"window.close()\"/></td></tr></table></body></html>"},ClipboardSwf:null,Version:"1.5.1"}};dp.SyntaxHighlighter=dp.sh;dp.sh.Toolbar.Commands={ExpandSource:{label:"+ expand source",check:function($){return $.collapse},func:function($,_){$.parentNode.removeChild($);_.div.className=_.div.className.replace("collapsed","")}},ViewSource:{label:"view plain",func:function($,_){var A=dp.sh.Utils.FixForBlogger(_.originalCode).replace(/</g,"&lt;"),B=window.open("","_blank","width=750, height=400, location=0, resizable=1, menubar=0, scrollbars=0");B.document.write("<textarea style=\"width:99%;height:99%\">"+A+"</textarea>");B.document.close()}},CopyToClipboard:{label:"copy to clipboard",check:function(){return window.clipboardData!=null||dp.sh.ClipboardSwf!=null},func:function($,A){var B=dp.sh.Utils.FixForBlogger(A.originalCode).replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&");if(window.clipboardData)window.clipboardData.setData("text",B);else if(dp.sh.ClipboardSwf!=null){var _=A.flashCopier;if(_==null){_=document.createElement("div");A.flashCopier=_;A.div.appendChild(_)}_.innerHTML="<embed src=\""+dp.sh.ClipboardSwf+"\" FlashVars=\"clipboard="+encodeURIComponent(B)+"\" width=\"0\" height=\"0\" type=\"application/x-shockwave-flash\"></embed>"}alert("The code is in your clipboard now")}},PrintSource:{label:"print",func:function($,B){var _=document.createElement("IFRAME"),A=null;_.style.cssText="position:absolute;width:0px;height:0px;left:-500px;top:-500px;";document.body.appendChild(_);A=_.contentWindow.document;dp.sh.Utils.CopyStyles(A,window.document);A.write("<div class=\""+B.div.className.replace("collapsed","")+" printing\">"+B.div.innerHTML+"</div>");A.close();_.contentWindow.focus();_.contentWindow.print();alert("Printing...");document.body.removeChild(_)}},About:{label:"?",func:function(_){var A=window.open("","_blank","dialog,width=300,height=150,scrollbars=0"),$=A.document;dp.sh.Utils.CopyStyles($,window.document);$.write(dp.sh.Strings.AboutDialog.replace("{V}",dp.sh.Version));$.close();A.focus()}}};dp.sh.Toolbar.Create=function(B){var A=document.createElement("DIV");A.className="tools";for(var _ in dp.sh.Toolbar.Commands){var $=dp.sh.Toolbar.Commands[_];if($.check!=null&&!$.check(B))continue;A.innerHTML+="<a href=\"#\" onclick=\"dp.sh.Toolbar.Command('"+_+"',this);return false;\">"+$.label+"</a>"}return A};dp.sh.Toolbar.Command=function(_,$){var A=$;while(A!=null&&A.className.indexOf("dp-highlighter")==-1)A=A.parentNode;if(A!=null)dp.sh.Toolbar.Commands[_].func($,A.highlighter)};dp.sh.Utils.CopyStyles=function(A,_){var $=_.getElementsByTagName("link");for(var B=0;B<$.length;B++)if($[B].rel.toLowerCase()=="stylesheet")A.write("<link type=\"text/css\" rel=\"stylesheet\" href=\""+$[B].href+"\"></link>")};dp.sh.Utils.FixForBlogger=function($){return(dp.sh.isBloggerMode==true)?$.replace(/<br\s*\/?>|&lt;br\s*\/?&gt;/gi,"\n"):$};dp.sh.RegexLib={MultiLineCComments:new RegExp("/\\*[\\s\\S]*?\\*/","gm"),SingleLineCComments:new RegExp("//.*$","gm"),SingleLinePerlComments:new RegExp("#.*$","gm"),DoubleQuotedString:new RegExp("\"(?:\\.|(\\\\\\\")|[^\\\"\"\\n])*\"","g"),SingleQuotedString:new RegExp("'(?:\\.|(\\\\\\')|[^\\''\\n])*'","g")};dp.sh.Match=function(_,$,A){this.value=_;this.index=$;this.length=_.length;this.css=A};dp.sh.Highlighter=function(){this.noGutter=false;this.addControls=true;this.collapse=false;this.tabsToSpaces=true;this.wrapColumn=80;this.showColumns=true};dp.sh.Highlighter.SortCallback=function($,_){if($.index<_.index)return-1;else if($.index>_.index)return 1;else if($.length<_.length)return-1;else if($.length>_.length)return 1;return 0};dp.sh.Highlighter.prototype.CreateElement=function(_){var $=document.createElement(_);$.highlighter=this;return $};dp.sh.Highlighter.prototype.GetMatches=function(_,B){var $=0,A=null;while((A=_.exec(this.code))!=null)this.matches[this.matches.length]=new dp.sh.Match(A[0],A.index,B)};dp.sh.Highlighter.prototype.AddBit=function($,A){if($==null||$.length==0)return;var C=this.CreateElement("SPAN");$=$.replace(/ /g,"&nbsp;");$=$.replace(/</g,"&lt;");$=$.replace(/\n/gm,"&nbsp;<br>");if(A!=null){if((/br/gi).test($)){var _=$.split("&nbsp;<br>");for(var B=0;B<_.length;B++){C=this.CreateElement("SPAN");C.className=A;C.innerHTML=_[B];this.div.appendChild(C);if(B+1<_.length)this.div.appendChild(this.CreateElement("BR"))}}else{C.className=A;C.innerHTML=$;this.div.appendChild(C)}}else{C.innerHTML=$;this.div.appendChild(C)}};dp.sh.Highlighter.prototype.IsInside=function(_){if(_==null||_.length==0)return false;for(var A=0;A<this.matches.length;A++){var $=this.matches[A];if($==null)continue;if((_.index>$.index)&&(_.index<$.index+$.length))return true}return false};dp.sh.Highlighter.prototype.ProcessRegexList=function(){for(var $=0;$<this.regexList.length;$++)this.GetMatches(this.regexList[$].regex,this.regexList[$].css)};dp.sh.Highlighter.prototype.ProcessSmartTabs=function(E){var B=E.split("\n"),$="",D=4,A="\t";function _(A,E,_){var B=A.substr(0,E),C=A.substr(E+1,A.length),$="";for(var D=0;D<_;D++)$+=" ";return B+$+C}function C(B,C){if(B.indexOf(A)==-1)return B;var D=0;while((D=B.indexOf(A))!=-1){var $=C-D%C;B=_(B,D,$)}return B}for(var F=0;F<B.length;F++)$+=C(B[F],D)+"\n";return $};dp.sh.Highlighter.prototype.SwitchToList=function(){var C=this.div.innerHTML.replace(/<(br)\/?>/gi,"\n"),B=C.split("\n");if(this.addControls==true)this.bar.appendChild(dp.sh.Toolbar.Create(this));if(this.showColumns){var A=this.CreateElement("div"),_=this.CreateElement("div"),E=10,G=1;while(G<=150)if(G%E==0){A.innerHTML+=G;G+=(G+"").length}else{A.innerHTML+="&middot;";G++}_.className="columns";_.appendChild(A);this.bar.appendChild(_)}for(var G=0,D=this.firstLine;G<B.length-1;G++,D++){var $=this.CreateElement("LI"),F=this.CreateElement("SPAN");$.className=(G%2==0)?"alt":"";F.innerHTML=B[G]+"&nbsp;";$.appendChild(F);this.ol.appendChild($)}this.div.innerHTML=""};dp.sh.Highlighter.prototype.Highlight=function(C){function A($){return $.replace(/^\s*(.*?)[\s\n]*$/g,"$1")}function $($){return $.replace(/\n*$/,"").replace(/^\n*/,"")}function _(B){var E=dp.sh.Utils.FixForBlogger(B).split("\n"),C=new Array(),D=new RegExp("^\\s*","g"),$=1000;for(var F=0;F<E.length&&$>0;F++){if(A(E[F]).length==0)continue;var _=D.exec(E[F]);if(_!=null&&_.length>0)$=Math.min(_[0].length,$)}if($>0)for(F=0;F<E.length;F++)E[F]=E[F].substr($);return E.join("\n")}function D(A,$,_){return A.substr($,_-$)}var F=0;if(C==null)C="";this.originalCode=C;this.code=$(_(C));this.div=this.CreateElement("DIV");this.bar=this.CreateElement("DIV");this.ol=this.CreateElement("OL");this.matches=new Array();this.div.className="dp-highlighter";this.div.highlighter=this;this.bar.className="bar";this.ol.start=this.firstLine;if(this.CssClass!=null)this.ol.className=this.CssClass;if(this.collapse)this.div.className+=" collapsed";if(this.noGutter)this.div.className+=" nogutter";if(this.tabsToSpaces==true)this.code=this.ProcessSmartTabs(this.code);this.ProcessRegexList();if(this.matches.length==0){this.AddBit(this.code,null);this.SwitchToList();this.div.appendChild(this.bar);this.div.appendChild(this.ol);return}this.matches=this.matches.sort(dp.sh.Highlighter.SortCallback);for(var E=0;E<this.matches.length;E++)if(this.IsInside(this.matches[E]))this.matches[E]=null;for(E=0;E<this.matches.length;E++){var B=this.matches[E];if(B==null||B.length==0)continue;this.AddBit(D(this.code,F,B.index),null);this.AddBit(B.value,B.css);F=B.index+B.length}this.AddBit(this.code.substr(F),null);this.SwitchToList();this.div.appendChild(this.bar);this.div.appendChild(this.ol)};dp.sh.Highlighter.prototype.GetKeywords=function($){return"\\b"+$.replace(/ /g,"\\b|\\b")+"\\b"};dp.sh.BloggerMode=function(){dp.sh.isBloggerMode=true};dp.sh.HighlightAll=function(N,B,K,I,O,E){function A(){var $=arguments;for(var _=0;_<$.length;_++){if($[_]==null)continue;if(typeof($[_])=="string"&&$[_]!="")return $[_]+"";if(typeof($[_])=="object"&&$[_].value!="")return $[_].value+""}return null}function J($,_){for(var A=0;A<_.length;A++)if(_[A]==$)return true;return false}function L(A,B,C){var _=new RegExp("^"+A+"\\[(\\w+)\\]$","gi"),$=null;for(var D=0;D<B.length;D++)if(($=_.exec(B[D]))!=null)return $[1];return C}function C(B,A,_){var $=document.getElementsByTagName(_);for(var C=0;C<$.length;C++)if($[C].getAttribute("name")==A)B.push($[C])}var T=[],P=null,M={},$="innerHTML";C(T,N,"pre");C(T,N,"textarea");if(T.length==0)return;for(var R in dp.sh.Brushes){var F=dp.sh.Brushes[R].Aliases;if(F==null)continue;for(var G=0;G<F.length;G++)M[F[G]]=R}for(G=0;G<T.length;G++){var _=T[G],U=A(_.attributes["class"],_.className,_.attributes["language"],_.language),Q="";if(U==null)continue;U=U.split(":");Q=U[0].toLowerCase();if(M[Q]==null)continue;P=new dp.sh.Brushes[M[Q]]();_.style.display="none";P.noGutter=(B==null)?J("nogutter",U):!B;P.addControls=(K==null)?!J("nocontrols",U):K;P.collapse=(I==null)?J("collapse",U):I;P.showColumns=(E==null)?J("showcolumns",U):E;var D=document.getElementsByTagName("head")[0];if(P.Style&&D){var S=document.createElement("style");S.setAttribute("type","text/css");if(S.styleSheet)S.styleSheet.cssText=P.Style;else{var H=document.createTextNode(P.Style);S.appendChild(H)}D.appendChild(S)}P.firstLine=(O==null)?parseInt(L("firstline",U,1)):O;P.Highlight(_[$]);P.source=_;_.parentNode.insertBefore(P.div,_)}};version.extensions.SyntaxHighLighterPlugin={major:1,minor:1,revision:3,date:new Date(2008,10,24)};dp.sh.ClipboardSwf="clipboard.swf";dp.sh.Highlight=function(_,Q,B,J,H,M,D){function A(){var $=arguments;for(var _=0;_<$.length;_++){if($[_]==null)continue;if(typeof($[_])=="string"&&$[_]!="")return $[_]+"";if(typeof($[_])=="object"&&$[_].value!="")return $[_].value+""}return null}function I($,_){for(var A=0;A<_.length;A++)if(_[A]==$)return true;return false}function K(A,B,C){var _=new RegExp("^"+A+"\\[(\\w+)\\]$","gi"),$=null;for(var D=0;D<B.length;D++)if(($=_.exec(B[D]))!=null)return $[1];return C}var N=null,$="innerHTML";if(this.registered==undefined){var L={};for(var O in dp.sh.Brushes){var E=dp.sh.Brushes[O].Aliases;if(E==null)continue;for(var F=0;F<E.length;F++)L[E[F]]=O}this.registered=L}Q=Q.split(":");language=Q[0].toLowerCase();if(this.registered[language]==null)return;N=new dp.sh.Brushes[this.registered[language]]();_.style.display="none";N.noGutter=(B==null)?I("nogutter",Q):!B;N.addControls=(J==null)?!I("nocontrols",Q):J;N.collapse=(H==null)?I("collapse",Q):H;N.showColumns=(D==null)?I("showcolumns",Q):D;var C=document.getElementsByTagName("head")[0],P=document.getElementById(N.CssClass);if(N.Style&&C&&!P){P=document.createElement("style");P.setAttribute("id",N.CssClass);P.setAttribute("type","text/css");if(P.styleSheet)P.styleSheet.cssText=N.Style;else{var G=document.createTextNode(N.Style);P.appendChild(G)}C.appendChild(P)}N.firstLine=(M==null)?parseInt(K("firstline",Q,1)):M;N.Highlight(_[$]);N.source=_;_.parentNode.insertBefore(N.div,_)};config.formatters.push({name:"SyntaxHighlighter",match:"^<code[\\s]+[^>]+>\\n",element:"pre",handler:function(_){this.lookaheadRegExp=/<code[\s]+([^>]+)>\n((?:^[^\n]*\n)+?)(^<\/code>$\n?)/mg;this.lookaheadRegExp.lastIndex=_.matchStart;var $=this.lookaheadRegExp.exec(_.source);if($&&$.index==_.matchStart){var C=$[1],B=$[2];if(config.browser.isIE)B=B.replace(/\n/g,"\r");var A=createTiddlyElement(_.output,this.element,null,null,B);dp.sh.Highlight(A,C);_.nextMatch=$.index+$[0].length}}});config.formatterHelpers.enclosedTextHelper=function(_){this.lookaheadRegExp.lastIndex=_.matchStart;var $=this.lookaheadRegExp.exec(_.source);if($&&$.index==_.matchStart){var B=$[1];if(config.browser.isIE)B=B.replace(/\n/g,"\r");var A=createTiddlyElement(_.output,this.element,null,null,B);switch(_.matchText){case"/*{{{*/\n":dp.sh.Highlight(A,"css");break;case"//{{{\n":dp.sh.Highlight(A,"js");break;case"<!--{{{-->\n":dp.sh.Highlight(A,"xml");break}_.nextMatch=$.index+$[0].length}};dp.sh.Brushes.AS3=function(){var _="class interface package",$="Array Boolean Date decodeURI decodeURIComponent encodeURI encodeURIComponent escape "+"int isFinite isNaN isXMLName Number Object parseFloat parseInt "+"String trace uint unescape XML XMLList "+"Infinity -Infinity NaN undefined "+"as delete instanceof is new typeof "+"break case catch continue default do each else finally for if in "+"label return super switch throw try while with "+"dynamic final internal native override private protected public static "+"...rest const extends function get implements namespace set "+"import include use "+"AS3 flash_proxy object_proxy "+"false null this true "+"void Null";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"blockcomment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"definition"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp("var","gm"),css:"variable"}];this.CssClass="dp-as";this.Style=".dp-as .comment { color: #009900; font-style: italic; }"+".dp-as .blockcomment { color: #3f5fbf; }"+".dp-as .string { color: #990000; }"+".dp-as .preprocessor { color: #0033ff; }"+".dp-as .definition { color: #9900cc; font-weight: bold; }"+".dp-as .keyword { color: #0033ff; }"+".dp-as .variable { color: #6699cc; font-weight: bold; }"};dp.sh.Brushes.AS3.prototype=new dp.sh.Highlighter();dp.sh.Brushes.AS3.Aliases=["as","actionscript","ActionScript","as3","AS3"];dp.sh.Brushes.Bash=function(){var _="alias bg bind break builtin cd command compgen complete continue "+"declare dirs disown echo enable eval exec exit export fc fg "+"getopts hash help history jobs kill let local logout popd printf "+"pushd pwd read readonly return set shift shopt source "+"suspend test times trap type typeset ulimit umask unalias unset wait",$="case do done elif else esac fi for function if in select then "+"time until while";this.regexList=[{regex:dp.sh.RegexLib.SingleLinePerlComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("[()[\\]{}]","g"),css:"delim"},{regex:new RegExp("\\$\\w+","g"),css:"vars"},{regex:new RegExp("\\w+=","g"),css:"vars"},{regex:new RegExp("\\s-\\w+","g"),css:"flag"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"builtin"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-bash";this.Style=".dp-bash .builtin {color: maroon; font-weight: bold;}"+".dp-bash .comment {color: gray;}"+".dp-bash .delim {font-weight: bold;}"+".dp-bash .flag {color: green;}"+".dp-bash .string {color: red;}"+".dp-bash .vars {color: blue;}"};dp.sh.Brushes.Bash.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Bash.Aliases=["bash","sh"];dp.sh.Brushes.Batch=function(){var _="APPEND ATTRIB CD CHDIR CHKDSK CHOICE CLS COPY DEL ERASE DELTREE "+"DIR EXIT FC COMP FDISK FIND FORMAT FSUTIL HELP JOIN "+"LABEL LOADFIX MK MKDIR MEM MEMMAKER MORE MOVE MSD PCPARK "+"PRINT RD RMDIR REN SCANDISK SHARE SORT SUBST SYS "+"TIME DATE TREE TRUENAME TYPE UNDELETE VER XCOPY",$="DO ELSE FOR IN CALL CHOICE GOTO SHIFT PAUSE ERRORLEVEL "+"IF NOT EXIST LFNFOR START SETLOCAL ENDLOCAL ECHO SET";this.regexList=[{regex:new RegExp("REM.*$","gm"),css:"comment"},{regex:new RegExp("::.*$","gm"),css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("[()[\\]{}]","g"),css:"delim"},{regex:new RegExp("%\\w+%","g"),css:"vars"},{regex:new RegExp("%%\\w+","g"),css:"vars"},{regex:new RegExp("\\w+=","g"),css:"vars"},{regex:new RegExp("@\\w+","g"),css:"keyword"},{regex:new RegExp(":\\w+","g"),css:"keyword"},{regex:new RegExp("\\s/\\w+","g"),css:"flag"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"builtin"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-batch";this.Style=".dp-batch .builtin {color: maroon; font-weight: bold;}"+".dp-batch .comment {color: gray;}"+".dp-batch .delim {font-weight: bold;}"+".dp-batch .flag {color: green;}"+".dp-batch .string {color: red;}"+".dp-batch .vars {color: blue;font-weight: bold;}"};dp.sh.Brushes.Batch.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Batch.Aliases=["batch","dos"];dp.sh.Brushes.ColdFusion=function(){this.CssClass="dp-coldfusion";this.Style=".dp-coldfusion { font: 13px \"Courier New\", Courier, monospace; }"+".dp-coldfusion .tag, .dp-coldfusion .tag-name { color: #990033; }"+".dp-coldfusion .attribute { color: #990033; }"+".dp-coldfusion .attribute-value { color: #0000FF; }"+".dp-coldfusion .cfcomments { background-color: #FFFF99; color: #000000; }"+".dp-coldfusion .cfscriptcomments { color: #999999; }"+".dp-coldfusion .keywords { color: #0000FF; }"+".dp-coldfusion .mgkeywords { color: #CC9900; }"+".dp-coldfusion .numbers { color: #ff0000; }"+".dp-coldfusion .strings { color: green; }";this.mgKeywords="setvalue getvalue addresult viewcollection viewstate";this.keywords="var eq neq gt gte lt lte not and or true false "+"abs acos addsoaprequestheader addsoapresponseheader "+"arrayappend arrayavg arrayclear arraydeleteat arrayinsertat "+"arrayisempty arraylen arraymax arraymin arraynew "+"arrayprepend arrayresize arrayset arraysort arraysum "+"arrayswap arraytolist asc asin atn binarydecode binaryencode "+"bitand bitmaskclear bitmaskread bitmaskset bitnot bitor bitshln "+"bitshrn bitxor ceiling charsetdecode charsetencode chr cjustify "+"compare comparenocase cos createdate createdatetime createobject "+"createobject createobject createobject createobject createodbcdate "+"createodbcdatetime createodbctime createtime createtimespan "+"createuuid dateadd datecompare dateconvert datediff dateformat "+"datepart day dayofweek dayofweekasstring dayofyear daysinmonth "+"daysinyear de decimalformat decrementvalue decrypt decryptbinary "+"deleteclientvariable directoryexists dollarformat duplicate encrypt "+"encryptbinary evaluate exp expandpath fileexists find findnocase "+"findoneof firstdayofmonth fix formatbasen generatesecretkey "+"getauthuser getbasetagdata getbasetaglist getbasetemplatepath "+"getclientvariableslist getcontextroot getcurrenttemplatepath "+"getdirectoryfrompath getencoding getexception getfilefrompath "+"getfunctionlist getgatewayhelper gethttprequestdata gethttptimestring "+"getk2serverdoccount getk2serverdoccountlimit getlocale "+"getlocaledisplayname getlocalhostip getmetadata getmetricdata "+"getpagecontext getprofilesections getprofilestring getsoaprequest "+"getsoaprequestheader getsoapresponse getsoapresponseheader "+"gettempdirectory gettempfile gettemplatepath gettickcount "+"gettimezoneinfo gettoken hash hour htmlcodeformat htmleditformat "+"iif incrementvalue inputbasen insert int isarray isbinary isboolean "+"iscustomfunction isdate isdebugmode isdefined isk2serverabroker "+"isk2serverdoccountexceeded isk2serveronline isleapyear islocalhost "+"isnumeric isnumericdate isobject isquery issimplevalue issoaprequest "+"isstruct isuserinrole isvalid isvalid isvalid iswddx isxml "+"isxmlattribute isxmldoc isxmlelem isxmlnode isxmlroot javacast "+"jsstringformat lcase left len listappend listchangedelims listcontains "+"listcontainsnocase listdeleteat listfind listfindnocase listfirst "+"listgetat listinsertat listlast listlen listprepend listqualify "+"listrest listsetat listsort listtoarray listvaluecount "+"listvaluecountnocase ljustify log log10 lscurrencyformat lsdateformat "+"lseurocurrencyformat lsiscurrency lsisdate lsisnumeric lsnumberformat "+"lsparsecurrency lsparsedatetime lsparseeurocurrency lsparsenumber "+"lstimeformat ltrim max mid min minute month monthasstring now "+"numberformat paragraphformat parameterexists parsedatetime pi "+"preservesinglequotes quarter queryaddcolumn queryaddrow querynew "+"querysetcell quotedvaluelist rand randomize randrange refind "+"refindnocase releasecomobject removechars repeatstring replace "+"replacelist replacenocase rereplace rereplacenocase reverse right "+"rjustify round rtrim second sendgatewaymessage setencoding "+"setlocale setprofilestring setvariable sgn sin spanexcluding "+"spanincluding sqr stripcr structappend structclear structcopy "+"structcount structdelete structfind structfindkey structfindvalue "+"structget structinsert structisempty structkeyarray structkeyexists "+"structkeylist structnew structsort structupdate tan timeformat "+"tobase64 tobinary toscript tostring trim ucase urldecode urlencodedformat "+"urlsessionformat val valuelist week wrap writeoutput xmlchildpos "+"xmlelemnew xmlformat xmlgetnodetype xmlnew xmlparse xmlsearch xmltransform "+"xmlvalidate year yesnoformat";this.stringMatches=new Array();this.attributeMatches=new Array()};dp.sh.Brushes.ColdFusion.prototype=new dp.sh.Highlighter();dp.sh.Brushes.ColdFusion.Aliases=["coldfusion","cf"];dp.sh.Brushes.ColdFusion.prototype.ProcessRegexList=function(){function B(_,$){_[_.length]=$}function A(A,$){for(var _=0;_<A.length;_++)if(A[_]==$)return _;return-1}var _=null,$=null;this.GetMatches(new RegExp("\\b(\\d+)","gm"),"numbers");this.GetMatches(new RegExp(this.GetKeywords(this.mgKeywords),"igm"),"mgkeywords");this.GetMatches(dp.sh.RegexLib.SingleLineCComments,"cfscriptcomments");this.GetMatches(dp.sh.RegexLib.MultiLineCComments,"cfscriptcomments");this.GetMatches(new RegExp("(&lt;|<)!---[\\s\\S]*?---(&gt;|>)","gm"),"cfcomments");$=new RegExp("(cfset\\s*)?([:\\w-.]+)\\s*=\\s*(\".*?\"|'.*?')*","gm");while((_=$.exec(this.code))!=null){if(_[1]!=undefined&&_[1]!="")continue;if(_[3]!=undefined&&_[3]!=""&&_[3]!="\"\""&&_[3]!="''"){B(this.matches,new dp.sh.Match(_[2],_.index,"attribute"));B(this.matches,new dp.sh.Match(_[3],_.index+_[0].indexOf(_[3]),"attribute-value"));B(this.stringMatches,_[3]);B(this.attributeMatches,_[2])}}this.GetMatches(new RegExp("(&lt;|<)/*\\?*(?!\\!)|/*\\?*(&gt;|>)","gm"),"tag");$=new RegExp("(?:&lt;|<)/*\\?*\\s*([:\\w-.]+)","gm");while((_=$.exec(this.code))!=null)B(this.matches,new dp.sh.Match(_[1],_.index+_[0].indexOf(_[1]),"tag-name"));$=new RegExp(this.GetKeywords(this.keywords),"igm");while((_=$.exec(this.code))!=null)if(A(this.attributeMatches,_[0])==-1)B(this.matches,new dp.sh.Match(_[0],_.index,"keywords"));$=new RegExp("cfset\\s*.*(\".*?\"|'.*?')","gm");while((_=$.exec(this.code))!=null)if(_[1]!=undefined&&_[1]!=""){B(this.matches,new dp.sh.Match(_[1],_.index+_[0].indexOf(_[1]),"strings"));B(this.stringMatches,_[1])}while((_=dp.sh.RegexLib.DoubleQuotedString.exec(this.code))!=null)if(A(this.stringMatches,_[0])==-1)B(this.matches,new dp.sh.Match(_[0],_.index,"strings"));while((_=dp.sh.RegexLib.SingleQuotedString.exec(this.code))!=null)if(A(this.stringMatches,_[0])==-1)B(this.matches,new dp.sh.Match(_[0],_.index,"strings"))};dp.sh.Brushes.Cpp=function(){var _="ATOM BOOL BOOLEAN BYTE CHAR COLORREF DWORD DWORDLONG DWORD_PTR "+"DWORD32 DWORD64 FLOAT HACCEL HALF_PTR HANDLE HBITMAP HBRUSH "+"HCOLORSPACE HCONV HCONVLIST HCURSOR HDC HDDEDATA HDESK HDROP HDWP "+"HENHMETAFILE HFILE HFONT HGDIOBJ HGLOBAL HHOOK HICON HINSTANCE HKEY "+"HKL HLOCAL HMENU HMETAFILE HMODULE HMONITOR HPALETTE HPEN HRESULT "+"HRGN HRSRC HSZ HWINSTA HWND INT INT_PTR INT32 INT64 LANGID LCID LCTYPE "+"LGRPID LONG LONGLONG LONG_PTR LONG32 LONG64 LPARAM LPBOOL LPBYTE LPCOLORREF "+"LPCSTR LPCTSTR LPCVOID LPCWSTR LPDWORD LPHANDLE LPINT LPLONG LPSTR LPTSTR "+"LPVOID LPWORD LPWSTR LRESULT PBOOL PBOOLEAN PBYTE PCHAR PCSTR PCTSTR PCWSTR "+"PDWORDLONG PDWORD_PTR PDWORD32 PDWORD64 PFLOAT PHALF_PTR PHANDLE PHKEY PINT "+"PINT_PTR PINT32 PINT64 PLCID PLONG PLONGLONG PLONG_PTR PLONG32 PLONG64 POINTER_32 "+"POINTER_64 PSHORT PSIZE_T PSSIZE_T PSTR PTBYTE PTCHAR PTSTR PUCHAR PUHALF_PTR "+"PUINT PUINT_PTR PUINT32 PUINT64 PULONG PULONGLONG PULONG_PTR PULONG32 PULONG64 "+"PUSHORT PVOID PWCHAR PWORD PWSTR SC_HANDLE SC_LOCK SERVICE_STATUS_HANDLE SHORT "+"SIZE_T SSIZE_T TBYTE TCHAR UCHAR UHALF_PTR UINT UINT_PTR UINT32 UINT64 ULONG "+"ULONGLONG ULONG_PTR ULONG32 ULONG64 USHORT USN VOID WCHAR WORD WPARAM WPARAM WPARAM "+"char bool short int __int32 __int64 __int8 __int16 long float double __wchar_t "+"clock_t _complex _dev_t _diskfree_t div_t ldiv_t _exception _EXCEPTION_POINTERS "+"FILE _finddata_t _finddatai64_t _wfinddata_t _wfinddatai64_t __finddata64_t "+"__wfinddata64_t _FPIEEE_RECORD fpos_t _HEAPINFO _HFILE lconv intptr_t "+"jmp_buf mbstate_t _off_t _onexit_t _PNH ptrdiff_t _purecall_handler "+"sig_atomic_t size_t _stat __stat64 _stati64 terminate_function "+"time_t __time64_t _timeb __timeb64 tm uintptr_t _utimbuf "+"va_list wchar_t wctrans_t wctype_t wint_t signed",$="break case catch class const __finally __exception __try "+"const_cast continue private public protected __declspec "+"default delete deprecated dllexport dllimport do dynamic_cast "+"else enum explicit extern if for friend goto inline "+"mutable naked namespace new noinline noreturn nothrow "+"register reinterpret_cast return selectany "+"sizeof static static_cast struct switch template this "+"thread throw true false try typedef typeid typename union "+"using uuid virtual void volatile whcar_t while";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^ *#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"datatypes"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-cpp";this.Style=".dp-cpp .datatypes { color: #2E8B57; font-weight: bold; }"};dp.sh.Brushes.Cpp.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Cpp.Aliases=["cpp","c","c++"];dp.sh.Brushes.CSharp=function(){var $="abstract as base bool break byte case catch char checked class const "+"continue decimal default delegate do double else enum event explicit "+"extern false finally fixed float for foreach get goto if implicit in int "+"interface internal is lock long namespace new null object operator out "+"override params private protected public readonly ref return sbyte sealed set "+"short sizeof stackalloc static string struct switch this throw true try "+"typeof uint ulong unchecked unsafe ushort using virtual void while";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-c";this.Style=".dp-c .vars { color: #d00; }"};dp.sh.Brushes.CSharp.prototype=new dp.sh.Highlighter();dp.sh.Brushes.CSharp.Aliases=["c#","c-sharp","csharp"];dp.sh.Brushes.CSS=function(){var _="ascent azimuth background-attachment background-color background-image background-position "+"background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top "+"border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color "+"border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width "+"border-bottom-width border-left-width border-width border cap-height caption-side centerline clear clip color "+"content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display "+"elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font "+"height letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top "+"margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans "+"outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page "+"page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position "+"quotes richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress "+"table-layout text-align text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em "+"vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index",$="above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder "+"both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed "+"continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double "+"embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia "+"gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic "+"justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha "+"lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower "+"navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset "+"outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side "+"rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow "+"small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize "+"table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal "+"text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin "+"upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow",A="[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif";this.regexList=[{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("\\#[a-zA-Z0-9]{3,6}","g"),css:"value"},{regex:new RegExp("(-?\\d+)(.\\d+)?(px|em|pt|:|%|)","g"),css:"value"},{regex:new RegExp("!important","g"),css:"important"},{regex:new RegExp(this.GetKeywordsCSS(_),"gm"),css:"keyword"},{regex:new RegExp(this.GetValuesCSS($),"g"),css:"value"},{regex:new RegExp(this.GetValuesCSS(A),"g"),css:"value"}];this.CssClass="dp-css";this.Style=".dp-css .value { color: black; }"+".dp-css .important { color: red; }"};dp.sh.Highlighter.prototype.GetKeywordsCSS=function($){return"\\b([a-z_]|)"+$.replace(/ /g,"(?=:)\\b|\\b([a-z_\\*]|\\*|)")+"(?=:)\\b"};dp.sh.Highlighter.prototype.GetValuesCSS=function($){return"\\b"+$.replace(/ /g,"(?!-)(?!:)\\b|\\b()")+":\\b"};dp.sh.Brushes.CSS.prototype=new dp.sh.Highlighter();dp.sh.Brushes.CSS.Aliases=["css"];dp.sh.Brushes.Delphi=function(){var $="abs addr and ansichar ansistring array as asm begin boolean byte cardinal "+"case char class comp const constructor currency destructor div do double "+"downto else end except exports extended false file finalization finally "+"for function goto if implementation in inherited int64 initialization "+"integer interface is label library longint longword mod nil not object "+"of on or packed pansichar pansistring pchar pcurrency pdatetime pextended "+"pint64 pointer private procedure program property pshortstring pstring "+"pvariant pwidechar pwidestring protected public published raise real real48 "+"record repeat set shl shortint shortstring shr single smallint string then "+"threadvar to true try type unit until uses val var varirnt while widechar "+"widestring with word write writeln xor";this.regexList=[{regex:new RegExp("\\(\\*[\\s\\S]*?\\*\\)","gm"),css:"comment"},{regex:new RegExp("{(?!\\$)[\\s\\S]*?}","gm"),css:"comment"},{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("\\{\\$[a-zA-Z]+ .+\\}","g"),css:"directive"},{regex:new RegExp("\\b[\\d\\.]+\\b","g"),css:"number"},{regex:new RegExp("\\$[a-zA-Z0-9]+\\b","g"),css:"number"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-delphi";this.Style=".dp-delphi .number { color: blue; }"+".dp-delphi .directive { color: #008284; }"+".dp-delphi .vars { color: #000; }"};dp.sh.Brushes.Delphi.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Delphi.Aliases=["delphi","pascal"];dp.sh.Brushes.Java=function(){var $="abstract assert boolean break byte case catch char class const "+"continue default do double else enum extends "+"false final finally float for goto if implements import "+"instanceof int interface long native new null "+"package private protected public return "+"short static strictfp super switch synchronized this throw throws true "+"transient try void volatile while";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("\\b([\\d]+(\\.[\\d]+)?|0x[a-f0-9]+)\\b","gi"),css:"number"},{regex:new RegExp("(?!\\@interface\\b)\\@[\\$\\w]+\\b","g"),css:"annotation"},{regex:new RegExp("\\@interface\\b","g"),css:"keyword"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-j";this.Style=".dp-j .annotation { color: #646464; }"+".dp-j .number { color: #C00000; }"};dp.sh.Brushes.Java.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Java.Aliases=["java"];dp.sh.Brushes.JScript=function(){var $="abstract boolean break byte case catch char class const continue debugger "+"default delete do double else enum export extends false final finally float "+"for function goto if implements import in instanceof int interface long native "+"new null package private protected public return short static super switch "+"synchronized this throw throws transient true try typeof var void volatile while with";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-c"};dp.sh.Brushes.JScript.prototype=new dp.sh.Highlighter();dp.sh.Brushes.JScript.Aliases=["js","jscript","javascript"];dp.sh.Brushes.Lua=function(){var $="break do end else elseif function if local nil not or repeat return and then until while this",_="math\\.\\w+ string\\.\\w+ os\\.\\w+ debug\\.\\w+ io\\.\\w+ error fopen dofile coroutine\\.\\w+ arg getmetatable ipairs loadfile loadlib loadstring longjmp print rawget rawset seek setmetatable assert tonumber tostring";this.regexList=[{regex:new RegExp("--\\[\\[[\\s\\S]*\\]\\]--","gm"),css:"comment"},{regex:new RegExp("--[^\\[]{2}.*$","gm"),css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"func"},];this.CssClass="dp-lua"};dp.sh.Brushes.Lua.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Lua.Aliases=["lua"];dp.sh.Brushes.Mxml=function(){this.CssClass="dp-mxml";this.Style=".dp-mxml .cdata { color: #000000; }"+".dp-mxml .tag { color : #0000ff; }"+".dp-mxml .tag-name { color: #0000ff; }"+".dp-mxml .script { color: green; }"+".dp-mxml .metadata { color: green; }"+".dp-mxml .attribute { color: #000000; }"+".dp-mxml .attribute-value { color: #990000; }"+".dp-mxml .trace { color: #cc6666; }"+".dp-mxml .var { color: #6699cc; }"+".dp-mxml .comment { color: #009900; }"+".dp-mxml .string { color: #990000; }"+".dp-mxml .keyword { color: blue; }"};dp.sh.Brushes.Mxml.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Mxml.Aliases=["mxml"];dp.sh.Brushes.Mxml.prototype.ProcessRegexList=function(){function H(_,$){_[_.length]=$}function B(B,_){var A=0,$=false;for(A=0;A<B.length;A++)if(_.index>B[A].firstIndex&&_.index<B[A].lastIndex)$=true;return $}var $=0,F=null,D=null,A=null,C="",E=new Array(),_="abstract boolean break byte case catch char class const continue debugger "+"default delete do double else enum export extends false final finally float "+"for function goto if implements import in instanceof int interface long native "+"new null package private protected public return short static super switch "+"synchronized this throw throws transient true try typeof var void volatile while with",G=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords("trace"),"gm"),css:"trace"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"keyword"}];A=new RegExp("&lt;\\!\\[CDATA\\[(.|\\s)*?\\]\\]&gt;","gm");while((F=A.exec(this.code))!=null){C=F[0].substr(0,12);H(this.matches,new dp.sh.Match(C,F.index,"cdata"));C=F[0].substr(12,F[0].length-12-6);for(var I=0;I<G.length;I++)while((D=G[I].regex.exec(C))!=null)H(this.matches,new dp.sh.Match(D[0],F.index+12+D.index,G[I].css));C=F[0].substr(F[0].length-6,6);H(this.matches,new dp.sh.Match(C,F.index+F[0].length-6,"cdata"));E.push({firstIndex:F.index,lastIndex:F.index+F[0].length-1})}this.GetMatches(new RegExp("(&lt;|<)!--\\s*.*?\\s*--(&gt;|>)","gm"),"comments");A=new RegExp("([:\\w-.]+)\\s*=\\s*(\".*?\"|'.*?'|\\w+)*|(\\w+)","gm");while((F=A.exec(this.code))!=null){if(F[1]==null)continue;if(B(E,F))continue;H(this.matches,new dp.sh.Match(F[1],F.index,"attribute"));if(F[2]!=undefined)H(this.matches,new dp.sh.Match(F[2],F.index+F[0].indexOf(F[2]),"attribute-value"))}A=new RegExp("(?:&lt;|<)/*\\?*\\s*([:\\w-.]+)","gm");while((F=A.exec(this.code))!=null){if(B(E,F))continue;C=F[0].substr(4,F[0].length-4);switch(C){case"mx:Script":case"/mx:Script":H(this.matches,new dp.sh.Match(F[0]+"&gt;",F.index,"script"));break;case"mx:Metadata":case"/mx:Metadata":H(this.matches,new dp.sh.Match(F[0]+"&gt;",F.index,"metadata"));break;default:H(this.matches,new dp.sh.Match(F[0],F.index,"tag-name"));break}}A=new RegExp("\\?&gt;|&gt;|/&gt;","gm");while((F=A.exec(this.code))!=null){if(B(E,F))continue;H(this.matches,new dp.sh.Match(F[0],F.index,"tag"))}};dp.sh.Brushes.Perl=function(){var _="abs accept alarm atan2 bind binmode bless caller chdir chmod chomp chop chown chr chroot close closedir connect cos crypt dbmclose dbmopen defined delete dump each endgrent endhostent endnetent endprotoent endpwent endservent eof exec exists exp fcntl fileno flock fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getppid getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt glob gmtime grep hex import index int ioctl join keys kill lc lcfirst length link listen localtime lock log lstat m map mkdir msgctl msgget msgrcv msgsnd no oct open opendir ord pack pipe pop pos print printf prototype push q qq quotemeta qw qx rand read readdir readline readlink readpipe recv ref rename reset reverse rewinddir rindex rmdir scalar seek seekdir semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unlink unpack unshift untie utime values vec waitpid wantarray warn write qr",$="s select goto die do package redo require return continue for foreach last next wait while use if else elsif eval exit unless switch case",A="my our local";this.regexList=[{regex:dp.sh.RegexLib.SingleLinePerlComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("(\\$|@|%)\\w+","g"),css:"vars"},{regex:new RegExp(this.GetKeywords(_),"gmi"),css:"func"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp(this.GetKeywords(A),"gm"),css:"declarations"}];this.CssClass="dp-perl"};dp.sh.Brushes.Perl.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Perl.Aliases=["perl"];dp.sh.Brushes.Php=function(){var _="abs acos acosh addcslashes addslashes "+"array_change_key_case array_chunk array_combine array_count_values array_diff "+"array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill "+"array_filter array_flip array_intersect array_intersect_assoc array_intersect_key "+"array_intersect_uassoc array_intersect_ukey array_key_exists array_keys array_map "+"array_merge array_merge_recursive array_multisort array_pad array_pop array_product "+"array_push array_rand array_reduce array_reverse array_search array_shift "+"array_slice array_splice array_sum array_udiff array_udiff_assoc "+"array_udiff_uassoc array_uintersect array_uintersect_assoc "+"array_uintersect_uassoc array_unique array_unshift array_values array_walk "+"array_walk_recursive atan atan2 atanh base64_decode base64_encode base_convert "+"basename bcadd bccomp bcdiv bcmod bcmul bindec bindtextdomain bzclose bzcompress "+"bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite ceil chdir "+"checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split class_exists "+"closedir closelog copy cos cosh count count_chars date decbin dechex decoct "+"deg2rad delete ebcdic2ascii echo empty end ereg ereg_replace eregi eregi_replace error_log "+"error_reporting escapeshellarg escapeshellcmd eval exec exit exp explode extension_loaded "+"feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents "+"fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype "+"floatval flock floor flush fmod fnmatch fopen fpassthru fprintf fputcsv fputs fread fscanf "+"fseek fsockopen fstat ftell ftok getallheaders getcwd getdate getenv gethostbyaddr gethostbyname "+"gethostbynamel getimagesize getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt "+"getprotobyname getprotobynumber getrandmax getrusage getservbyname getservbyport gettext "+"gettimeofday gettype glob gmdate gmmktime ini_alter ini_get ini_get_all ini_restore ini_set "+"interface_exists intval ip2long is_a is_array is_bool is_callable is_dir is_double "+"is_executable is_file is_finite is_float is_infinite is_int is_integer is_link is_long "+"is_nan is_null is_numeric is_object is_readable is_real is_resource is_scalar is_soap_fault "+"is_string is_subclass_of is_uploaded_file is_writable is_writeable mkdir mktime nl2br "+"parse_ini_file parse_str parse_url passthru pathinfo readlink realpath rewind rewinddir rmdir "+"round str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split "+"str_word_count strcasecmp strchr strcmp strcoll strcspn strftime strip_tags stripcslashes "+"stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk "+"strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime "+"strtoupper strtr strval substr substr_compare",$="and or xor __FILE__ __LINE__ array as break case "+"cfunction class const continue declare default die do else "+"elseif empty enddeclare endfor endforeach endif endswitch endwhile "+"extends for foreach function include include_once global if "+"new old_function return static switch use require require_once "+"var while __FUNCTION__ __CLASS__ "+"__METHOD__ abstract interface public implements extends private protected throw";this.regexList=[{regex:dp.sh.RegexLib.SingleLineCComments,css:"comment"},{regex:dp.sh.RegexLib.MultiLineCComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp("\\$\\w+","g"),css:"vars"},{regex:new RegExp(this.GetKeywords(_),"gmi"),css:"func"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-c"};dp.sh.Brushes.Php.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Php.Aliases=["php"];dp.sh.Brushes.Python=function(){var $="and assert break class continue def del elif else "+"except exec finally for from global if import in is "+"lambda not or pass print raise return try yield while",_="None True False self cls class_";this.regexList=[{regex:dp.sh.RegexLib.SingleLinePerlComments,css:"comment"},{regex:new RegExp("^\\s*@\\w+","gm"),css:"decorator"},{regex:new RegExp("(['\"]{3})([^\\1])*?\\1","gm"),css:"comment"},{regex:new RegExp("\"(?!\")(?:\\.|\\\\\\\"|[^\\\"\"\\n\\r])*\"","gm"),css:"string"},{regex:new RegExp("'(?!')*(?:\\.|(\\\\\\')|[^\\''\\n\\r])*'","gm"),css:"string"},{regex:new RegExp("\\b\\d+\\.?\\w*","g"),css:"number"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"special"}];this.CssClass="dp-py";this.Style=".dp-py .builtins { color: #ff1493; }"+".dp-py .magicmethods { color: #808080; }"+".dp-py .exceptions { color: brown; }"+".dp-py .types { color: brown; font-style: italic; }"+".dp-py .commonlibs { color: #8A2BE2; font-style: italic; }"};dp.sh.Brushes.Python.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Python.Aliases=["py","python"];dp.sh.Brushes.Ruby=function(){var $="alias and BEGIN begin break case class def define_method defined do each else elsif "+"END end ensure false for if in module new next nil not or raise redo rescue retry return "+"self super then throw true undef unless until when while yield",_="Array Bignum Binding Class Continuation Dir Exception FalseClass File::Stat File Fixnum Fload "+"Hash Integer IO MatchData Method Module NilClass Numeric Object Proc Range Regexp String Struct::TMS Symbol "+"ThreadGroup Thread Time TrueClass";this.regexList=[{regex:dp.sh.RegexLib.SingleLinePerlComments,css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp(":[a-z][A-Za-z0-9_]*","g"),css:"symbol"},{regex:new RegExp("(\\$|@@|@)\\w+","g"),css:"variable"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"},{regex:new RegExp(this.GetKeywords(_),"gm"),css:"builtin"}];this.CssClass="dp-rb";this.Style=".dp-rb .symbol { color: #a70; }"+".dp-rb .variable { color: #a70; font-weight: bold; }"};dp.sh.Brushes.Ruby.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Ruby.Aliases=["ruby","rails","ror"];dp.sh.Brushes.Sql=function(){var _="abs avg case cast coalesce convert count current_timestamp "+"current_user day isnull left lower month nullif replace right "+"session_user space substring sum system_user upper user year",$="absolute action add after alter as asc at authorization begin bigint "+"binary bit by cascade char character check checkpoint close collate "+"column commit committed connect connection constraint contains continue "+"create cube current current_date current_time cursor database date "+"deallocate dec decimal declare default delete desc distinct double drop "+"dynamic else end end-exec escape except exec execute false fetch first "+"float for force foreign forward free from full function global goto grant "+"group grouping having hour ignore index inner insensitive insert instead "+"int integer intersect into is isolation key last level load local max min "+"minute modify move name national nchar next no numeric of off on only "+"open option order out output partial password precision prepare primary "+"prior privileges procedure public read real references relative repeatable "+"restrict return returns revoke rollback rollup rows rule schema scroll "+"second section select sequence serializable set size smallint static "+"statistics table temp temporary then time timestamp to top transaction "+"translation trigger true truncate uncommitted union unique update values "+"varchar varying view when where with work",A="all and any between cross in join like not null or outer some";this.regexList=[{regex:new RegExp("--(.*)$","gm"),css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:dp.sh.RegexLib.SingleQuotedString,css:"string"},{regex:new RegExp(this.GetKeywords(_),"gmi"),css:"func"},{regex:new RegExp(this.GetKeywords(A),"gmi"),css:"op"},{regex:new RegExp(this.GetKeywords($),"gmi"),css:"keyword"}];this.CssClass="dp-sql";this.Style=".dp-sql .func { color: #ff1493; }"+".dp-sql .op { color: #808080; }"};dp.sh.Brushes.Sql.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Sql.Aliases=["sql"];dp.sh.Brushes.Vb=function(){var $="AddHandler AddressOf AndAlso Alias And Ansi As Assembly Auto "+"Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate "+"CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType "+"Date Decimal Declare Default Delegate Dim DirectCast Do Double Each "+"Else ElseIf End Enum Erase Error Event Exit False Finally For Friend "+"Function Get GetType GoSub GoTo Handles If Implements Imports In "+"Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module "+"MustInherit MustOverride MyBase MyClass Namespace New Next Not Nothing "+"NotInheritable NotOverridable Object On Option Optional Or OrElse "+"Overloads Overridable Overrides ParamArray Preserve Private Property "+"Protected Public RaiseEvent ReadOnly ReDim REM RemoveHandler Resume "+"Return Select Set Shadows Shared Short Single Static Step Stop String "+"Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until "+"Variant When While With WithEvents WriteOnly Xor";this.regexList=[{regex:new RegExp("'.*$","gm"),css:"comment"},{regex:dp.sh.RegexLib.DoubleQuotedString,css:"string"},{regex:new RegExp("^\\s*#.*","gm"),css:"preprocessor"},{regex:new RegExp(this.GetKeywords($),"gm"),css:"keyword"}];this.CssClass="dp-vb"};dp.sh.Brushes.Vb.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Vb.Aliases=["vb","vb.net"];dp.sh.Brushes.Xml=function(){this.CssClass="dp-xml";this.Style=".dp-xml .cdata { color: #ff1493; }"+".dp-xml .tag, .dp-xml .tag-name { color: #069; font-weight: bold; }"+".dp-xml .attribute { color: red; }"+".dp-xml .attribute-value { color: blue; }"};dp.sh.Brushes.Xml.prototype=new dp.sh.Highlighter();dp.sh.Brushes.Xml.Aliases=["xml","xhtml","xslt","html","xhtml"];dp.sh.Brushes.Xml.prototype.ProcessRegexList=function(){function B(_,$){_[_.length]=$}var $=0,A=null,_=null;this.GetMatches(new RegExp("(&lt;|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](&gt;|>)","gm"),"cdata");this.GetMatches(new RegExp("(&lt;|<)!--\\s*.*?\\s*--(&gt;|>)","gm"),"comments");_=new RegExp("([:\\w-.]+)\\s*=\\s*(\".*?\"|'.*?'|\\w+)*|(\\w+)","gm");while((A=_.exec(this.code))!=null){if(A[1]==null)continue;B(this.matches,new dp.sh.Match(A[1],A.index,"attribute"));if(A[2]!=undefined)B(this.matches,new dp.sh.Match(A[2],A.index+A[0].indexOf(A[2]),"attribute-value"))}this.GetMatches(new RegExp("(&lt;|<)/*\\?*(?!\\!)|/*\\?*(&gt;|>)","gm"),"tag");_=new RegExp("(?:&lt;|<)/*\\?*\\s*([:\\w-.]+)","gm");while((A=_.exec(this.code))!=null)B(this.matches,new dp.sh.Match(A[1],A.index+A[0].indexOf(A[1]),"tag-name"))}
//}}}
Will man ein ~SystemIcon darstellen ist das recht einfach:

<code delphi>
Image1.Picture.Icon.Handle := LoadIcon(0, IDI_QUESTION);
</code>

Dabei sind gültige Einträge:
<<<
~IDI_APPLICATION
~IDI_ASTERISK 
~IDI_ERROR 
~IDI_EXCLAMATION  
~IDI_HAND 
~IDI_INFORMATION  
~IDI_QUESTION  
~IDI_WARNING  
~IDI_WINLOGO 

<<<
|>|bgcolor:#8af;@@color(#000080):''4 tiddlers found matching /{{{sprachausgabe}}}/''@@|bgcolor:#8af;  @@color:#A00000; SearchHelp@@ |
|>|>|bgcolor:#E3FFE3;<<search>> <<option chkSearchTitles>> Titles <<option chkSearchText>> Text <<option chkSearchTags>>Tags <<option chkHoldSearches>> Hold |

|bgcolor:#8af;&nbsp;|bgcolor:#8af; sort by:''Titles'' |bgcolor:#8af; ''Size'' |bgcolor:#8af; ''Tags'' |h
| 1|[[Delphi Sprachausgabe (englisch)]]| 1188|Delphi Sound|
| 2|[[Ungeklärt Wie geht deutsche Sprachausgabe]]| 45|Delphi ungeklärt|
| 3|[[Ungeklärt Wie kann man verhindern das bei Sprachausgabe die Caption des Forms geändert wird?]]| 45|Delphi ungeklärt|
| 4|[[Delphi Codeschnipsel Gliederung]]| 460||
|sortable|k
<<gradient horiz #ffffff #eeeeee #aaccbb>>Heute ist der <<simpleclock    0DD.0MM.YYYY simpleclock>> <<simpleclock     0hh:0mm:0ss simpleClock>>
<<tCalendar lastModified>>
/***
|Name:|TagglyTaggingPlugin|
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Version:|3.3.1 ($Rev: 6100 $)|
|Date:|$Date: 2008-07-27 01:42:07 +1000 (Sun, 27 Jul 2008) $|
|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{

merge(String.prototype,{

	parseTagExpr: function(debug) {

		if (this.trim() == "")
			return "(true)";

		var anyLogicOp = /(!|&&|\|\||\(|\))/g;
		var singleLogicOp = /^(!|&&|\|\||\(|\))$/;

		var spaced = this.
			// because square brackets in templates are no good
			// this means you can use [(With Spaces)] instead of [[With Spaces]]
			replace(/\[\(/g," [[").
			replace(/\)\]/g,"]] "). 
			// space things out so we can use readBracketedList. tricky eh?
			replace(anyLogicOp," $1 ");

		var expr = "";

		var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!

		for (var i=0;i<tokens.length;i++)
			if (tokens[i].match(singleLogicOp))
				expr += tokens[i];
			else
				expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think

		if (debug)
			alert(expr);

		return '('+expr+')';
	}

});

merge(TiddlyWiki.prototype,{
	getTiddlersByTagExpr: function(tagExpr,sortField) {

		var result = [];

		var expr = tagExpr.parseTagExpr();

		store.forEachTiddler(function(title,tiddler) {
			if (eval(expr))
				result.push(tiddler);
		});

		if(!sortField)
			sortField = "title";

		result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
		
		return result;
	}
});

config.taggly = {

	// for translations
	lingo: {
		labels: {
			asc:        "\u2191", // down arrow
			desc:       "\u2193", // up arrow
			title:      "title",
			modified:   "modified",
			created:    "created",
			show:       "+",
			hide:       "-",
			normal:     "normal",
			group:      "group",
			commas:     "commas",
			sitemap:    "sitemap",
			numCols:    "cols\u00b1", // plus minus sign
			label:      "Tagged as '%0':",
			exprLabel:  "Matching tag expression '%0':",
			excerpts:   "excerpts",
			descr:      "descr",
			slices:     "slices",
			contents:   "contents",
			sliders:    "sliders",
			noexcerpts: "title only",
			noneFound:  "(none)"
		},

		tooltips: {
			title:      "Click to sort by title",
			modified:   "Click to sort by modified date",
			created:    "Click to sort by created date",
			show:       "Click to show tagging list",
			hide:       "Click to hide tagging list",
			normal:     "Click to show a normal ungrouped list",
			group:      "Click to show list grouped by tag",
			sitemap:    "Click to show a sitemap style list",
			commas:     "Click to show a comma separated list",
			numCols:    "Click to change number of columns",
			excerpts:   "Click to show excerpts",
			descr:      "Click to show the description slice",
			slices:     "Click to show all slices",
			contents:   "Click to show entire tiddler contents",
			sliders:    "Click to show tiddler contents in sliders",
			noexcerpts: "Click to show entire title only"
		},

		tooDeepMessage: "* //sitemap too deep...//"
	},

	config: {
		showTaggingCounts: true,
		listOpts: {
			// the first one will be the default
			sortBy:     ["title","modified","created"],
			sortOrder:  ["asc","desc"],
			hideState:  ["show","hide"],
			listMode:   ["normal","group","sitemap","commas"],
			numCols:    ["1","2","3","4","5","6"],
			excerpts:   ["noexcerpts","excerpts","descr","slices","contents","sliders"]
		},
		valuePrefix: "taggly.",
		excludeTags: ["excludeLists","excludeTagging"],
		excerptSize: 50,
		excerptMarker: "/%"+"%/",
		siteMapDepthLimit: 25
	},

	getTagglyOpt: function(title,opt) {
		var val = store.getValue(title,this.config.valuePrefix+opt);
		return val ? val : this.config.listOpts[opt][0];
	},

	setTagglyOpt: function(title,opt,value) {
		if (!store.tiddlerExists(title))
			// create it silently
			store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");
		// if value is default then remove it to save space
		return store.setValue(title,
			this.config.valuePrefix+opt,
			value == this.config.listOpts[opt][0] ? null : value);
	},

	getNextValue: function(title,opt) {
		var current = this.getTagglyOpt(title,opt);
		var pos = this.config.listOpts[opt].indexOf(current);
		// a little usability enhancement. actually it doesn't work right for grouped or sitemap
		var limit = (opt == "numCols" ? store.getTiddlersByTagExpr(title).length : this.config.listOpts[opt].length);
		var newPos = (pos + 1) % limit;
		return this.config.listOpts[opt][newPos];
	},

	toggleTagglyOpt: function(title,opt) {
		var newVal = this.getNextValue(title,opt);
		this.setTagglyOpt(title,opt,newVal);
	}, 

	createListControl: function(place,title,type) {
		var lingo = config.taggly.lingo;
		var label;
		var tooltip;
		var onclick;

		if ((type == "title" || type == "modified" || type == "created")) {
			// "special" controls. a little tricky. derived from sortOrder and sortBy
			label = lingo.labels[type];
			tooltip = lingo.tooltips[type];

			if (this.getTagglyOpt(title,"sortBy") == type) {
				label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
				onclick = function() {
					config.taggly.toggleTagglyOpt(title,"sortOrder");
					return false;
				}
			}
			else {
				onclick = function() {
					config.taggly.setTagglyOpt(title,"sortBy",type);
					config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
					return false;
				}
			}
		}
		else {
			// "regular" controls, nice and simple
			label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
			tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
			onclick = function() {
				config.taggly.toggleTagglyOpt(title,type);
				return false;
			}
		}

		// hide button because commas don't have columns
		if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
			createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
	},

	makeColumns: function(orig,numCols) {
		var listSize = orig.length;
		var colSize = listSize/numCols;
		var remainder = listSize % numCols;

		var upperColsize = colSize;
		var lowerColsize = colSize;

		if (colSize != Math.floor(colSize)) {
			// it's not an exact fit so..
			upperColsize = Math.floor(colSize) + 1;
			lowerColsize = Math.floor(colSize);
		}

		var output = [];
		var c = 0;
		for (var j=0;j<numCols;j++) {
			var singleCol = [];
			var thisSize = j < remainder ? upperColsize : lowerColsize;
			for (var i=0;i<thisSize;i++) 
				singleCol.push(orig[c++]);
			output.push(singleCol);
		}

		return output;
	},

	drawTable: function(place,columns,theClass) {
		var newTable = createTiddlyElement(place,"table",null,theClass);
		var newTbody = createTiddlyElement(newTable,"tbody");
		var newTr = createTiddlyElement(newTbody,"tr");
		for (var j=0;j<columns.length;j++) {
			var colOutput = "";
			for (var i=0;i<columns[j].length;i++) 
				colOutput += columns[j][i];
			var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
			wikify(colOutput,newTd);
		}
		return newTable;
	},

	createTagglyList: function(place,title,isTagExpr) {
		switch(this.getTagglyOpt(title,"listMode")) {
			case "group":  return this.createTagglyListGrouped(place,title,isTagExpr); break;
			case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
			case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
			case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;
		}
	},

	getTaggingCount: function(title,isTagExpr) {
		// thanks to Doug Edmunds
		if (this.config.showTaggingCounts) {
			var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
			if (tagCount > 0)
				return " ("+tagCount+")";
		}
		return "";
	},

	getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
		return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);
	},

	getExcerpt: function(inTiddlerTitle,title,indent) {
		if (!indent)
			indent = 1;

		var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
		var t = store.getTiddler(title);

		if (t && displayMode == "excerpts") {
			var text = t.text.replace(/\n/," ");
			var marker = text.indexOf(this.config.excerptMarker);
			if (marker != -1) {
				return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
			}
			else if (text.length < this.config.excerptSize) {
				return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
			}
			else {
				return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
			}
		}
		else if (t && displayMode == "contents") {
			return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
		}
		else if (t && displayMode == "sliders") {
			return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
		}
		else if (t && displayMode == "descr") {
			var descr = store.getTiddlerSlice(title,'Description');
			return descr ? " {{excerpt{" + descr  + "}}}" : "";
		}
		else if (t && displayMode == "slices") {
			var result = "";
			var slices = store.calcAllSlices(title);
			for (var s in slices)
				result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
			return result ? "\n{{excerpt excerptIndent{\n" + result  + "}}}" : "";
		}
		return "";
	},

	notHidden: function(t,inTiddler) {
		if (typeof t == "string") 
			t = store.getTiddler(t);
		return (!t || !t.tags.containsAny(this.config.excludeTags) ||
				(inTiddler && this.config.excludeTags.contains(inTiddler)));
	},

	// this is for normal and commas mode
	createTagglyListNormal: function(place,title,useCommas,isTagExpr) {

		var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);

		if (this.getTagglyOpt(title,"sortOrder") == "desc")
			list = list.reverse();

		var output = [];
		var first = true;
		for (var i=0;i<list.length;i++) {
			if (this.notHidden(list[i],title)) {
				var countString = this.getTaggingCount(list[i].title);
				var excerpt = this.getExcerpt(title,list[i].title);
				if (useCommas)
					output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
				else
					output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");

				first = false;
			}
		}

		return this.drawTable(place,
			this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
			useCommas ? "commas" : "normal");
	},

	// this is for the "grouped" mode
	createTagglyListGrouped: function(place,title,isTagExpr) {
		var sortBy = this.getTagglyOpt(title,"sortBy");
		var sortOrder = this.getTagglyOpt(title,"sortOrder");

		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

		if (sortOrder == "desc")
			list = list.reverse();

		var leftOvers = []
		for (var i=0;i<list.length;i++)
			leftOvers.push(list[i].title);

		var allTagsHolder = {};
		for (var i=0;i<list.length;i++) {
			for (var j=0;j<list[i].tags.length;j++) {

				if (list[i].tags[j] != title) { // not this tiddler

					if (this.notHidden(list[i].tags[j],title)) {

						if (!allTagsHolder[list[i].tags[j]])
							allTagsHolder[list[i].tags[j]] = "";

						if (this.notHidden(list[i],title)) {
							allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
										+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";

							leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers

						}
					}
				}
			}
		}

		var allTags = [];
		for (var t in allTagsHolder)
			allTags.push(t);

		var sortHelper = function(a,b) {
			if (a == b) return 0;
			if (a < b) return -1;
			return 1;
		};

		allTags.sort(function(a,b) {
			var tidA = store.getTiddler(a);
			var tidB = store.getTiddler(b);
			if (sortBy == "title") return sortHelper(a,b);
			else if (!tidA && !tidB) return 0;
			else if (!tidA) return -1;
			else if (!tidB) return +1;
			else return sortHelper(tidA[sortBy],tidB[sortBy]);
		});

		var leftOverOutput = "";
		for (var i=0;i<leftOvers.length;i++)
			if (this.notHidden(leftOvers[i],title))
				leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";

		var output = [];

		if (sortOrder == "desc")
			allTags.reverse();
		else if (leftOverOutput != "")
			// leftovers first...
			output.push(leftOverOutput);

		for (var i=0;i<allTags.length;i++)
			if (allTagsHolder[allTags[i]] != "")
				output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);

		if (sortOrder == "desc" && leftOverOutput != "")
			// leftovers last...
			output.push(leftOverOutput);

		return this.drawTable(place,
				this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
				"grouped");

	},

	// used to build site map
	treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {

		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

		if (sortOrder == "desc")
			list.reverse();

		var indent = "";
		for (var j=0;j<depth;j++)
			indent += "*"

		var childOutput = "";

		if (depth > this.config.siteMapDepthLimit)
			childOutput += indent + this.lingo.tooDeepMessage;
		else
			for (var i=0;i<list.length;i++)
				if (list[i].title != title)
					if (this.notHidden(list[i].title,this.config.inTiddler))
						childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);

		if (depth == 0)
			return childOutput;
		else
			return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
	},

	// this if for the site map mode
	createTagglyListSiteMap: function(place,title,isTagExpr) {
		this.config.inTiddler = title; // nasty. should pass it in to traverse probably
		var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
		return this.drawTable(place,
				this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
				"sitemap"
				);
	},

	macros: {
		tagglyTagging: {
			handler: function (place,macroName,params,wikifier,paramString,tiddler) {
				var parsedParams = paramString.parseParams("tag",null,true);
				var refreshContainer = createTiddlyElement(place,"div");

				// do some refresh magic to make it keep the list fresh - thanks Saq
				refreshContainer.setAttribute("refresh","macro");
				refreshContainer.setAttribute("macroName",macroName);

				var tag = getParam(parsedParams,"tag");
				var expr = getParam(parsedParams,"expr");

				if (expr) {
					refreshContainer.setAttribute("isTagExpr","true");
					refreshContainer.setAttribute("title",expr);
					refreshContainer.setAttribute("showEmpty","true");
				}
				else {
					refreshContainer.setAttribute("isTagExpr","false");
					if (tag) {
        				refreshContainer.setAttribute("title",tag);
						refreshContainer.setAttribute("showEmpty","true");
					}
					else {
        				refreshContainer.setAttribute("title",tiddler.title);
						refreshContainer.setAttribute("showEmpty","false");
					}
				}
				this.refresh(refreshContainer);
			},

			refresh: function(place) {
				var title = place.getAttribute("title");
				var isTagExpr = place.getAttribute("isTagExpr") == "true";
				var showEmpty = place.getAttribute("showEmpty") == "true";
				removeChildren(place);
				addClass(place,"tagglyTagging");
				var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
				if (countFound > 0 || showEmpty) {
					var lingo = config.taggly.lingo;
					config.taggly.createListControl(place,title,"hideState");
					if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
						createTiddlyElement(place,"span",null,"tagglyLabel",
								isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
						config.taggly.createListControl(place,title,"title");
						config.taggly.createListControl(place,title,"modified");
						config.taggly.createListControl(place,title,"created");
						config.taggly.createListControl(place,title,"listMode");
						config.taggly.createListControl(place,title,"excerpts");
						config.taggly.createListControl(place,title,"numCols");
						config.taggly.createTagglyList(place,title,isTagExpr);
						if (countFound == 0 && showEmpty)
							createTiddlyElement(place,"div",null,"tagglyNoneFound",lingo.labels.noneFound);
					}
				}
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
"	margin-top:0px; padding-top:0.5em; padding-left:2em;",
"	margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
"	color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
"	border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active  {",
"	border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
"  margin-bottom:0.5em; }",
".tagglyTagging .indent1  { margin-left:3em;  }",
".tagglyTagging .indent2  { margin-left:4em;  }",
".tagglyTagging .indent3  { margin-left:5em;  }",
".tagglyTagging .indent4  { margin-left:6em;  }",
".tagglyTagging .indent5  { margin-left:7em;  }",
".tagglyTagging .indent6  { margin-left:8em;  }",
".tagglyTagging .indent7  { margin-left:9em;  }",
".tagglyTagging .indent8  { margin-left:10em; }",
".tagglyTagging .indent9  { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		merge(config.macros,this.macros);
		config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
		store.addNotification("TagglyTaggingStyles",refreshStyles);
	}
};

config.taggly.init();

//}}}

/***
InlineSlidersPlugin
By Saq Imtiaz
http://tw.lewcid.org/sandbox/#InlineSlidersPlugin

// syntax adjusted to not clash with NestedSlidersPlugin
// added + syntax to start open instead of closed

***/
//{{{
config.formatters.unshift( {
	name: "inlinesliders",
	// match: "\\+\\+\\+\\+|\\<slider",
	match: "\\<slider",
	// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
	lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
	handler: function(w) {
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
			var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
			var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
			panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
			wikify(lookaheadMatch[3],panel);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
   },
   onClickSlider : function(e) {
		if(!e) var e = window.event;
		var n = this.nextSibling;
		n.style.display = (n.style.display=="none") ? "block" : "none";
		return false;
	}
});

//}}}

/***
|''Name:''|TagsTreePlugin|
|''Description:''|Displays tags hierachy as a tree of tagged tiddlers.<br>Can be used to create dynamic outline navigation.|
|''Version:''|1.0.1|
|''Date:''|Jan 04,2008|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0|
!Demo
On the plugin [[homepage|http://visualtw.ouvaton.org/VisualTW.html]] :
*Try to tag some <<newTiddler>> with a tag displayed in the menu and edit MainMenu.
*Look at some tags like [[Plugins]] or [[menu]].
!Installation
#import the plugin,
#save and reload,
#optionally, edit TagsTreeStyleSheet.
! Usage
{{{<<tagsTree>>}}} macro accepts the following //optional// parameters.
|!#|!parameter|!description|!by default|
|1|{{{root}}}|Uses {{{root}}} tag as tree root|- In a //tiddler// content or template : uses the tiddler as root tag.<br>- In the //page// content or template (by ex MainMenu) : displays all untagged tags.|
|2|{{{excludeTag}}}|Excludes all such tagged tiddlers from the tree|Uses default excludeLists tag|
|3|{{{level}}}|Expands nodes until level {{{level}}}.<br>Value {{{0}}} hides expand/collapse buttons.|Nodes are collapsed on first level|
|4|{{{depth}}}|Hierachy depth|6 levels depth (H1 to H6 header styles)|
|5|{{{sortField}}}|Alternate sort field. By example : "index".|Sorts tags and tiddlers alphabetically (on their title)|
|6|{{{labelField}}}|Alertnate label field. By example : "label".|Displays tiddler's title|

!Useful addons
*[[FieldsEditorPlugin]] : //create//, //edit//, //view// and //delete// commands in toolbar <<toolbar fields>>.
*[[TaggerPlugin]] : Provides a drop down listing current tiddler tags, and allowing toggling of tags.
!Advanced Users
You can change the global defaults for TagsTreePlugin, like default {{{level}}} value or level styles, by editing or overriding the first config.macros.tagsTree attributes below.
!Code
***/
//{{{
config.macros.tagsTree = {
	expand : "+",
	collapse : "–",
	depth : 6,
	level : 1,
	sortField : "",	
	labelField : "",
	styles : ["h1","h2","h3","h4","h5","h6"],
	trees : {}
}

config.macros.tagsTree.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	var root = params[0] ? params[0] : (tiddler ? tiddler.title : null);
	var excludeTag = params[1] ? params[1] : "excludeTagsTree";
	var level = params[2] ? params[2] : config.macros.tagsTree.level;
	var depth = params[3] ? params[3] : config.macros.tagsTree.depth;
	var sortField = params[4] ? params[4] : config.macros.tagsTree.sortField;
	var labelField = params[5] ? params[5] : config.macros.tagsTree.labelField;
	var showButtons = (level>0);
	var id = config.macros.tagsTree.getId(place);
	if (config.macros.tagsTree.trees[id]==undefined) config.macros.tagsTree.trees[id]={};
	config.macros.tagsTree.createSubTree(place,id,root,excludeTag,[],level>0 ? level : 1,depth, sortField, labelField,showButtons);
}

config.macros.tagsTree.createSubTree = function(place, id, root, excludeTag, ancestors, level, depth, sortField, labelField,showButtons){
	var childNodes = root ? this.getChildNodes(root, ancestors) : this.getRootTags(excludeTag);
	var isOpen = (level>0) || (!showButtons);
	if (root && this.trees[id][root]!=undefined) isOpen = this.trees[id][root]; 
	if (root && ancestors.length) {
		var t = store.getTiddler(root);
		if (childNodes.length && depth>0) {
			var wrapper = createTiddlyElement(place , this.styles[Math.min(Math.max(ancestors.length,1),6)-1],null,"branch");
			if (showButtons) {
				b = createTiddlyButton(wrapper, isOpen ? config.macros.tagsTree.collapse : config.macros.tagsTree.expand, null, config.macros.tagsTree.onClick);
				b.setAttribute("treeId",id);
				b.setAttribute("tiddler",root);					
			}
			createTiddlyText(createTiddlyLink(wrapper, root),t&&labelField ? t.fields[labelField] ? t.fields[labelField] : root : root);
		}
		else 
			createTiddlyText(createTiddlyLink(place, root,false,"leaf"),t&&labelField ? t.fields[labelField] ? t.fields[labelField] : root : root);
	}
	if (childNodes.length && depth) {
		var d = createTiddlyElement(place,"div",null,"subtree");
		d.style.display= isOpen ? "block" : "none";
		if (sortField)
			childNodes.sort(function(a, b){
				var fa=a.fields[sortField];
				var fb=b.fields[sortField];
				return (fa==undefined && fb==undefined) ? a.title < b.title ? -1 : a.title > b.title ? 1 : 0 : (fa==undefined && fb!=undefined) ? 1 :(fa!=undefined && fb==undefined) ? -1 : fa < fb ? -1 : fa > fb ? 1 : 0;
			})
		for (var cpt=0; cpt<childNodes.length; cpt++)
			this.createSubTree(d, id, childNodes[cpt].title, excludeTag, ancestors.concat(root), level-1, depth-1, sortField, labelField, showButtons);	
	}	
}

config.macros.tagsTree.onClick = function(e){
	var id = this.getAttribute("treeId");
	var tiddler = this.getAttribute("tiddler");	
	var n = this.parentNode.nextSibling;
	var isOpen = n.style.display != "none";
	if(config.options.chkAnimate && anim && typeof Slider == "function")
		anim.startAnimating(new Slider(n,!isOpen,null,"none"));
	else
		n.style.display = isOpen ? "none" : "block";
	this.firstChild.nodeValue = isOpen ? config.macros.tagsTree.expand : config.macros.tagsTree.collapse;
	config.macros.tagsTree.trees[id][tiddler]=!isOpen;
	return false;
}

config.macros.tagsTree.getChildNodes = function(root ,ancestors){
	var childs = store.getTaggedTiddlers(root);
	var result = new Array();
	for (var cpt=0; cpt<childs.length; cpt++)
		if (childs[cpt].title!=root && ancestors.indexOf(childs[cpt].title)==-1) result.push(childs[cpt]);
	return result;
}

config.macros.tagsTree.getRootTags = function(excludeTag){
	var tags = store.getTags(excludeTag);
	tags.sort(function(a,b) {return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : (a[0].toLowerCase() == b[0].toLowerCase() ? 0 : +1);});
	var result = new Array();
	for (var cpt=0; cpt<tags.length; cpt++) {
		var t = store.getTiddler(tags[cpt][0]);
		if (!t || t.tags.length==0) result.push(t ? t : {title:tags[cpt][0],fields:{}});
	}
	return result;
}

config.macros.tagsTree.getId = function(element){
	while (!element.id && element.parentNode) element=element.parentNode;
	return element.id ? element.id : "<html>";
}

config.shadowTiddlers.TagsTreeStyleSheet = "/*{{{*/\n";
config.shadowTiddlers.TagsTreeStyleSheet +=".leaf, .subtree {display:block; margin-left : 0.5em}\n";
config.shadowTiddlers.TagsTreeStyleSheet +=".subtree {margin-bottom:0.5em}\n";
config.shadowTiddlers.TagsTreeStyleSheet +="#mainMenu {text-align:left}\n";
config.shadowTiddlers.TagsTreeStyleSheet +=".branch .button {border:1px solid #DDD; color:#AAA;font-size:9px;padding:0 2px;margin-right:0.3em;vertical-align:middle;text-align:center;}\n";
config.shadowTiddlers.TagsTreeStyleSheet +="/*}}}*/";

store.addNotification("TagsTreeStyleSheet", refreshStyles); 

config.shadowTiddlers.MainMenu="<<tagsTree>>"

config.shadowTiddlers.PageTemplate = config.shadowTiddlers.PageTemplate.replace(/id='mainMenu' refresh='content' /,"id='mainMenu' refresh='content' force='true' ")

//}}}
* menu #1
** [[item #1-1]]
** [[item #1-2]]
** [[item #1-3]]
* menu #2
** [[item #2-1]]
** [[item #2-2]]
** [[item #2-3]]
<<dropMenu>>
/***
!Metadata:
|''Name:''|TiddlyCalendar|
|''Description:''|Tiddlers Calendar and Date picker|
|''Version:''|1.0.0|
|''Date:''|Nov 21, 2007|
|''Source:''|http://sourceforge.net/project/showfiles.php?group_id=150646|
|''Author:''|BramChen (bram.chen (at) gmail (dot) com)|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License]]|
|''~CoreVersion:''|2.2.3|
|''Browser:''|Firefox 1.5+; InternetExplorer 6.0|
|''Optional''|DatePlugin|
!Usage:
{{{<<tCalendar [year [month [count]]]>>}}}
{{{<<tCalendar [last [n] | next [n] {year(s) | month(s)}]>>}}}
eg,
{{{<<tCalendar>>}}},
{{{<<tCalendar 2007 10 3>>}}},
{{{<<tCalendar thisyear>>}}},
{{{<<tCalendar last year>>}}},
{{{<<tCalendar next 4 months>>}}}
{{{<<tCalendar lastModified>>}}}
!Revision History:
|''Version''|''Date''|''Note''|
|1.0.1|Dec 20, 2007|Added parameter 'lastModified' control for showing the month calendar including the last modified tiddler|
|1.0.0|Nov 21, 2007|Initial release|
!Code section:
***/
//{{{
version.extensions.tCalendar = {major: 1, minor: 0, revision: 0, date: new Date("Nov 21, 200")};

//# Calendar object
function Calendar()
{
	this.styles = Calendar.styles;

	this.callback = {
		fn: null,
		fnEnable: false,
		option: null,
		params: {date:null, title:null, celldate:null, cellClass:null, dateFmt:null}
	};
	return this;
};

Calendar.locale = 'en';
Calendar[Calendar.locale] = {
	dates: {
		days: ["Su", "M", "Tu", "W", "Th", "F", "Sa"],
		yearFmt: "YYYY",
		monthFmt: "mmm YYYY",
		dateFmt: "MMM DD, YYYY",
		longHolidayFmt: "0DD/0MM/YYYY",
		shortHolidayFmt: "0DD/0MM",
		startOfWeek: 0, /* 0,1*/
		weekends: [true, false, false, false, false, false, true], /* Default: 0 (Sun) and 6 (Sa) are true*/
		holidays: [] /* using short (or long) holidayFmt*/
	}
};

Calendar.styles = '/*{{{*/'
		+ '\ntable.calendarWrapper {border-collapse:collapse; border:2px solid #c6dbff;}'
		+ '\n.calendarWrapper td {border-collapse:collapse; border:1px solid #c6dbff; text-align:center;margin:0; padding:0 0.05em;}'
/*		+ '\ntable.calendar {border-collapse:separate; border:1px solid #c6dbff;}'*/
		+ '\ntable.calendar {border-collapse:collapse; border:0;}'
		+ '\n.calendar tbody, .calendar th, .calendar td, .calendar tr {border:0; text-align:center; font-size:1em; padding:0 0.1em;}'
		+ '\n.calendar th {color:#000; background-color:#c6dbff;}'
		+ '\n#sidebarOptions .calendar td {font-size:0.96em; margin:0; padding:0;}'
		+ '\n#sidebarTabs .calendar td, #mainMenu .calendar td  {padding:0 0.25em;}'
		+ '.calendar .naviBar select {border:0;}'
		+ '\n.calendar .today a {padding:0; border:1px solid blue;}'
		+ '\n.calendar .weekend {background-color:#deeeff;}'
		+ '\n.calendar .hasChanged {font-family:bold; background-color:#fe8; color:darkblue;}'
		+ '\n.calendar .holiday {font-weight:bold; font-size:1.06em; color:red;}'
		+ '\n.datePopup {background:#efffff;}'
		+ '\n.datePopup .isCreated {color:#df6300;}'
		+ '\n.datePopup .isExcluded {filter:alpha(opacity=60); -moz-opacity:0.6; opacity:0.6;}'
/*		+ '.viewer .calendarOptios {display:block;}'*/
		+ '\n/*}}}*/';

Calendar.prototype.getLocale = function()
{
	var locale = config.options.txtLocale ? config.options.txtLocale : Calendar.locale;
	return Calendar[locale] ? locale : 'en';
};

Calendar.prototype.show = function(place, year, month, count)
{
	this.locale=this.getLocale();
	var y, m = new Date().getMonth()+1, c = 1;
	c = isNaN(count) ? (isNaN(year) && isNaN(month) ? c : (!isNaN(year) && isNaN(month) ? 12 : c)) : parseInt(count);
	m = isNaN(month) ? (isNaN(year) ? m : (isNaN(month) ? 1 : parseInt(month))) : parseInt(month);
	y = isNaN(year) ? new Date().getFullYear() : parseInt(year);

	this.dateFmt = (this.callback.params.dateFmt) ? this.callback.params.dateFmt : Calendar[this.locale].dates.dateFmt;

	for (var i=0; i<c; i++){
		var firstDate = new Date(y,m-1+i,1);
		if ((m+i)%12 == 1 || i==0){
			var wrapper = createTiddlyElement(place,'table',null,'calendarWrapper');
			var tbody = createTiddlyElement(wrapper,'tbody');
			if (c > 1 && m==1 && c%12==0){
				this.naviBar(wrapper,tbody,firstDate,true);
			}
		}
		if (i%3 == 0)
			var tr = createTiddlyElement(tbody,'tr',null,'monthRow');
		var td = createTiddlyElement(tr,'td');
		td.vAlign = "top";

		this.selectMonth(td, firstDate);
	}
	if (c>3)
		Calendar.dummyDateCell(tr,(3-c%3)%3,2);
};

Calendar.prototype.selectMonth = function(place, firstDate)
{
	var year = firstDate.getFullYear();

	var calElm = createTiddlyElement(place,'table',null,'calendar');
	var monElm = createTiddlyElement(calElm,'tbody');

	this.naviBar(place,monElm,firstDate);

	if (store.isDirty() || !Calendar.tiddlers)
		Calendar.hashTiddlers(firstDate);

	this.showMonth(monElm, firstDate);
};

Calendar.prototype.naviBar = function(place,monElm,firstDate,isYearView)
{
	var cal = this;
	var monthHeader = createTiddlyElement(createTiddlyElement(monElm,'tr'),'td',null, 'naviBar', null, {colSpan:7});

	var _selectMonthHandler = function(s,date,isYearView){
		if (isYearView){
			cal.show(s.parentNode,date.getFullYear(),1,12);
			removeNode(s);
		} else {
			cal.selectMonth(s, date,cal.dateFmt);
			removeNode(s.firstChild);
		}
	};

	var onchange = function(ev){
		var e = ev ? ev : window.event;
		var date=null;
		for (var i=0, options=this.options; i<this.options.length; i++){
			if (options[i].selected)
				date = new Date(options[i].value);
		}
		_selectMonthHandler.call(this,place,date,isYearView);
		return false;
	};

	var year = firstDate.getFullYear();
	var n = 3;
	var y = isYearView ? year - n : year;
	var m = isYearView ? 0 : new Date(firstDate).getMonth()- n;
	var c = null;
	var options = [];
	var fmt = isYearView ? Calendar[this.locale].dates.yearFmt : Calendar[this.locale].dates.monthFmt;
	for (var i=0; i<n*2+1; i++){
		c= isYearView ? new Date(y+i,1,1) : new Date(y,m+i,1); 
		options.push({caption: c.formatString(fmt), name: c});
	}

	var sel=createTiddlyDropDown(monthHeader,onchange,options,n);
	sel.selectedIndex = n;
};

Calendar.prototype.showMonth = function(monElm, firstDate)
{
	var year = new Date(firstDate).getFullYear();
	var month = new Date(firstDate).getMonth()+1; 
	var lastDate = new Date(year,month,0).getDate();
	var nextFirstDay = new Date(year,month,1).getDay();

	var offset = (7 + firstDate.getDay() - Calendar[this.locale].dates.startOfWeek)%7;
	var	dayHearder = createTiddlyElement(monElm,'tr');
	for (var i=0, ii=0, text=null; i<7; i++){
		ii = (Calendar[this.locale].dates.startOfWeek + i)%7;
		text = Calendar[this.locale].dates.days[ii];
//#		createTiddlyElement(theParent,theElement,theID,theClass,theText,attribs)
		createTiddlyElement(dayHearder,'th',null,null,text); 
	}

	var d=1, dayRow=null, celldate=null, isWeekend = false;
	while (d<=lastDate){
		dayRow = createTiddlyElement(monElm,'tr');

		if (offset > 0)
			Calendar.dummyDateCell(dayRow,offset,6);

		for (var i=offset; i<7 && d <= lastDate; i++, d++){
			celldate = new Date(year, month-1, d);
			isWeekend = Calendar[this.locale].dates.weekends[(i + Calendar[this.locale].dates.startOfWeek)%7];
			this.showDate(dayRow, d, celldate, isWeekend);
		}

		offset=0;
	}
	var n = 7 - (7 + nextFirstDay - Calendar[this.locale].dates.startOfWeek)%7;
	if (n < 7)
		Calendar.dummyDateCell(dayRow,n,6);
};

Calendar.prototype.showDate = function(dayRow, date, celldate, isWeekend)
{
	var now = new Date();
	var dateFmt = this.dateFmt;
	var today = now.formatString(dateFmt);
	var cellClass = 'dateCell';
	var title = celldate.formatString(dateFmt);
	var day = celldate.getDay();
	var isToday = today == title;
	var isHoliday = this.isHoliday(celldate);

	if (isToday)
		cellClass += ' today';
	if (isWeekend)
		cellClass += ' weekend';
	if (isHoliday) 
		cellClass += ' holiday';

	var dateCell=createTiddlyElement(dayRow,'td',null,cellClass);

	var ymd = celldate.convertToLocalYYYYMMDDHHMM().substr(0,8);
	var callback = this.callback;
	var option = callback.option;
	if (!option){
		if (Calendar.tiddlers[ymd]){
			cellClass += ' hasChanged';
			option = 'popup';
		} else {
			option = 'displayTiddler';
		}
	}

	var params = callback.params;
	merge (params,{date:date, title:title, celldate:celldate, cellClass:cellClass, dateFmt:dateFmt});
	if (callback.fn instanceof Function && callback.fnEnable){
		callback.fn(dateCell, params);
	} else
		Calendar.optionHandler(dateCell, option, params, celldate);
};

Calendar.prototype.isHoliday = function(date) 
{
	return Calendar[this.locale].dates.holidays.containsAny([
		date.formatString(Calendar[this.locale].dates.longHolidayFmt),
		date.formatString(Calendar[this.locale].dates.shortHolidayFmt)]);
};

Calendar.dummyDateCell = function (srcElm,n,max)
{
	for (var i=0; i< n && i<max; i++)
		createTiddlyElement(srcElm,'td');
};

Calendar.hashTiddlers = function(date)
{
	if (date)
		var ymd = date.convertToLocalYYYYMMDDHHMM().substr(0,8);
	var isChanged = false;
	var tiddlers = {};

	store.forEachTiddler(function(title, tiddler){
		var modified = tiddler.modified.convertToLocalYYYYMMDDHHMM().substr(0,8);
		var created = tiddler.created.convertToLocalYYYYMMDDHHMM().substr(0,8);

//		if (modified.substr(0,6) == ymd.substr(0,6)){
//			var dd = modified.substr(6,2);
			var extraCellClass = '';
			extraCellClass += (tiddler.modified == tiddler.created) ? ' isCreated' : '';
			extraCellClass += tiddler.isTagged("excludeLists") ? ' isExcluded' : '';
			if (!tiddlers[modified])
				tiddlers[modified]=[];
			tiddlers[modified].push({title:tiddler.title, modified:tiddler.modified, ymd:modified, extraCellClass:extraCellClass});
//		}
	});

	this.tiddlers = tiddlers;
};

Calendar.optionHandler = function(srcElm,option,params,celldate)
{
	var fn = Calendar.optionType[option];
	var action = function(ev) {
		var e = ev ? ev : window.event;
			var fn = Calendar.optionType[option];
		if (fn instanceof Function)
			fn.call(this,e,srcElm,params);
		return false;
	};
//#	createTiddlyButton(parent,text,tooltip,action,className,id,accessKey,attribs);
	createTiddlyButton(srcElm, params.date, params.title, action, params.cellClass, null,null,params);
};

Calendar.optionType = {
	displayTiddler: function(e) {
		story.displayTiddler(null,this.title)
	},
	popup: function(e,daetCell) {
		var celldate = new Date(this.getAttribute('celldate'));
		Calendar.onClickDatePopup(e,daetCell,this.title,celldate);
	},
	pickDate: function(e) {
		Calendar.pickDate.call(this,e);
	}
};

Calendar.onClickDatePopup = function (ev,detaCell,title,celldate)
{
	var e = ev ? ev : window.event;
	if (store.isDirty())
		Calendar.hashTiddlers(celldate);

	var ymd = celldate.convertToLocalYYYYMMDDHHMM().substr(0,8);
	var tiddlers = Calendar.tiddlers[ymd];
	var popup = Popup.create(detaCell,null,'datePopup popup');
	createTiddlyElement(popup,'br');
	this.optionHandler(popup, "displayTiddler", {title:title, date:title});

	if (tiddlers){
		createTiddlyElement(popup,'hr');
		for (var i=0; i<tiddlers.length; i++)
			this.optionHandler(createTiddlyElement(popup,"li"), "displayTiddler",{date:tiddlers[i].title, title:tiddlers[i].title, cellClass:tiddlers[i].extraCellClass});
	}
	Popup.show();
	e.cancelBubble = true;
	if(e.stopPropagation) e.stopPropagation();
	return false;
};

Calendar.pickDate = function(ev)
{
	var e = ev ? ev : window.event;
	var inputId = this.getAttribute('inputId');
	if (inputId){
		var input = document.getElementById(inputId);
		if (input)
			input.value = this.title;
	}
	return false;
};
//}}}
/***
!Initialize Calendar
***/
//{{{
config.shadowTiddlers.CalendarStyle = Calendar.styles;
config.notifyTiddlers.pushUnique({name: 'CalendarStyle', notify: refreshStyles});
var calendar = new Calendar(); /* Create global Calendar object */
var datepicker = new Calendar(); /*Create global Date picker */
//}}}
/***
!Macros
***/
//{{{

config.macros.tCalendar = {
	init: function(){
		var fnEnable = config.options.chkCalendarCallback == undefined ? false : config.options.chkCalendarCallback;
		calendar.callback = {
			fn: this.showDate,
			fnEnable: (window.showDate instanceof Function && fnEnable),
			option: null,
			params: {date: null, dateFmt:null, celldate:null}
		};
	}
};

config.macros.tCalendar.handler = function(place,macroName,params)
{
	this.init();
	var mode = params[2] ? params[2] : (params[1] ? params[1] : params[0]);
	var modeType = params[0];
	var modeCount = isNaN(params[1]) ? 1 : parseInt(params[1]);

	var now = new Date();
	var y = now.getFullYear();
	var m = now.getMonth()+1;
	var c = isNaN(params[1]) ? 1 : parseInt(params[1]);
	switch (mode) {
		case 'month':
		case 'months':
			m = modeType == 'last' ? m - c : m + 1;
			break;
		case 'thisyear':
			m = 1;
			c = 12;
			break;
		case 'year':
		case 'years':
			y = modeType == 'last' ? y - c : y + 1;
			m = 1;
			c = 12 * c;
			break;
		case 'lastModified':
			var lastModified = this.getlastModified();
			y = lastModified.getFullYear();
			m = lastModified.getMonth()+1;
			c = 1;
			break;
		default:
			y = params[0];
			m = params[1];
			c = params[2];
	}
	calendar.show(place,y,m,c);
};

config.macros.tCalendar.showDate = function(dateCell,params)
{
	var isWeekend = (params.cellClass.indexOf('weekend') != -1);
//# For co-working with showDate() of DatePlugin
//#	showDate(place,date,mode,format,linkformat,autostyle,weekend)
	window.showDate(dateCell, params.celldate,'popup','DD',params.dateFmt,true,isWeekend);
};

config.macros.tCalendar.getlastModified = function()
{
	var tiddlers = store.reverseLookup("tags","excludeLists",false,'modified');
	return tiddlers[tiddlers.length-1].modified;
};

config.macros.datePicker = {
	onClick: function(ev) {
		var e = ev ? ev : window.event;
		var inputId = this.getAttribute("inputId");
		var dateFmt = this.getAttribute("dateFmt");
		dateFmt = dateFmt == 'null' ? null : dateFmt; /* For Opera */
		datepicker.callback = {
			fn: null,
			fnEnable: false,
			option: 'pickDate',
			params: {inputId:inputId, dateFmt:dateFmt}
		};

		var popup = Popup.create(this);
		datepicker.show(popup);
		Popup.show();

		e.cancelBubble = true;
		if(e.stopPropagation) e.stopPropagation();
		return false;
	}
};

config.macros.datePicker.handler = function(place,macroName,params)
{
	if (!params) return;
	var id = params[0];
	var dateFmt = params[1] ? params[1] : null;
	var pickParams = {inputId:id, dateFmt:dateFmt};

	var inputElm = createTiddlyElement(place,'input',id);
	var btn = createTiddlyButton(place, '?', 'Date Picker', this.onClick,'datepicker',null,null,pickParams);
};
//}}}
/***
|Name:|ToggleTagPlugin|
|Description:|Makes a checkbox which toggles a tag in a tiddler|
|Version:|3.1.0 ($Rev: 4907 $)|
|Date:|$Date: 2008-05-13 03:15:46 +1000 (Tue, 13 May 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ToggleTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)
* TouchMod flag - if non empty then touch the tiddlers mod date. Note, can set config.toggleTagAlwaysTouchModDate to always touch mod date
!!Examples
|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
!!Notes
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2
!!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing
* Should convert to use named params
***/
//{{{

if (config.toggleTagAlwaysTouchModDate == undefined) config.toggleTagAlwaysTouchModDate = false;

merge(config.macros,{

	toggleTag: {

		createIfRequired: true,
		shortLabel: "[[%0]]",
		longLabel: "[[%0]] [[%1]]",

		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			var tiddlerTitle = tiddler ? tiddler.title : '';
			var tag   = (params[0] && params[0] != '.') ? params[0] : "checked";
			var title = (params[1] && params[1] != '.') ? params[1] : tiddlerTitle;
			var defaultLabel = (title == tiddlerTitle ? this.shortLabel : this.longLabel);
			var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
			var touchMod = (params[3] && params[3] != '.') ? params[3] : "";
			label = (label == '-' ? '' : label); // dash means no label
			var theTiddler = (title == tiddlerTitle ? tiddler : store.getTiddler(title));
			var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
				if (!store.tiddlerExists(title)) {
					if (config.macros.toggleTag.createIfRequired) {
						var content = store.getTiddlerText(title); // just in case it's a shadow
						store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
					}
					else 
						return false;
				}
				if ((touchMod != "" || config.toggleTagAlwaysTouchModDate) && theTiddler)
						theTiddler.modified = new Date();
				store.setTiddlerTag(title,this.checked,tag);
				return true;
			});
		}
	}
});

//}}}

|~ViewToolbar|closeTiddler closeOthers +editTiddler > fields syncing permalink references jump|
|~EditToolbar|+saveTiddler -cancelTiddler deleteTiddler|
/***
|Name|TwHelpSearchPlugin|
|Source|http://twhelp.tiddlyspot.com/#TwHelpSearchPlugin|
|Documentation|http://twhelp.tiddlyspot.com/#TWHelpSearchDoc|
|Version|1.0.7|
|Author|Morris Gray|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.0 - 2.4|
|Type|plugin|
|Requires|[[SearchOptionsPlugin|http://www.TiddlyTools.com/#SearchOptionsPlugin]] [[TableSortingPlugin|http://tw.lewcid.org/#TableSortingPlugin]] (only for sorting option)|
|Overrides|SearchOptionsPlugin's search results|
|Description|Extends the search results from SearchOptionsPlugin to a sortable table showing title, size and tags.|
 ''Demo search:''
|>|>|>|<<search>> |
|>|>| look for in |>|>|>|
| <<option chkSearchTitles>> | <<option chkSearchText>> | <<option chkSearchTags>> | <<option chkHoldSearches>> |
| titles |  text  | tags | hold |

''A Plugin Tweak for:'' SearchOptionsPlugin
!!!!!Description
<<<
This plugin defines an alternative format for the SearchResults tiddler that is generated by the SearchOptionsPlugin . It presents the search results in tabular form numbering the rows; and showing the tiddler title, the size in bytes, and the tags.  It is ready to be used with the [[TableSortingPlugin|http://tw.lewcid.org/#TableSortingPlugin]] (check versions) so any column can be sorted; such as size in ascending or descending order.
<<<
!!!!!Installation
<<<
Import (or copy/paste) the following tiddlers into your ~TiddlyWiki:
* http://twhelp.tiddlyspot.com/#TwHelpSearchPlugin
*SearchOptionsPlugin from http://www.tiddlytools.com/#SearchOptionsPlugin
* Get more documentation here [[TWHelpSearchDoc]] or here:
* http://twhelp.tiddlyspot.com/#TwHelpSearchDoc
<<<
!!!!!Revision History
<<<
''2009.02.18  [1.0.7]'' 
Removed text coloring of headers re: conflict with TableSortingPlugin refresh.
''2008.09.14  [1.0.6]'' 
Cosmetic - Add header.
''2007.09.12  [1.0.6]''
Added overflow scroll to TWHelp-SearchResults for long titles or tags.
''2006.02.03  [1.0.5]''
Added facility for holding the results of multiple searches with tick box on dashboard.
''2006.02.02  [1.0.4]''
Added several options, cleaned up design.Planning one version basic and one with added options this is the added options version.
''2006.01.27  [1.0.3''
Added a column for the size of the text in each tiddler, this does not include the size of the title or tags.  Added overall TW statistics button requires TiddlerStatsPlugin.
''2006.01.23 [1.0.2 ]''
''a)''Changed function reportSearchResults(text,matches) to  window.reportSearchResults=function(text,matches)
''b)''Added a line so that Incremental Search is automatically disabled config.options.chkSearchIncremental=false; turn off key-by-key searching
''c)''Removed space inside parens. bgcolor(#fe8 )" to "bgcolor(#fe8)".  This
is what was causing IE to 'crap out' halfway through drawing the table
headings.
''d)''Added {{{config.options.chkSearchList=true;}}}
''2006.01.20 [1.0.1]''
ELS: reportSearchResults() definition moved to this Plugin Tweak tiddler and removed extranous code
''2006.01.19 [1.0.0]''
This is an adaptation of Eric Shulman's SearchOptionsPlugin. Adapted by MorrisGray to provide search results in table form. All the necessary controls for refining the search is provided within the table including slide-down access to AdvancedOptions.
<<<
!!!!!Code
***/

//{{{
if (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=false;
if (config.options.chkRegExpSearch==undefined) config.options.chkRegExpSearch=true;
if (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=false;
if (config.options.chkSearchText==undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags==undefined) config.options.chkSearchTags=false;
if (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=true;
if (config.options.chkSearchList==undefined) config.options.chkSearchList=true;
if (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=false;
if (config.options.chkToggleLinks==true) config.options.chkToggleLinks=false;
if (config.options.chkHoldSearches==undefined) config.options.chkHoldSearches=false;
if (config.options.chkSortTags==undefined) config.options.chkSortTags=false;

config.options.chkToggleLinks=false;
config.options.chkSinglePageMode=false;
config.options.chkHoldSearches=false;
config.options.chkSearchIncremental=false;
config.options.chkHttpReadOnly = false;
config.options.chkRegExpSearch=true;
config.options.chkSearchList=true;
config.options.chkToggleLinks=false;

config.shadowTiddlers.AdvancedOptions += "\n<<option chkHoldSearches>> Hold search results";


//}}}

//{{{

// Give the report a custom name
config.macros.search.reportTitle="TWHelp-SearchResults";

// Override default SearchOptionsPlugin formatting for SearchResults tiddler
window.reportSearchResults=function(text,matches)

{
  
        var title=config.macros.search.reportTitle
	config.macros.search.reportTitle;
      	var q = config.options.chkRegExpSearch ? "/" : "'";
        if (!config.options.chkHoldSearches)  body=""; 
      
body+="\n|>|bgcolor:#8af;@@color(#000080):''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''@@|bgcolor:#8af;  @@color:#A00000; SearchHelp@@ "+"|"+"\n";
        body+="|>|>|bgcolor:#E3FFE3;<<search>> <<option chkSearchTitles>> Titles <<option chkSearchText>> Text <<option chkSearchTags>>Tags <<option chkHoldSearches>> Hold |"+"\n";
       
        body+="\n|bgcolor:#8af;&nbsp;|bgcolor:#8af; sort by:''Titles'' |bgcolor:#8af; ''Size'' |bgcolor:#8af; ''Tags'' |h";
	for(var t=0;t<matches.length;t++) 
        body+="\n"+"| "+(t+1)+"|[["+matches[t].title+"]]| "+matches[t].text.length+"|"+matches[t].tags+"|";
         body+="\n|sortable|k";
         body+="\n";


	// create/update the tiddler
	var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
	tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch killbookmark");
	store.addTiddler(tiddler); story.closeTiddler(title);

	// render tiddler
	var oldprompt=config.macros.search.label;
	config.macros.search.label="search again"; // use alternate "search again" label
        story.displayTiddler(null,title,1); // force refresh
	config.macros.search.label=oldprompt;	// restore standard search label
}

//}}}
<<gradient horiz #cceedd #ffffff #cceedd >>

Ist man stolzer Besitzer der USB Experimentierplatine der Fa. Velleman, so kann man damit arbeiten - bzw. experimentieren. Zunächst sollte man die mitgelieferte DLL in das Projektverzeichnis kopieren und kann deren Befehle dann wie folgt in Delphi verwenden:

<code delphi>
function OpenDevice(CardAdress:Longint):Longint; stdcall; external 'K8055d.dll';
procedure CloseDevice; stdcall; external 'K8055d.dll';
procedure  SetDigitalChannel(Channel: Longint);   stdcall; external  'K8055d.dll' ;
procedure   ClearDigitalChannel(Channel: Longint);  stdcall; external 'K8055d.dll';
procedure   ClearAllDigital;  stdcall; external 'K8055d.dll';
function  ReadDigitalChannel(Channel: Longint): Boolean; stdcall; external 'K8055d.dll';
</code>

weitere Befehle sind:
<code delphi>
function   ReadAnalogChannel(Channel: Longint):Longint;   stdcall; external 'K8055d.dll';
procedure  ReadAllAnalog(var Data1, Data2: Longint);  stdcall; external 'K8055d.dll';
procedure  OutputAnalogChannel(Channel: Longint; Data: Longint); stdcall; external 'K8055d.dll';
procedure  OutputAllAnalog(Data1: Longint;  Data2: Longint);  stdcall; external 'K8055d.dll';
procedure   ClearAnalogChannel(Channel:  Longint); stdcall ; external 'K8055d.dll';
procedure  ClearAllAnalog;   stdcall; external 'K8055d.dll ';
procedure  SetAnalogChannel(Channel: Longint); stdcall; external 'K8055d.dll';
procedure   SetAllAnalog;  stdcall ; external 'K8055d.dll';
procedure  WriteAllDigital(Data: Longint);stdcall; external 'K8055d.dll' ;
procedure   ClearDigitalChannel(Channel:  Longint); stdcall; external 'K8055d.dll';
procedure   ClearAllDigital;  stdcall; external 'K8055d.dll';
procedure   SetAllDigital;  stdcall; external 'K8055d.dll';
function   ReadAllDigital:  Longint;  stdcall; external 'K8055d.dll';
function   ReadCounter(CounterNr:  Longint):  Longint;  stdcall; external 'K8055d.dll';
procedure   ResetCounter(CounterNr:  Longint);  stdcall; external 'K8055d.dll';
procedure   SetCounterDebounceTime(CounterNr, DebounceTime:Longint); stdcall; external 'K8055d.dll';
</code>

dabei sind die Befehlsnamen soweit selbstredend, das ich bis auf weiteres auf Erleuterungen verzichte.
Viel Spaß beim Experimentieren!

<<gradient vert #cceedd #ffffff #cceedd >>
Da Delphi im Bogenmaß (Rad) rechnet und einem so einfache Formeln, wie die Umrechnung vom Bogenmaß in Grad (Deg) manchmal nicht einfallen, erinnern wir uns hiermit:

!!''2*Pi = 360°''
daraus folgt für die Umrechnung:
!!''Deg = Rad / Pi * 180''
oder andersrum:
!!''Rad = Deg / 180 * Pi''
Punkt aus [[Delphi Sprachausgabe (englisch)]]
Punkt aus [[Delphi Sprachausgabe (englisch)]]
Hat man ein Fenster, mit einer Minsize (über Constraints), so kommt es zum Phänomen, dass das Fenster nach dem Resize aufs Minimum dann um genau diesen Wert verschoben wird.
Die Lösung zu diesem Problem habe ich auf Delphipraxis im Forum gefunden:

<code delphi>
private 
    procedure WMSizing(var AMsg: TMessage); message wm_sizing; 
[...] 
procedure TForm1.WMSizing(var AMsg: TMessage); 
var 
  lRect : PRect; 
begin 
  lRect := PRect(AMsg.LParam); 

  if (Constraints.MinWidth > 0) and (lRect.Right - lRect.Left < Constraints.MinWidth) then 
  begin 
    if (AMsg.WParam = WMSZ_RIGHT) or (AMsg.WParam = WMSZ_BOTTOMRIGHT) or
      (AMsg.WParam = WMSZ_TOPRIGHT) then 
      lRect.Right := lRect.Left + Constraints.MinWidth 
    else 
      lRect.Left := lRect.Right - Constraints.MinWidth; 
  end; 


  if (Constraints.MinHeight > 0) and (lRect.Bottom - lRect.Top < Constraints.MinHeight) then 
  begin 
    if (AMsg.WParam = WMSZ_Bottom) or (AMsg.WParam = WMSZ_BOTTOMRIGHT) or 
      (AMsg.WParam = WMSZ_BOTTOMLEFT) then 
      lRect.Bottom := lRect.Top + Constraints.MinHeight 
    else 
      lRect.Top := lRect.Bottom - Constraints.MinHeight; 
  end; 
end;
</code>

@@color(green):// Folgende Resource Typen habe ich mir bei [[Birger|http://www.tech-ecke.de]] kopiert, ob die Liste vollständig ist weiss ich nicht, gearbeitet habe ich bisher nur mit RCDATA (für ein GIF) und WAVE für eine Wave.//@@

<<<
~RT_WAVE Wave Datei
~RT_ACCELERATOR   Accelerator table 
~RT_BITMAP   Bitmap resource 
~RT_DIALOG   Dialog box 
~RT_FONT   Font resource 
~RT_FONTDIR   Font directory resource 
~RT_MENU   Menu resource 
~RT_RCDATA   Application-defined resource (raw data) 
~RT_STRING   String-table entry 
~RT_MESSAGETABLE   Message-table entry 
~RT_CURSOR   Hardware-dependent cursor resource 
~RT_GROUP_CURSOR   Hardware-independent cursor resource 
~RT_ICON   Hardware-dependent icon resource 
~RT_GROUP_ICON   Hardware-independent icon resource
<<<
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagglytags' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagglytagging' macro='tagging'></div>
<div class='tagClear'></div>
<!--}}}-->
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Was ist DELPHI?>>
<<gradient vert #cceedd #ffffff #cceedd >>
@@color(darkcyan):DELPHI ist eine Programmiersprache. Es entstand aus Pascal und wurde anfänglich Objekt Pascal genannt, denn es ist eine sogenannte objektorientierte Programmiersprache kurz OOP. Was das ist können andere sicher besser erklären als ich (Anfänger) - Warum ich mich für Delphi entschieden habe? Eigentlich waren es zwei Gründe:@@
# @@color(DarkCyan):Ein Kollege von mir bringt es sich ebenfalls autodidaktisch bei.@@
# @@color(DarkCyan):Die Lernkurve von DELPHI ist motivierend steil. Man erzielt sehr schnell "sichtbare" Ergebnisse.@@

@@color(DarkCyan):Dieses [[TiddlyWiki|Was ist TiddlyWiki?]] stellt nun mein gesammeltes und hoffentlich wachsendes Wissen zu dieser Programmiersprache dar und soll mir als [[Codeschnipseldatenbank|Delphi Codeschnipsel]] dienen.@@>>
<<<
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Was ist ~OpenGL?>>

@@color(DarkCyan):~OpenGL ist eine Art Programmiersprache / Befehlssatz mit dem man speziell den 3D Grafikteil seiner Grafikkarte ansprechen kann. Eingebettet in Delphi kann man mit recht kleinem Aufwand bereits erstaunliche Ergebnisse und Effekte auf den Bildschirm zaubern und das macht mir schlicht und ergreifend einen Riesen Spaß.@@
<<<
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Was ist ~TiddlyWiki und warum verwende ich es?>>
<<gradient horiz #cceedd #ffffff #cceedd >>
@@color(darkcyan):~TiddlyWiki ist das, was man hier sieht. Eine Art einfaches Wiki. Man bekommt die jungfräuliche Blanko Version - wer hätte es gedacht auf [[www.tiddlywiki.com|http://www.tiddlywiki.com]].
Weitere spannende Derivate und Vorlagen findet man auf [[www.tiddlyspot.com|http://www.tiddlyspot.com]]. Einfach mal reinschauen bevor man loslegt - eventuell findet man da Vorlagen, auf welchen man leichter aufbauen kann, als auf dem blanko Formular. Ich selbst habe die Seite erst später gefunden und bleibe jetzt ersteinmal hierbei.
Warum ich es verwende, ist einfach - ich suchte nach einer Möglichkeit eine Art Wissensdatenbank aufzubauen, um bei meinem neuen Hobby (Programmieren) Codeschnipsel so zu speichern, das ich sie auch wieder finde. Zunächst dachte ich daran es in einer Homepage zu versuchen, allerdings kann ich kein html und habe auch ehrlich gesagt nur mässiges Interesse daran. Ich versuchte es trotzdem unter Zuhilfenahme von halbfertigen und komplett fertigen Designvorlagen; mit mässigem Ergebnis bei mittlerem Aufwand.
Also beschloss ich nach Alternativen zu suchen (Googleholiker?) und stiess auf ''~TiddlyWiki'', vom lustigen Namen angetan (ich finde Wörter die lustig klingen irgendwie gut) erregte ~TiddlyWiki meine Aufmerksamkeit. Was ich sah, gefiel mir - Liebe auf den ersten Klick *) war es dennoch nicht - ich brauchte noch eine Möglichkeit DELPHI Code vernünftig darzustellen. 
<code delphi>
procedure
begin
 und zwar innerhalb einer 'Codebox' mit Textformatierung für Delphi Code,0,0;
end;
</code>
Es kostete mich beinahe den kompletten 8. Februar 2009 mein neues Spielzeug ~TiddlyWiki so zu ertüchtigen, das es Delphi Code wie oben darstellen kann. Danach war das Eis gebrochen - ich lernte und lerne mehr über ~TiddlyWiki, wie man es gestaltet und umgestaltet. Es ist einfach, flexibel und durch eine ungeheure Vielzahl von leicht installierbaren Plugins individuell ausbaufähig.
Dennoch will ich auch die Nachteile nicht verschweigen:@@ 
*Die zumeist englische Dokumentation, die bisweilen eher insidermässig ist, kann einen manchmal zur Verzweiflung bringen.
*Mir ist unklar bis zu welcher "Größe" ~TiddlyWiki tauglich ist, ab wann es an die Grenzen kommt sowohl vom Handling als auch von der Übersichtlichkeit her. Andererseits - das mit der Unübersichtlichkeit hat man wohl in fast jeder Datenbank ab einer gewissen Komplexität.
*Es ist auf den ~FireFox Browser optimiert - ob das ein Nachteil ist, hängt vom persönlichen Geschmack ab.
*Warum auch immer, aber bei mir am Arbeitsplatz kann ich meine und viele andere TiddlyWiki Seiten nicht öffnen, der jeweilige Browser lädt aber es bleibt ein weisser Bildschirm.
Obwohl ich die Dokumentation zu ~TiddlyWiki nicht gerade als gelungen bezeichnen würde, werde ich hier auch keine beginnen. Wer selbst mit ~TiddlyWiki arbeiten möchte findet viele gute Tipps bei den externen Links zu ~TiddlyWiki.


~~@@color(darkcyan):*) Wäre ''{{{Liebe auf den ersten Klick}}}'' nicht ein cooler Titel für eine Liebeskomödie? Herr Spielberg, wenn sie das lesen, ich verkaufe ihnen gerne die Titelidee.@@~~
<<<
<<gradient horiz #cceedd #bbccbb #cceedd >>
Im ~Font3D Beispiel von Saluco verwendet er dies um den Text gleichmässig (sinusförmig) zu rotieren.
Ich habe es leicht abgewandelt benutzt um erste kleine Bewegungseffekte in das Template zu bringen. 
So kann man es auf das gegebene Viereck anwenden um gleichmässig die Farbe oder die position der ecken zu verschieben.
<code delphi>
  glBegin(GL_QUADS);
    glColor3f((Sin(GetTickCount() / 1000)), 0, 0); glVertex3f((cos(GetTickCount() / 1000)), 0, 0);
    glColor3f(0, 1, 0); glVertex3f(1, (Sin(GetTickCount() / 1000)), 0);
    glColor3f(0, (cos(GetTickCount() / 1000)), 1); glVertex3f((Sin(GetTickCount() / 1000)),(cos(GetTickCount() / 1000)), 0);
    glColor3f(1, 1, 0); glVertex3f(0, 1, (Sin(GetTickCount() / 1000)));
  glEnd;
</code>
<<<
<<gradient horiz #cceedd #ffffff #cceedd >>
@@color(darkcyan): Navigieren auf dieser Seite ist denkbar einfach. Man klickt sich durch oder verwendet rechts das search um nach Begriffen zu suchen. In der Regel öffnet sich beim anklicken von Links ein sogenannter "Tiddler", das ist im Grunde nichts anderes als ein kurzer Artikel mit Informationen zum Thema. 
 Beim Klicken auf Links ist eine Sache zu beachten: unterstrichene Links führen nach draussen, öffnen also eine neue Homepage über das Internet. Nicht unterstrichene Links sind hingegen interne links auf dieser Seite.
 Beispiel: Dieser Link hier führt extern auf meine ''[[Homepage|http://www.code-woelfchen.de]]'', wohingegen dieser hier intern ist: [[Beispiel|Wo bin ich?!]]. Ich wünsche viel Spaß beim Stöbern, wer Kontakt zu mir   aufnehmen will kann dies über [[Kontakt]] gerne tun.@@
>>
<<gradient vert #cceedd #ffffff #cceedd >>

der Winkel zwischen zwei Vektoren wird wie folgt berechnet:
!!cos Gamma = a*b/|a|*|b|
Wenn a und b Einheitsvektoren sind bleibt damit:
!!cos Gamma = a*b
(was ja logisch ist, da im Nenner dann 1*1 rauskommt)

Delphi Beispiel:
<code delphi>
winkel:=arccos(((ax*bx+ay*by+az*bz)/(sqrt(ax*ax+ay*ay+az*az)*sqrt(bx*bx+by*by+bz*bz))));
</code>

oder wenn a und b Einheitsvektoren sind:
<code delphi>
winkel:=arccos(ax*bx+ay*by+az*bz);
</code>

Da es sich beim Ergebnis hier um den Winkel im Bogenmaß handelt will man vielleicht noch umrechnen:
[[Umrechnung von Rad in Deg]]

<code delphi>
winkel:=((arccos(ax*bx+ay*by+az*bz)/pi)*180);
</code>
<<<
!<<gradient vert #aaccbb #ffffff #aaccbb >>Hallo erstmal...>>
[img[http://file1.npage.de/003341/04/bilder/logo.gif]]
<<gradient horiz #cceedd #ffffff #cceedd >>@@color(darkcyan):Diese Seite ist eine persönliche Sammlung von Codeschnipseln, Tutorial Ergebnissen und meine Wissensdatenbank bezüglich der drei Themengebiete:@@

*''[[DELPHI|Was ist Delphi?]]''
*''[[OpenGL|Was ist OpenGL?]]''
*''[[TiddlyWiki|Was ist TiddlyWiki?]]'' 

@@color(darkcyan):Dabei übernehme ich selbstverständlich keine Verantwortung dafür, ob die hier gesammelten Informationen, Beispiele und Angaben zutreffend oder gar schädlich sind. Wer mit mir Kontakt aufnehmen möchte klickt bitte auf ''[[Kontakt]]''. Eine kurze Erläuterung, wie man auf dieser Seite navigiert gibt es unter [[Wie geht das hier?]].@@>>


[[Neuigkeiten]] kann man hier nachlesen.
Die letzten Änderungen sieht man hier:
<<recentChanges 3 10em groupbox>>
<<recentChanges 10 10em groupbox>>
<<recentChanges 30 10em groupbox>>
<<<
Noch ausstehende Dokumentationen