大白鯊經驗集 (轉)

worldblog發表於2007-12-15
大白鯊經驗集 (轉)[@more@]

大家新年好!!學的越來越多,錢/前途無量!!
我的並非是好的,大家既然來到這裡就是志同道合,互相學習。所以也希望您把你的經驗共享出來,
以某某人的經驗集為標題,方便朋友查詢。
我一直認為要成為高手必定要經過四個階段:
:就是熟悉該語言的環境,比如說編譯設定,環境設定,工程,語法,通用使用。
掌握:就是該語言的所有的功能,比如 DLL,RES,OPP(類和模板),訊息,自定元件,內嵌,DCOM,檔案與操作,/SDK,登錄檔,
  VXD/WDM,透過一個小學會的規範化。
熟練:想背英語言6級樣記住個元件的屬性,方法,事件的功能,聯絡,注意事項。工作時不會經常性地翻書。
精通:1給一個普通的任務能實現,2給出一個高難度地,象編出水紋波的。
我現在進入了掌握階段,看來要化很長的時間!!
為了讓更多的朋友看到這帖子,請你告訴我們你現在處於哪個階段

 


用程式取得資訊
  ---- 很 多 軟 件 可 以 判 斷 所 運 行 的 電 腦 類 型 而 自 動 做 不同 的 處 理。 如PhotoShop 5 可 以 探
  測CPU 是 否 有MMX 支 持 而 調 用 不同 的 處 理 函 數,《 金 山 詞 霸》 發 現 有MMX 支 持 會 產 生 半 透 明的
  翻 譯 提 示, 很 多 軟 件 可 以 區 分,Cyrix, 的CPU...

  ---- 現 在, 且 讓 我 細 細 道 來 如 何 讓 你 在 自 己 的 程 序 中 取得CPU 信 息。

  ---- 主 要 可 利 用 CPUID 匯 編 指 令( 機 器 碼:0FH A2H, 如 果 你 的編 譯 器 不 支 持CPUID 指 令,
  只 有 emit 機 器 碼 了) 該 指 令 可 以 被如 下CPU 識 別

  Intel 486 以 上 的CPU,

  Cyrix M1 以 上 的CPU,

  AMD Am486 以 上 的CPU


  (1) 取CPU OEM 字 符 串, 判 斷CPU 廠 商

  先 讓EAX=0, 再 調 用CPUID

  Inel 的CPU 將 返 回:

  EBX:756E6547H 'Genu'

  EDX:49656E69H 'ineI'

  ECX:6C65746EH 'ntel'

  EBX,EDX,ECX 將 連 成"GenuineIntel", 真 正 的Intel。

  Cyrix 的CPU 將 返 回:

  EBX:43797269H

  EDX:78496E73H

  ECX:74656164H

  "CyrixInstead","Cyrix 來 代 替"。

  AMD 的CPU 將 返 回:

  EBX:41757468H

  EDX:656E7469H

  ECX:63414D44H

  "AuthenticAMD", 可 信 的AMD。


  ---- 在98 中, 用 右 鍵 單 擊" 我 的 電 腦", 選 擇" 屬 性- 常規" 在 計 算 機 描 述 處 就 可 看
  見CPU OEM 字 符 串。

  (2)CPU 到 底 是 幾86, 是 否 支 持MMX

  先 讓EAX=1, 再 調 用CPUID

  EAX 的 8 到11 位 就 表 明 是 幾86

  3 - 386

  4 - i486

  5 - Pentium

  6 - Pentium Pro Pentium II

  2 - Dual Processors

  EDX 的 第0 位: 有 無FPU

  EDX 的 第23 位:CPU 是 否 支 持IA MMX, 很 重 要 啊!如 果 你 想 用 那57 條 新 增 的 指 令, 先 檢 查 這
  一 位 吧, 否 則 就等 著 看Windows 的" 該 程 序 執 行 了 非 法 指 令, 將 被 關 閉" 吧。

  (3) 專 門 檢 測 是 否P6 架 構

  先 讓EAX=1, 再 調 用CPUID

  如 果AL=1, 就 是Pentium Pro 或Pentium II

  (4) 專 門 檢 測AMD 的CPU 信 息

  先 讓EAX=80000001H, 再 調 用CPUID

  如 果EAX=51H, 是AMD K5

  如 果EAX=66H, 是K6

  EDX 第0 位: 是 否 有FPU

  EDX 第23 位,CPU 是 否 支 持MMX,

  程 序 如 下: 是C++Builder 的 控 制 臺 程 序, 可 以 給 出 你 的" 心" 的 信 息。 如 果 把 這 個 技 術 用 於
  DLL 中, 便 可 以 使程 序 也 知道" 心" 的 信 息。

  Instruction Demo Program------------
  #include < conio.h >
  #include < iostream.h >
  #pragma hdrstop
 

  #pragma inline
  #pragma argsused

  int main(int argc, char **argv)
  {
  char OEMString[13];
  int iEAXValue,iEBXValue,iECXValue,iEDXValue;

  _asm {
  mov eax,0
  cpuid
  mov D PTR OEMString,ebx
  mov DWORD PTR OEMString+4,edx
  mov DWORD PTR OEMString+8,ecx
  mov BYTE PTR OEMString+12,0
  }

  cout< < "This CPU 's OEM String is:"< < OEMString< < endl;

  _asm {
  mov eax,1
  cpuid
  mov iEAXValue,eax
  mov iEBXValue,ebx
  mov iECXValue,ecx
  mov iEDXValue,edx
  }

  if(iEDXValue&0x800000)
  cout < < "This is MMX CPU"< < endl;
  else
  cout < < "None MMX Support."< < endl;

  int iCPUFamily=(0xf00 & iEAXValue) > >8;

  cout < < "CPU Family is:"< < iCPUFamily< < endl;

  _asm{
  mov eax,2
  CPUID
  }

  if(_AL==1)
  cout < < "Pentium Pro or Pentium II Found";

  getch();

  return 0;

  }
  ShowMessage("Could not MakeCurrent");

