首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ Builder 開發實戰技巧精選:RichEdit、元件圖示、Access 壓縮、SQL 建表、MP3 播放、資料儲存、視窗置頂、Tab 樣式、Mutex

     編輯:關於C++

1. RichEdit 自動捲動 (像素級)


// 向下捲 1 像素
ScrollWindow(RichEdit1->Handle, 0, -1, NULL, NULL);
// 向上捲 1 像素
ScrollWindow(RichEdit1->Handle, 0, 1, NULL, NULL);

配合 Timer 即可實現類電子書自動捲動效果。

2. 自製元件圖示不顯示?

  1. 用 Image Editor 編輯 .dcr 檔
  2. 圖示名稱必須與元件類別名稱完全相同 (非檔名)
  3. BRCC32.exe 編譯 .dcr → .res
  4. 將 .res 加入 .bpk 專案,重新編譯安裝

3. ADO 壓縮 Access 2000 資料庫 (含密碼)


#include "utilcls.h"

void CompactDatabase(String srcFile, String srcPwd, String dstFile, String dstPwd) {
    String srcConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + srcFile
                   + ";Jet OLEDB:Database Password=" + srcPwd;
    String dstConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dstFile
                   + ";Jet OLEDB:Database Password=" + dstPwd;

    Variant jet = Variant::CreateObject("JRO.JetEngine");
    jet.OleProcedure("CompactDatabase", srcConn, dstConn);
    jet.Clear(); // 釋放 COM
}

void __fastcall TForm1::Button1Click(TObject *Sender) {
    String dir = ExtractFilePath(Application->ExeName);
    String f1 = dir + "yhecdagl1.mdb", p1 = "yhecdagl";
    String f2 = dir + "yhecdagl2.mdb", p2 = "yhecdagl2";
    if (FileExists(f2)) DeleteFile(f2);
    CompactDatabase(f1, p1, f2, p2);
    ShowMessage("Finished");
}

4. SQL 建立 Paradox/DBF 表 (.db)


Query1->Close();
Query1->DatabaseName = "c:\\temp";
Query1->SQL->Text = "CREATE TABLE a.db (field1 VARCHAR(10), field2 VARCHAR(10))";
Query1->ExecSQL();

.db 即資料表檔,SQL DDL 可建立表、欄位、索引等。

5. MediaPlayer 播放 MP3

方法一:修改 win.ini (Win98)


[mci extensions]
mp3=MPEGVideo

方法二:SndPlaySound 記憶體播放


TFileStream fs("song.mp3", fmOpenRead);
char* buf = new char[fs.Size];
fs.Read(buf, fs.Size);
SndPlaySound(buf, SND_MEMORY | SND_ASYNC);
// 播放結束後 delete[] buf

6. RichEdit 內容帶格式存入 Access


TStringStream* pms = new TStringStream("");
TStringList*   sl  = new TStringList();
RichEdit1->Lines->SaveToStream(pms);
pms->Position = 0;
sl->LoadFromStream(pms);
Table1->FieldByName("RichField")->AsString = sl->Text;
delete sl; delete pms;

關鍵:SaveToStream 保留 RTF 格式,AsString 直接寫入 Memo/Blob 欄位。

7. 子視窗永遠置頂


class TForm2 : public TForm {
protected:
    virtual void __fastcall CreateParams(TCreateParams &Params);
};

void __fastcall TForm2::CreateParams(TCreateParams &Params) {
    TForm::CreateParams(Params);
    Params.ExStyle |= WS_EX_TOPMOST;
    Params.WndParent = GetDesktopWindow(); // 關鍵:不掛在 Application
}

8. PageControl / TabControl 自訂分頁標籤顏色


// PageControl OwnerDraw
PageControl1->OwnerDraw = true;

void __fastcall TForm1::PageControl1DrawTab(TCustomTabControl *Control,
    int TabIndex, const TRect &Rect, bool Active) {
    Control->Canvas->Brush->Color = (TabIndex == 0) ? clRed : clGreen;
    Control->Canvas->FillRect(Rect);
    // 繪製文字...
}

9. 建立互斥體避免名稱衝突


HANDLE hMutex = CreateMutex(NULL, FALSE, "MyUniqueAppName_Mutex");
if (GetLastError() == ERROR_ALREADY_EXISTS) {
    // 已有實例在執行
    CloseHandle(hMutex);
    return;
}
// 繼續執行...
// 結束時 CloseHandle(hMutex);

無需列舉系統互斥體,CreateMutex 回傳 ERROR_ALREADY_EXISTS 即可判斷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved