眼瞅馬年伊始,Delphi版塊門可羅雀,新貼寥寥無幾,鄙人又閑來無事,故發此貼來攢點人氣!
鄙人才疏學淺,難免會有不嚴謹甚至錯誤之處,還望各路英豪海涵并指正!也歡迎各位賢良之才高談闊論,發表高見!閑言少敘,鄙人就一馬當先,拋磚引玉了:
加入一句{$R WindowsXP},控制元件具有系統主題風格。

ps:
鄙人近日為生計所困,雖不至于衣不蔽體、窮困潦倒,但也算是菲食薄衣了,哪位愛心人士心懷慈悲,見鄙人還有點用,讓鄙人有償改個bug或做個模塊啥的,鄙人定當竭盡所能、全力以赴、感激涕零!BTW, 版主大人大人有大量,別把帖給刪了,別燒了我的救命稻草!
uj5u.com熱心網友回復:
已擼
uj5u.com熱心網友回復:
,,,頂頂頂,
uj5u.com熱心網友回復:
看過樓主的幾個帖子,水平很高,代碼很精煉uj5u.com熱心網友回復:
見笑了,哪里哪里,過獎過獎!
uj5u.com熱心網友回復:
加上開關{$O-},取消代碼優化,這樣被優化的陳述句就可以下斷點了,利于除錯。{$O-}
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
I:=1;//加上開關后,此處就可以下斷點了
end;
{$O+}
uj5u.com熱心網友回復:
已擼
uj5u.com熱心網友回復:
支持樓主,繼續到料出來。uj5u.com熱心網友回復:
增加人氣! 樓主繼續爆料uj5u.com熱心網友回復:
謝過!可是單絲不成線,獨木不成林,我單槍匹馬、勢單力薄,而老兄之才華另人向若而嘆,又樂善好施、助人為樂,也抖點料出來唄!uj5u.com熱心網友回復:
持續跟蹤學習uj5u.com熱心網友回復:
標記跟蹤。。。uj5u.com熱心網友回復:
幫你頂起來,繼續更新uj5u.com熱心網友回復:
從TInterfacedObject派生的類,可以利用介面會自動釋放的特性,來省掉顯示呼叫Free。implementation
{$R *.dfm}
type
TMyObject = class(TInterfacedObject)
private
FMsg: string;
procedure ShowMsg;
public
destructor Destroy; override;
end;
{ TMyObject }
destructor TMyObject.Destroy;
begin
ShowMessage('Free了');
inherited;
end;
procedure TMyObject.ShowMsg;
begin
ShowMessage(FMsg)
end;
procedure TForm1.FormCreate(Sender: TObject);
var
I: IInterface;
O: TMyObject;
begin
O := TMyObject.Create;
I := O;
O.FMsg := 'abc';
O.ShowMsg;
//此處并沒有顯示呼叫O.Free,但由于I自動釋放,就隱式呼叫了O.Free!
end;
end.
uj5u.com熱心網友回復:
1、6樓的不錯,LS的就不太算技巧了,都是見于教科書中的知識點。期待LZ繼續爆料,跟蹤學習中~~
uj5u.com熱心網友回復:
LZ多爆點編譯指令和inc的技巧來學習學習嘛
uj5u.com熱心網友回復:
什么版本開始支持這個的uj5u.com熱心網友回復:
不知道,我在delphi7下測驗的!uj5u.com熱心網友回復:
inc的話,個人認為,就是可以把一些關鍵的地方獨立到一個檔案。特別是代碼比較多的單元檔案,把一些可能會改到的地方獨立到一個檔案,就比較好使!
比如
Unit1.pas
procedure TForm1.FormCreate(Sender: TObject);
const
{$I str.inc}
begin
ShowMessage(MSG);
end;
str.inc
MSG = 'abc';
uj5u.com熱心網友回復:
這個好,繼續關注~用法俺了解,想了解一些技巧和需要注意的地方
另外一些第三方組件中基本都會使用inc,好像還會有交叉的,有時看原始碼看得自己有點亂
uj5u.com熱心網友回復:
貌似他們的inc里面都是$IFDEF和$DEFINE之類的uj5u.com熱心網友回復:
設定標題可以用[color=#FF0000]SetTextBuf('abc')或Text:='abc'[/color].procedure TForm1.FormCreate(Sender: TObject);
begin
SetTextBuf('abc');
ShowMessage(Text);
Text := 'def';
ShowMessage(Caption)
end;
uj5u.com熱心網友回復:
絕對的好帖子啊uj5u.com熱心網友回復:
用delphi的人好少了,招的人也少uj5u.com熱心網友回復:
樓主好筒子, 力頂
uj5u.com熱心網友回復:
新建一個控制臺工程,然后把{$APPTYPE CONSOLE}注釋掉,或者換成{$APPTYPE GUI},這樣就變成不帶任何視窗的工程了。program Project1;
//{$APPTYPE CONSOLE}
uses
SysUtils,
Dialogs;
begin
ShowMessage('abc')
end.
新建一個普通工程,然后在工程源檔案里,在program一句的下一行加上{$APPTYPE CONSOLE},這樣就可以在程式中使用Write之類的陳述句在控制臺輸出除錯資訊了。
program Project2;
{$APPTYPE CONSOLE}
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Write('start!');
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
uj5u.com熱心網友回復:
有痔青年再次擼過學習
uj5u.com熱心網友回復:
愛好者支持一下!uj5u.com熱心網友回復:
單元檔案最后一行“end.”前可以加上begin或asm,然后中間可以加上代碼,這段代碼在單元初始化的時候執行。implementation
{$R *.dfm}
begin//這里也可以是asm
MessageBeep(MB_OK)
end.
uj5u.com熱心網友回復:
新年擼過!.
uj5u.com熱心網友回復:
procedure也可以有回傳值:procedure Add(a,b:Integer);
asm//eax存盤a,edx存盤b,相加的結果又保存到eax
add eax,edx
end;
procedure TForm1.FormCreate(Sender: TObject);
type
TAdd=function(a,b:Integer): Integer;
var
P: Pointer;
I: Integer;
begin
P := @Add;
I := TAdd(P)(1,2);
ShowMessageFmt('%d', [I])
end;
uj5u.com熱心網友回復:
樓主好牛的樣子,這些技巧我都不知道,這幾年算是白混了,頂樓主uj5u.com熱心網友回復:
{$R 'zz.res' 'zz.rc'}這樣就能在工程里包含zz.rc腳本,并自動build出zz.res!
uj5u.com熱心網友回復:
通過指標,可以對只讀屬性進行寫操作。type
TObj = class
private
FNumber: Integer;
public
property Number: Integer read FNumber;//只讀屬性,不可寫
end;
procedure TForm1.FormCreate(Sender: TObject);
var
O: TObj;
begin
O := TObj.Create;
PInteger(@O.Number)^ := 2;//通過指標的方式訪問
ShowMessageFmt('%d', [O.Number]);
O.Free;
end;
uj5u.com熱心網友回復:
MARK一下,學習中
uj5u.com熱心網友回復:
通過內嵌匯編,可以對只寫屬性進行讀操作。type
TObj = class
private
FNumber: Integer;
public
property Number: Integer write FNumber;//只寫屬性,不可讀
end;
procedure TForm1.FormCreate(Sender: TObject);
var
O: TObj;
I: Integer;
begin
O := TObj.Create;
O.Number := 2;//對此句下斷點,看cpu,可看到O.Number的地址為eax+4
asm
push edx
mov edx, [eax+4]
mov I, edx
pop edx
end;
ShowMessageFmt('%d', [I]);
O.Free;
end;
uj5u.com熱心網友回復:
good good study,day day upuj5u.com熱心網友回復:
高手,學習了uj5u.com熱心網友回復:
LZ懂得真多啊^uj5u.com熱心網友回復:
區域常量字串 or 全域常量字串?procedure a;
const
STR = 'abc';
begin
Form1.Tag := Integer(PChar(STR));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
a;
ShowMessage(PChar(Form1.Tag))
end;
uj5u.com熱心網友回復:
LZ真是高手啊,學習了。uj5u.com熱心網友回復:
哇! 樓主的思維相當有穿透力與洞悉力~ 實在佩服!uj5u.com熱心網友回復:
每年一飄。。。。。uj5u.com熱心網友回復:
把.dpr檔案的第一行program Project1;注釋掉之后,再把{$R *.res}改為{$R Project1.res}或干脆也注釋掉,照樣可以Build成功。//program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
//{$R *.res}
{$R Project1.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
再來另一個省略program的例子,運行包含以下代碼的批處理檔案,則build出來a.exe。
@more /e +1 "%~f0">a.dpr&dcc32 a&goto :eof
uses Windows;
begin
MessageBeep(MB_OK)
end.
[size=9px]ps:本人最近有要事在身,最近幾天不會更新了![/size]
uj5u.com熱心網友回復:
得到結構中元素的偏移值
type
PTestStru = ^TTestStru;
TTestStru = record
ID : integer;
B : Boolean;
Name : String;
Time : TSystemTime;
Closed : Boolean;
Prop : DWORD;
end;
var
iOffset : integer;
begin
//得到Closed在TTestStru結構中的偏移
iOffset := Integer(@PTestStru(NIL).Closed);
//該方法只能運行時得到,不能用這個運算式定義常量.囧
end;
uj5u.com熱心網友回復:
幫頂。。。。
uj5u.com熱心網友回復:
希望高手們不斷接力,蓋起高高的大樓~
uj5u.com熱心網友回復:
是呀,支持,,蓋城迪拜樓uj5u.com熱心網友回復:
●●還以為看錯了呢!發表于: 2014-02-06 13:23:59 新帖啊樓主還在使用加入一句{$R WindowsXP},控制元件具有系統主題風格???都2014年了,還在用什么版本?
{$R WindowsXP}根本就已經淘汰了!就這樣誰敢給你救命稻草?
如果是多年前的老版本比如D7,放幾個按鈕、單選、復選框,編譯后按一下Alt試試?......
新版本直接工程--選項--應用程式--選中啟用運行時主題,即可!
uj5u.com熱心網友回復:
樓主好強大!最關鍵是樂于分享!
uj5u.com熱心網友回復:
LSS,LZ分享的是一些技巧性的東西,不是分享如何實作某一個功能。你不會是看到一個人騎自行代步,就認為這個人不會開機動車了?
uj5u.com熱心網友回復:
頂!大俠拔刀相助,豪氣蓋天,頂!
uj5u.com熱心網友回復:
兄臺叩馬而諫,頂!
uj5u.com熱心網友回復:
string型別的變數自動初始化為空字串,不管是全域變數還是區域變數。procedure TForm1.FormCreate(Sender: TObject);
var
S: string;
begin
S := '';//此句可省略
S := S + 'abc';
S := S + 'def';
ShowMessage(S)
end;
uj5u.com熱心網友回復:
procedure Test;
asm
MOV EAX , SizeOf(TSystemTime) //編譯不過
MOV EAX , DWORD(SizeOf(TSystemTime)) //可以
MOV EAX , integer(SizeOf(TSystemTime)) //可以
MOV EAX , Offset SizeOf(TSystemTime) //可以
end;
uj5u.com熱心網友回復:
頂啊,,, 剛開始學delphi的時候對那些{}大括號的老不理解,也查不出來..還有初學的時候也特別想了解 技巧什么的有木有...
uj5u.com熱心網友回復:
留名Markuj5u.com熱心網友回復:
向高手致敬!!uj5u.com熱心網友回復:
奇怪,我一開始測驗也是這樣。
不過我后來再測,發現EAX始終等于50!
估計還是得用TYPE!
MOV EAX, TYPE TSystemTime
uj5u.com熱心網友回復:
ShowMessage(#$6162);顯示字串“慢”,其中$6162是“慢”的Unicode編碼。
uj5u.com熱心網友回復:
受教了。樓主可以出面去接些工程,比如連鎖經營的零售業方面的,屆時不妨可轉點任務讓我來做。我現在正在學習使用TRzGrid方面的控制元件,對DataController,Columns[i]已經有一定認識了。在如何方便錄入資料,降低資料錄入差錯率,以及如何避免反復觸發DataSourceChanged,OnXXXSetText導致大資料處理變慢方面,已摸索出一些技巧。uj5u.com熱心網友回復:
這種懶,最好不要省略。
uj5u.com熱心網友回復:
呵呵,為啥你不出面去接些工程,給我點任務做!uj5u.com熱心網友回復:
以前剛學c語言的時候,看到交換I,J的值,是通過一個臨時變數。雖然當時學的時候明白了,但在實踐中很容易弄糊涂。如果用兩個臨時變數,會不會交換得更自然點:var
I,J,I2,J2: Integer;
begin
I2 := I;
J2 := J;
I := J2;
J := I2
end;
uj5u.com熱心網友回復:
這個方式對於初學者來說很好理解...不過熟能生巧後也不容易弄錯囉~ 雖然基礎自帶也有交換函式...但交換還是直接以 CPU 之 xchg 指令處理最快...卻也只能局限於暫存器與記憶體單工分次處理...理想上分別指定來源與目的定址後以1 個 Clock 處理完成...實際現況礙於單數據匯流排整體設計慣例之商業用途 CPU 製造成本......
uj5u.com熱心網友回復:
goto到內嵌匯編的指定代碼處:procedure TForm1.FormCreate(Sender: TObject);
label
_a;
begin
goto _a;
asm
push MB_OK //此處下斷點1
call MessageBeep
_a:
push MB_ICONEXCLAMATION //此處下斷點2
call MessageBeep
end;
end;
uj5u.com熱心網友回復:
受教了,謝謝分享!

uj5u.com熱心網友回復:
這樣的帖應該推薦起來,同時把灌水回復一律干掉。我先推薦起來,然后建議此版版主清理一下灌水回復。
uj5u.com熱心網友回復:
多謝ccrun大俠!您的大作Spy4Win用得很爽的說!尤其是快捷鍵Ctrl+1和分析IE頁面的功能!
呵呵,我快有點黔驢技窮了,希望各位志同道合之士也發點技巧上來!
uj5u.com熱心網友回復:
樓主好牛的樣子,這些技巧我都不知道,這幾年算是白混了,頂樓主uj5u.com熱心網友回復:
學習力~~~~uj5u.com熱心網友回復:
路過學習~~~~~~~~~~~~uj5u.com熱心網友回復:
這個開發環境
情何以堪啊
uj5u.com熱心網友回復:
不錯不錯 先頂下哈樓主uj5u.com熱心網友回復:
果然門可羅雀
uj5u.com熱心網友回復:
這個挺好玩。uj5u.com熱心網友回復:
支持樓主,頂。uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
父行程與子行程通信:父行程呼叫SetEnvironmentVariable設定行程的環境變數(比如一個視窗A的句柄什么的),然后呼叫CreateProcess(其引數lpEnvironment指定為nil)來啟動子行程。
子行程啟動之后,就可以使用GetEnvironmentVariable來取得環境變數的值(得到句柄,就可以對視窗A發訊息了)。
uj5u.com熱心網友回復:
確實值得懷念!uj5u.com熱心網友回復:
這只能針對視窗句柄。內核物件句柄(HANDLE)還需要多處理一下
uj5u.com熱心網友回復:
D7確實經典,不過我還是慶幸及早轉移到VC了。從VC回望Delphi,還是VC更優秀。uj5u.com熱心網友回復:
在implementation下頭的函式宣告:implementation
{$R *.dfm}
procedure a; forward;//注意關鍵詞forward
procedure TForm1.FormCreate(Sender: TObject);
begin
a//雖然在此之前未實作,但事先已經宣告,所以可以呼叫
end;
procedure a;//實作
begin
ShowMessage('abc')
end;
uj5u.com熱心網友回復:
期待LZ
,跟蹤學習中
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/63115.html
標籤:語言基礎/算法/系統設計
上一篇:RichEdit多字體格式問題