請問如何用ENTER鍵進行焦點轉移,?

 1  在Windows 環 境 下, 要 使 一 個 控 件 取 得 焦 點, 可 在 該 控 件 上 用 鼠 標 單 擊 一 下,
  或 按Tab 鍵 將 焦 點 移 至 該 控 件 上。 這 種 控 制 焦 點 切 換 的 方 法 有 時 不 符 合 用 戶
  的 習 慣。 就 圖 一 而 言, 用 戶 就 希 望 用Enter 鍵, 控 制 焦 點 由Edit1 切 換 到Edit2。
 要 實 現 這 樣 的 功 能 需 借 助WinAPI 函 數SendMessage 來 完 成。 方 法 是:
 先 設Form1 的KeyPreview 屬 性 為true, 然 後 在Form1 的OnKeyPress 事 件 中 加 入 如 下 的 代 碼。
 這 樣, 用 戶 就 可 以 通 過 按Enter, 鍵 控 制 焦 點 按 定 義 好 的Taborder 順 序 來 移 動 了 !
 void __fastcall TForm1::
   FormKeyPress(T *Sender, char &Key)
   {
   if(Key==VK_RETURN)
   {
    SendMessage(this- >Handle,WM_NEXTDLGCTL,0,0);
  Key=0;
   }
 }

   2  在edit1的OnKeyPress(event)中加入
  if(Key==VK_RETURN)Edit3->SetFocus();

螞蟻的視窗消失??
 Timer->Intrval=10;
 void __fastcall TForm1::Timer1Timer(TObject *Sender)
 {
 Form1->Width-=20;
 Form1->Height-=20;
 if(Form1->Width==108&&Form1->Height==27)
  {Form1->Close ();}
 Form1->Top+=10;
 Form1->Left+=10;}


(2)TDateTime  t1;
Form1->Caption="今天是:"+DateToStr(Date())+"現在時間是:"+TimeToStr(Time());
(3) AnsiString S;
  S = "";
  if (Directory("Select Directory", "", S))
  SetPath(S);
(4) AnsiString S;
  InputQuery("標題","提示",s);

視窗背景
 public:
 Graphics::TBitmap *bitmap;

 void __fastcall TForm1::FormCreate(TObject *Sender)
 {
 bitmap=new Graphics::TBitmap;
 bitmap->LoadFromFile("Arc.bmp");
 }

 void __fastcall TForm1::FormPaint(TObject *Sender)
 {
 int x,y;
 y=0;
 while(y {x=0;
   while(x   {Canvas->Draw (x,y,bitmap);
   x=x+bitmap->Width ;
   }
   y=y+bitmap->Height ;
   } 
 }

 

如何把JPG檔案轉成BMP檔案???
 先用TImage Image1->Picture->LoadFromFile(你的Jpeg檔案)
 然後
 Graphics::TBitmap*tmp=new Graphics::TBitmap();
 tmp->Assign(Image1->Picture->Graphic);
 tmp->SaveToFile(FileName);


檔案讀取寫入
 int i=0;
 char sn[]="123";
  if(!FileExists("aaa.txt"))
  {
  i=FileCreate("aaa.txt");
  FileWrite(i,sn,strlen(sn));
  FileClose(i); ShowMessage("ok");}

 {char buf[3];
    AnsiString str;
   int i;
   i=FileOpen("d:aaa.txt",fmOpenReadWrite);
  FileRead(i,buf,3);
  FileClose(i);
 if(Edit1->Text==AnsiString(buf,3))
   {ShowMessage("ok'");}


按鍵發聲
 #include
 AnsiString SoundFile="d:ding.wav";
 sndPlaySound(SoundFile.c_str() ,SND_ASYNC);

怎麼來使休眠
 SetSystemPowerState(true,true); 
 其中的第一個引數指定是休眠還是掛起(true :前者;false:後者)
 第二個引數指定是否強制。

如 何 將 浮 點 數 轉 成AnsiString同 時 控 制 其 只 保 留 兩 位 小 數
 
 FLOAT aa=9032.569;
 AnsiString bb=FormatFloat("0.00",aa); 

能否從AnsiString a="FF";把a轉成10進位制?
 這樣更簡單: 前面補上16進位制標誌0x再轉換,
 AnsiString  s="FF";
 s="0x"+s;
 int x=s.ToInt();


如何獲取螢幕的解析度?
 自動定義了一個全域性變數Screen,
 可在程式任何地方用Screen->Height,Screen->Width獲得當前螢幕解析度。

誰知道動態陣列怎樣用
 動態陣列必須在程式執行期間動態改變大小。
 用malloc():為指標分配空間和realloc():動態調整指標分配空間
 配合實現。注意要包含stdlib.h。示例如下:
 #include
 #include
 #include
 int main(void)
 {
 char *str;
 str = (char *) malloc(10);
 strcpy(str, "Hello");
 printf("String is %sn  Address is %pn", str, str);
 str = (char *) realloc(str, 20);
 printf("String is %sn  New address is %pn", str, str);
 free(str);
 return 0; }

 

怎樣顯示隨機數?
 Timer->Interval = 150, 效果不錯
 void __fastcall TForm1::Timer1Timer(TObject *Sender)
 { Label1->Caption = ran(100);}

 void __fastcall TForm1::Button1Click(TObject *Sender)
 {Timer1->Enabled = ! Timer1->Enabled; }
 不要用執行緒了, Timer佔用很小, 不影響程式的響應。
 如果要過一段時間停下來:(比如是 1分鐘 = 60 秒 =60000ms = 400次*150ms/次
 int TimeOut = 400;
 >Interval = 150, 效果不錯
 void __fastcall TForm1::Timer1Timer(TObject *Sender)
 {
   Label1->Caption = random(100);
   if(--Timeout==0)
  Timer1->Enabled = ! Timer1->Enabled; 
 }
 Timer的最小解析度是55ms也就是18.2次一秒,和8253/8254的頻率一樣。
 最小間隔可以達到1ms
 使用的windows每隔20ms就要重新確認一次執行緒。


TQuery的引數設定
  一、TQuery的引數設定
  1. 在屬性中:Select * from  表名 where  欄位名=:變數名
  跟在“ : ”後面的是變數。這樣寫後,在引數屬性中就可以修改該變數的數
  據型別等。
  2. 對變數的賦值:
  Query1->Active=false;
  Query1->Params->Items[0]->AsString=Edit1->Text;
  Query1->Active=true;//查詢符合變數的記錄
  3. 用Grid顯示結果
  DBGrid的Data與DataSource1連線,而DataSource1的DataSet與Tquery1
  連線。
  二、嵌入SQL語言
  透過Query控制元件嵌入SQL語句建立的查詢比Table更簡單、更高效。
    用一個簡單的程式碼來說明如何建立查詢程式:
    例如,要建立一個檢索表1中書名為book1的程式則在表單上放置
  DBGrid,DataSource,Query三個控制元件加入以下程式碼:
    DBGrid1-〉DataSource=DataSource1;
    DataSource1-〉DataSet=Tqery1;
    Query1-〉Close();
    Query1-〉SQL-〉Clear();
    Query1-〉SQL-〉Add(″Select * From 表 Where (書名=′book1′ ″);
    Query1-〉ExecSQL();
    Query-〉Active=true;
    你就可以在生成的表格中看到所有名稱為book1的記錄。

視窗漸變背景色
 
 TColor StartColor,EndColor;//全域性變數
 得開始顏色
 if(ColorDialog1->Execute ())
  StartColor=ColorDialog1->Color;
 得結束顏色
  if(ColorDialog1->Execute())
  EndColor=ColorDialog1->Color;
 float pwidth;
 int redstart,greenstart,bluestart,redend,greenend,blueend;
 float redinc,greeninc,blueinc;
 pwidth=float(PaintBox1->Width);
 過Get(X)Value函式來獲得開始的顏色的紅,藍,綠
 redstart=GetRValue(StartColor);
 greenstart=GetGValue(StartColor);
 bluestart=GetBValue(StartColor);
 過Get(X)Value函式來獲得結束的顏色的紅,藍,綠
 redend=GetRValue(EndColor);
 greenend=GetGValue(EndColor);
 blueend=GetBValue(EndColor);
 置顏色變化率
 redinc=(redend-redstart)/pwidth;
 greeninc=(greenend-greenstart)/pwidth;
 blueinc=(blueend-bluestart)/pwidth;
 
 for(int i=0;iWidth;i++)
  { 義畫筆顏色
  PaintBox1->Canvas->Pen->Color=TColor(RGB(redstart+int(redinc*i),greenstart+int(greeninc*i),bluestart+int(blueinc*i)));
  動畫筆到
    PaintBox1->Canvas->MoveTo(i,0);
  PanitBox1的上向下畫
  PaintBox1->Canvas->Lo(i,PaintBox1->Height);


如何分別對DBGrid和SrtingGRid的行換背景色?
 TForm1::DBGrid1DrawColumnCell(  ) 
 if(Column->Field->DataSet->RecNo%2)
 {
  DBGrid1->Canvas->Brush->Color=clYellow;
  DBGrid1->Canvas->FillRect(Rect);
  }
 DrawText(DBGrid1->Canvas->Handle, Column->Field->Text.c_str(),-1,(RECT*)&Rect,DT_SINGLELINE | DT_VCENTER |DT_CENTER);
如何分別對DBGrid和SrtingGRid的列動態換背景色?
 Query1->Close();
 Query1->SQL->Clear();
 Query1->SQL->Add(Memo1->Text);
 Query1->Open();
 for(int i=0;iColumns->Count;i++)
 { if(i%2==0)DBGrid1->Columns->Items[i]->Color=clAqua;
   else DBGrid1->Columns->Items[i]->Color=clInfoBk;
 }

怎樣得到當前的月份是多少啊

 TDateTime time=Now();
 AnsiString Time=time.FormatString("yyyy-mm-dd");
 AnsiString month=Time.SubString(6,2);
 Label1->Caption=month;
 AnsiString sMonth;
 sMonth=Now().FormatString("mm");//取出當前月分
 Label2->Caption=sMonth;


窗體標題閃爍
 Timer()
 {FlashWindow(Form1->Handle,TRUE):}


像星際爭霸開頭由大到小的字幕特效
 在窗體中加入一個Timer(定時器),標籤(Label)
 Label1->AutoSize=true
 Label1->Caption=歪歪的VB教程"
 Label1->Font->Name = "宋體"
 Label1->Font->Size = 150
 Label1->Fore->Color = vbGreen
 Label1->Visible = true
 Time1->Interval = 1
 Time1Enabled = true
 void __fastcall TForm1::Timer1Timer(TObject *Sender)
 {
 if(Label1->Font->Size >=2)
 {Label1->Font->Size =Label1->Font->Size-2;
 Label1->Left = (Form1->Width-Form1->Width)/2;
 Label1->Top = (Form1->Height -Label1->Height) / 2 ;}
 else{
 Label1->Visible = false;
 Timer1->Enabled = false;
 }
 }


CPUID
 GetCPUID(void)
 {
 asm
 {
   PUSH  EBX  Save affected register}
  PUSH  EDI
   MOV  EDI,EAX  Resukt}
   MOV  EAX,1
  DW  0xa20f  CPUID Command}
   STOSD  CPUID[1]} 名稱
   MOV  EAX,EBX
   STOSD  CPUID[2]}//無用
   MOV  EAX,ECX
   STOSD  CPUID[3]}//無用
   MOV  EAX,EDX
   STOSD  CPUID[4]}//cpu編號
   POP  EDI  Restore registers}
   POP  EBX
 }
 }
 

 void __fastcall TForm1::Button1Click(TObject *Sender)
 {
   Label1->Caption=(AnsiString)GetCPUID();
 }


自動呼叫或程式
 Windows 提供了Execute函式,用來呼叫外部程式或與某程式關聯的檔案。

 其原型如下:

 HINSTANCE ShellExecute(

 

  HWND hwnd,  // handle to parent window

  LPCTSTR lpOperation,  // pointer to string that specifies operation to perform

  LPCTSTR lpFile,  // pointer to filename or folder name string

  LPCTSTR lpParameters,  // pointer to string that specifies executable-file parameters

  LPCTSTR lpDirectory,  // pointer to string that specifies default directory

  INT nShowCmd  // whether file is shown when opened

  );

 如若要自動瀏覽器程式訪問我的主頁,程式程式碼如下:

 ShellExecute(Handle,NULL,"",NULL,NULL,SW_SHOWNORMAL);

 若要啟動系統預設郵件程式,給我寫信,程式程式碼如下:

 ShellExecute(to:Handle,NULL,"mailto:lmq@4y.com.cn",NULL,NULL,SW_SHOWNORMAL'>Handle,NULL,"mailto:lmq@4y.com.cn",NULL,NULL,SW_SHOWNORMAL);

BCB中的獲取印表機函式是Printer();
 其返回值是一個TPrinter,你可以查詢TPrinter物件的幫助。
 你需要新增引用的標頭檔案是#include
 其中Printer()->Printers->Count是印表機的數目
 Printer()->Printers->Strings[]是列舉印表機的名稱
 Printer()->BeginDoc()開始列印準備
 Printer()->EndDoc()結束列印準備,開始真正列印
 Printer()->AbortDoc()終止列印準備。
 在BeginDoc()和EndDoc()之間可以使用Printer()->Canvas來畫列印頁
 畫完一頁後就可以用Printer()->NewPage()開始新的一頁
 此外Printer()->Handle是一個HDC,使用GetDeviceCaps(Printer()->Handle, ...)
 可以得到當前印表機的解析度等等很多屬性,而不需要BeginDoc()
 (如果使用Printer()->Canvas->Handle則需要BeginDoc()才能得到準確資訊)


獲取螢幕的顏色
 void __fastcall TForm1::Button1Click(TObject *Sender)
 {int BitsPerPixel  = GetDeviceCaps(Canvas->Handle,BITSPIXEL);
 int Planes = GetDeviceCaps(Canvas->Handle,PLANES);
 BitsPerPixel *= Planes;
 bool UsesPalettes =
   (bool)(GetDeviceCaps(Canvas->Handle, RASTERCAPS) & RC_PALETTE);
 if(UsesPalettes)
  Label1->Caption = "螢幕使用餓調色盤";
 else
   Label1->Caption = "螢幕沒有使用調色盤";

 switch (BitsPerPixel)
 { case 32:
    Label2->Caption ="32-位 真彩";
   case 24:
    Label2->Caption = "24-位 真彩";
    break;
  case 16:
    Label2->Caption = "16-位 高 彩";
   break;
   case 8:
   Label2->Caption = "256 色 ";
   break;
   case 4:
   Label2->Caption = "16 色模式";
   break;
  case 1:
   Label2->Caption = "單色模式";
   break;
   default:
   Label2->Caption = "螢幕支援 " + IntToStr(1<< BitsPerPixel) +" 不同色";
    break;
 }
 

使用自己的函式庫:
  new->cpp int jia(int a,int b){return (a+b);} save to File1.cpp
  at unit.cpp #include "File1.cpp"
  int c=jia(a,b);

如何使Statar上的文字滾動起來??
 如下操作可使StatusBar中的字串向左運動
 StatusBar1->SimpleText=StatusBar1->SimpleText.SubString(2,StatusBar1->SimpleText.Length()-1)+StatusBar1->SimpleText.SubString(1,1);
 
 設計時定
 simplePanel=true;
 SimpleText=love you
 SizeGrip=false;

在TStringGrid控制元件中怎麼顯示double型數?
 double aaa = 1.1;
 AnsiString str = FloatToStr(aaa);
 StringGrid1->Cells[1][2]=str;
 StringGrid1->Cells[1][1]= FormatFloat("0.00000",3.1415926);

Table1查詢
 Table1->Filtered=false;
 Table1->Filter=Edit1->Text;
 Table1->Filtered=true;
 Edit1->Text=內容是:欄位是字元 name='zzz' and age>18 and sex!='男'
 FilterOption<

輸入員只能修改自己輸入的表的內容(好比是輸入本月工資可以修改輸入的錯誤確不可修改上月的工資)
 建立臨時表createbuttonclike()
 { if(!Table1->Exists){
   Table1->Active=false;
   Table1->DatabaseName="MSACCESS1";//建立一樣的表結構
   Table1->TableType=ttDefault;
   Table1->TableName="SCadd";
   Table1->FieldDefs->Clear();
   Table1->FieldDefs->Add("Sno",ftInteger,0,false);//欄位名,型別,小數位或長度,是否唯一
   Table1->FieldDefs->Add("Cno",ftInteger,0,false);
   Table1->FieldDefs->Add("Grade",ftInteger,0,false);
   Table1->CreateTable();}
   Table1->Active=true;}
ExitButtonClik()
{ Table2->BatchMove(Table1,batAppend);
batUpdate//用原表的記錄目標表的記錄;
batAppendUpdate//把原表不存在於目標表的記錄新增到目標表的末尾
batDelete//刪除原表在目標表中重複的記錄
batCopy//把原表複製到目標表
  Table1->Active=false;
  Table1->DatabaseName="MSACCESS1";
  Table1->TableType=ttDefault;
  Table1->TableName="SCadd";
  Table1->DeleteTable();
}

 


一、用C++Builder設計自己的瀏覽器

C++Builder5提供了一個瀏覽器控制元件CppBrowser,它位於internet控制元件欄,其的主要方法有:

Navigate函式,用於瀏覽給定的url的資源

GoBack(),瀏覽上一頁

GoForward(),瀏覽下一頁

Stop(),停止瀏覽

Refresh(),重新整理當前頁面

新建一應用程式,將工程名儲存為myie,設定Form1的Name為Main_Form,在Main_Form上加入一CppWebBrowser控制元件和一個ToolBar控制元件,
在此ToolBar控制元件放入一ComBox框,並加上五個ToolButton,設定其Name屬性分別為“CppWebBrowser1”,“ToolBar1”,“ CB_URL”,
“ TB_Prior,TB_Forward,TB_Stop,TB_Fresh,TB_Navigate”。

TB_Navigate的OnClick事件程式碼如下:

void __fastcall TMain_Form::NavigateExecute(TObject *Sender)

{

  CppWebBrowser1->Navigate((WString)CB_URL->Text, TNoParam(), TNoParam(), TNoParam(), TNoParam());

}

ComBox1的OnKeyPress事件程式碼如下:

void __fastcall TMain_Form::CB_URLKeyPress(TObject *Sender, char &Key)

{

  if(Key==13)  按下的鍵為Enter鍵

  NavigateExecute(Sender);

} 

其餘的程式碼類似…

編譯執行,一個具有基本瀏覽功能的瀏覽器就生成了。

 

2、獲得html檔案的原始檔

我們在用IE瀏覽主頁時,若點選右鍵,選擇“檢視原始檔”,系統會自動啟動記事本顯示此html的原始檔。在程式設計時,
有時需分析html檔案的原始檔,用C++ Builder的 NMHTTP控制元件可以輕鬆解決這個問題。

新建 一工程,從FastNet控制元件欄拖一NMHTTP控制元件到窗體上,再拖一Memo控制元件到窗體,假設要獲得本人主頁()的原始檔,
在Form1的OnCreate事件鍵入程式碼:

void __fastcall TForm1::FormCreate(TObject *Sender)

{

  Memo1->Clear();  空Memo1

  NMHTTP1->Get(""); 

  Memo1->Text = NMHTTP1->Body;

}

編譯執行程式,Memo1框中立即顯示本人主頁的原始檔.

另外,NMHTTP控制元件還支援,其屬性Proxy和Port分別指代理的和埠號。

 

三、自動呼叫瀏覽器或郵件程式

Windows 提供了ShellExecute函式,用來呼叫外部程式或與某程式關聯的檔案。

其原型如下:

HINSTANCE ShellExecute(

 

  HWND hwnd,  // handle to parent window

  LPCTSTR lpOperation,  // pointer to string that specifies operation to perform

  LPCTSTR lpFile,  // pointer to filename or folder name string

  LPCTSTR lpParameters,  // pointer to string that specifies executable-file parameters

  LPCTSTR lpDirectory,  // pointer to string that specifies default directory

  INT nShowCmd  // whether file is shown when opened

  );

如若要自動瀏覽器程式訪問我的主頁,程式程式碼如下:

ShellExecute(Handle,NULL,"",NULL,NULL,SW_SHOWNORMAL);

若要啟動系統預設郵件程式,給我寫信,程式程式碼如下:

ShellExecute();

 

以上程式在Pwin98+BCB5下執行透過。

 

BCB下如何改變CppWebBrowser的Html內容

void __fastcall TForm1::SetHtml( TCppWebBrowser *WebBrowser,AnsiString Html )
{
  IStream *Stream;
  HGLOBAL hHTMLText;
  IPersistStreamInit *psi;

  if( WebBrowser->Document == NULL )
  return;
  hHTMLText = GlobalAlloc( GPTR, Html.Length() + 1 );
  if( 0 == hHTMLText ) {
  ShowMessage( "GlobalAlloc Error" );
  return;
  }

  CopyMemory( hHTMLText, Html.c_str(), Html.Length() );

  OleCheck( CreateStreamOnHGlobal( hHTMLText, true, &Stream ) );

  try {
  OleCheck( WebBrowser->Document->QueryInterface( __uuidof(IPersistStreamInit), (void **)&psi ) );
  try {
  OleCheck( psi->InitNew() );
  OleCheck( psi->Load(Stream) );
  } catch( ... ) {
  delete psi;
  }
  } catch( ... ) {
  delete Stream;
  }
  delete psi;
  delete Stream;
}


cpu使用情況

#ifndef fmTestH
#define fmTestH

#include
#include
#include
#include
#include

class TTestFo: public TForm
{
__published: // IDE-managed Components
  TLabel *LbAldynUrl;
  TMemo *MInfo;
  TTimer *Timer;
  void __fastcall LbAldynUrlClick(TObject *Sender);
  void __fastcall FormCreate(TObject *Sender);
  void __fastcall TimerTimer(TObject *Sender);
private: // User declarations
public: // User declarations
  __fastcall TTestForm(TComponent* Owner);
};

extern PACKAGE TTestForm *TestForm;

#endif


#include
#pragma hdrstop

#include "fmTest.h"
#include "adCpuUsage.hpp"

#pragma package(smart_init)
#pragma resource "*.dfm"
TTestForm *TestForm;

__fastcall TTestForm::TTestForm(TComponent* Owner)
  : TForm(Owner)
{
}

void __fastcall TTestForm::LbAldynUrlClick(TObject *Sender)
{
  ShellExecute(Application->Handle, "open", ",
  NULL, NULL, SW_SHOWDEFAULT);
}

void __fastcall TTestForm::FormCreate(TObject *Sender)
{
  int i;

  MInfo->Lines->Clear();

  MInfo->Lines->Add(Format("There are %d total CPU in your system",ARRAYOFCONST((GetCPUCount()))));

  for (i=0;  i < GetCPUCount(); i++) MInfo->Lines->Add("");
}

void __fastcall TTestForm::TimerTimer(TObject *Sender)
{
  int i;

  CollectCPUData();

  MInfo->Lines->BeginUpdate();

  for(i=0; i < GetCPUCount(); i++)
  MInfo->Lines->Strings[i+1] = Format("CPU #%d - %5.2f%%",ARRAYOFCONST((i,GetCPUUsage(i)*100)));

  MInfo->Lines->EndUpdate();


如何儲存程執行資訊到ini檔案

  現在許多把程式中需要的資料儲存在登錄檔中,這樣當裝的軟體越來越多時,致使登錄檔越來越龐大,容易使系統出錯。
  當然,也建議在登錄檔中儲存資料,但當我們需要儲存的資料不多時完全可以把資料儲存在WIN.INI中,這樣可以很方便地維護,
  實現方法相對來說比較簡單。下面我以Borland C++ Builder為例來說說如何實現。
  原理其實很簡單,只需呼叫API的 WriteProfileString和GetProfileInt函式就可以了。這兩個函式的原型是:
  BOOL WriteProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString );
  UINT GetProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault);
  其中lpAppName指在WIN.INI中段的名字,即用[]括起來的字串,lpKeyName指在這個段中每一個專案的名字,lpString指這個專案的值,
  即“=”後的數, nDefault為當GetProfileInt沒有找到lpAppName和lpKeyName時返回的值,即預設值,前者返回為布林值(true 或 false),
  後者返回為無符號整形值。當在WriteProfileString函式中 lpKeyName 為空(NULL)時,則清除這個段的全部內容,lpString 為空時,
  則清除這一專案的內容,即這一行將清除掉。
  下面舉一例子來說明這兩個函式的用法。新建一個應用程式,在Form1上放兩個Edit和三個Button,其中Edit的Text為空,
  三個Button的Caption分別為“新增”、“檢視”、“清除”。雙擊“新增”按鈕加入下面程式碼:
  WriteProfileString(“例子程式”,“專案”,Edit1→Text.c_str());
  雙擊“檢視”按鈕加入如下程式碼:
  unsigned int Temp;
  Temp=GetProfileInt(“例子程式”,“專案”,100);
  Edit2→Text=IntToStr(Temp);
  雙擊“清除”按鈕加入如下程式碼:
  WriteProfileString(“例子程式”,NULL,NULL);
  然後按F9鍵執行程式。
  下來可以檢驗一下程式的正確性。在Edit1中輸入數字,如“3265”,按“新增”按鈕,這時執行“sysedit”來檢視
  “WIN.INI”檔案的最後面,可以看到加入瞭如下內容:
  [例子程式]
  專案=3265
  其中“[]”和“=”是函式自動加上的。按下“檢視”按鈕,在Edit2中出現“3265”,當按下“清除”按鈕可清除新增的部分。
  經過檢視可知程式已達到預期的目的。
  喜愛程式設計的朋友可以把上述方法應用到自己的程式中去,來達到儲存資料資訊的作用。當確實要把資訊儲存到登錄檔中,
  可以在C++ Builder中定義一個TRegistry類的物件來進行相關的操作,或者直接呼叫Windows的API函式.


取得本地internet機器的名字及IP地址取得本地internet機器的名字及IP地址

一、下面的例子使用 Winsock API 取得本地主機的名字及地址
  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
  hostent *p;
  char s[128];
  char *p2;
 
  the computer name
  gethostname(s, 128);
  p = gethostbyname(s);
  Memo1->Lines->Add(p->h_name);
  the IpAddress
  p2 =_ntoa(*((in_addr *)p->h_addr));
  Memo1->Lines->Add(p2);
  }
  void __fastcall TForm1::FormCreate(TObject *Sender)
  {
  WORD wVersionRequested;
  WSADATA wsaData;
  up WinSock
  wVersionRequested = MAKEWORD(1, 1);
  Wtartup(wVersionRequested, &wsaData);
  }
  void __fastcall TForm1::FormDestroy(TObject *Sender)
  {
  WSACleanup();
  }
 


修改顯示方式的:

 

 #ifndef Unit1H
 #define Unit1H
 
 #include
 #include
 #include
 #include
 #include "MyEdit.h"
 #include
 #include
 #include
 #include
 
 class TForm1 : public TForm
 {
 __published:  // IDE-managed Components
   TPanel *Panel1;
   TButton *Button1;
   TLabel *Label1;
   TButton *Button2;
   TListBox *ListBox1;
   TButton *Button3;
   void __fastcall Button1Click(TObject *Sender);
   void __fastcall Button2Click(TObject *Sender);
   void __fastcall Button3Click(TObject *Sender);
 private:  // User declarations
 public:  // User declarations
   __fastcall TForm1(TComponent* Owner);
   DEVMODE table[400];
   bool Listed;
 };
 
 extern PACKAGE TForm1 *Form1;
 
 #endif

 ////unit.cpp
 

 #include
 #include
 #pragma hdrstop

 #include "Unit1.h"
 
 #pragma package(smart_init)
 #pragma link "MyEdit"
 #pragma resource "*.dfm"
 TForm1 *Form1;
 
 __fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
Listed=false;
Button2->Enabled=false;
Button3->Enabled=false;

}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD index=0;
bool flag;
do{
flag=EnumDisplaySettings(NULL,index,& table[index]);
if(flag)
{
  if( table[index].dmPelsWidth<640) ;
  else if  (table[index].dmBitsPerPel<8) ;
  else if (table[index].dmDisplayFrequency>85);
  else if( table[index].dmPelsWidth>1024) ;
  else
  {
  AnsiString st;
  st=index;
  st+="  ";
  st+=table[index].dmPelsWidth;
  st+="  X  ";
  st+=table[index].dmPelsHeight;
  st+="  X  ";
  st+=table[index].dmBitsPerPel;
  st+="  X  ";
  st+=table[index].dmDisplayFrequency;
  ListBox1->Items->Add(st);
  }
}
index++;
}while(flag & index<300);

AnsiString t;
t.sprintf(" %d Modes Found",index);
Label1->Caption=t;
Listed=true;
Button2->Enabled=true;
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{

int i;
if(!Listed)
{
Label1->Caption="List display modes first.";
return;
}

for(i=0;iItems->Count;i++)
{
if(ListBox1->Selected[i])
{
  int x;
  String st,st1;
  st=ListBox1->Items->Strings[i];
  x=st.Pos(" ");
  st1=st.SubString(1,x-1);
  x=st1.ToInt();
  Label1->Caption=x;
  ChangeDisplaySettings(&table[x],0);
  break;
  }
}
if(i==ListBox1->Items->Count)
Label1->Caption="Select a modes first.";
Button3->Enabled=true;
int r=MessageBox(0,"can you see anything?","display",MB_OKCANCEL);
if(r==IDCANCEL)
  Button3Click(Sender);
else
Button3->SetFocus();
}

void __fastcall TForm1::Button3Click(TObject *Sender)
{
ChangeDisplaySettings(NULL,0);
Button3->Enabled=false;
}

怎樣實現將Memo的文字資訊列印出來

 TPrinter * pPrinter=Printer();
 pPrinter->Title="列印Memo1中的資料";
 pPrinter->BeginDoc();
 int y=10;
 for(int i=0;iLines->Count;i++)
 {
   pPrinter->Canvas->TextOut(10,y,Memo1->Lines->Strings[i]);
   y+=pPrinter->Canvas->TextHeight("A");
 }
 pPrinter->EndDoc(); 

 

 

 

 

 

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993631/,如需轉載,請註明出處,否則將追究法律責任。

相關文章