C++Builder代码片断

本文中包含了一些常用的代码片断,看看想想或许有他山之石可以攻玉的可能。

删除别名中所有的表、纯虚函数、虚函数、启动页面、指针、为指针解除引用、表的For循环
变量与常量的声明、检查表是否存在、组件的类名、剪贴板中的文字、字符流、检查表是否已打开
表的状态操作、改变PageControl的标签、向Query传递参数 日期属性 绘制状态条

删除别名中所有的表
void TData::CleanTemp()
{
  TStringList *myTables = new TStringList();
  TTable *Table = new TTable(this);
  try
  {
    Session->GetTableNames("Temp", "", True, False, myTables);
  }
  catch (...) {}
  // AnsiString str = myTables->GetText();
  // ShowMessage(str);
  for(int count=0; count < myTables->Count; count++)
  {
    Table->DatabaseName = "Temp";
    Table->TableName = myTables->Strings[count];
    Table->Close();
    Table->DeleteTable();
  }
  delete myTables;
  delete Table;
}

纯虚函数
//纯虚函数只在基类中出现,而在子类中必须有
//与其匹配的成员函数。程序中申明的子类的实例
//必须为基类中的每一个纯虚函数提供一个重载的成员函数。
class TBaseClass
{
  public:
  virtual void Display() = 0;
};
class TDerivedClass : public TBaseClass
{
  public:
  void Display() { ShowMessage("From Derived"); }
};
 
class TSecondDerivedClass : public TDerivedClass
{
  public:
  void Display() { ShowMessage("From Second Derived"); }
};
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TDerivedClass dc; dc.Display();// "From Derived"
  TSecondDerivedClass sc; TBaseClass* bc = &sc;
  bc->Display(); // "From Second Derived"
}

虚函数
//虚函数作为其他类的父类的成员函数。
//如果继承子类成员函数中存在与父类成员函数完全相同的函数,
//子类中的成员函数永远有效。
class Base
{
public:
  virtual void Display() { ShowMessage("Base Class"); }
};
 
class DerivedOne : public Base
{
  public:
  void Display() { ShowMessage("DerivedOne"); }
};
 
class DerivedTwo : public Base
{
  public:
  void Display() { ShowMessage("DerivedTwo"); }
};
 
Base* pBases[10];
int count = 0;
DerivedOne aDerOne;
DerivedTwo aDerTwo;
pBases[count++] = &aDerOne;
pBases[count++] = &aDerTwo;
for( int i=0; i < count; i++ )
pBases[i]->Display();


启动页面
USEDATAMODULE("Datamod.cpp", DataModule);
USEFORM("about.cpp", AboutBox);
USEFORM("main.cpp", MainForm);
USEFORM("splash.cpp", SplashForm);
//---------------------------------------------------------------------------
#include "splash.h"
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  try
  {
    SplashForm = new TSplashForm(Application);
    SplashForm->Show();
    SplashForm->Update();
    Application->Initialize();
    Application->Title = "Example of Loading Splash Form";
    Application->HelpFile = "SplashHelp.hlp";
    Application->CreateForm(__classid(TMainForm), &MainForm);
    Application->CreateForm(__classid(TDataModule), &DataModule);
    Application->CreateForm(__classid(TAboutBox), &AboutBox);
    SplashForm->Hide();
    SplashForm->Close();
    Application->Run();
  }
  catch (Exception &exception)
  {
    Application->ShowException(&exception);
  }
  return 0;
}


指针
int array[] = { 2, 4, 6, 8, 10}
int myInteger = array[3]; // 值为 8
 
// ----使用指针可以实现同样的功能 -----
int array[] = { 2, 4, 6, 8, 10}
int* myPtr = array;
int myInteger = myPtr[3]; // 值为8


为指针解除引用
int x = 32;
int* ptr = &x;
//解除指针的引用
//以获得内存位置的内容
int y = *ptr; // y = 32


表的For循环
void TDataModuleEmployee::ListNames( TStrings *Items )
{
  try
  {
    for ( TableAll->First(); !TableAll->Eof; TableAll->Next() )
    if ( TableAll->FieldByName("Deleted")->AsBoolean == false )
    Items->AddObject( TableAll->FieldByName("Name")->AsString, (TObject *)TableAll->FieldByName("Refnum")->AsInteger );
  }
  catch (Exception &e)
  {
    Application->ShowException(&e);
  };
}


变量与常量的声明
char ch;
int count = 1;
char* name = "csdn.net";
struct complex { float my, his;};
float real(complex* p) {return p->my};
const double pi = 3.1415926535897932385;
templetate abc(T a) { return a < 0 ? -a : a; };
enum WebSite { one, two, three, four};
int* a; // * 指针
char* p[20]; // [ ] 数组
void myFunction(int); // ( )函数
struct str { short length; char* p; };
char ch1 = 'a';
char* p = &ch1; // &引用 ,p保持着ch1的地址
char ch2 = *p; // ch2 = 'a'


检查表是否存在
#include "io.h"
if (access(Table1->TableName.c_str(),0)) //检查表是否存在
{ // 若不存在就创建 ...
  Table1->Active = false;
  Table1->TableType = ttParadox;
// 本文转自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=275&d=53h7o6
  Table1->FieldDefs->Clear();
  Table1->FieldDefs->Add("Myfield", ftString, 15, false);
  Table1->IndexDefs->Clear();
  Table1->CreateTable();
  Table1->Active = true;
}
else
  Table1->Active = true;


组件的类名
//找出丢失的组件类名
for(int i=0; i < ComponentCount; i++)
{
  if(String(dynamic_cast<TComponent&>(*Components[i]).Name) == "")
  {
    ShowMessage(Components[i]->ClassName());
  }
}


剪贴板中的文字
#include "memory.h" // 包含 auto_ptr<>
#include "clipbrd.hpp" //包含 TClipboard & Clipboard()
// 范例程序,包含了一个memo控件
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{ //创建 TStringList对象
  auto_ptr ClipText(new TStringList); //得到剪贴板中的文字的拷贝
  ClipText->Text = Clipboard()->AsText; //然后加工一下...
  Memo1->Lines->AddStrings(ClipText.get());
}


字符流
//范例一
#include "sstream"
const char *name = "cker";
const char *email = "cker@sina.com";
// 生成 "cker"[SMTP:cker@sina.com]
 
ostringstream ost;
ost << "/"" << name << "/"[SMTP:" << email << "]";
Edit1->Text = ost.str().c_str();
 
//范例二
void TDataModuleEmployee::FullReport(const char *title)
{
  Report.header(title);
  Report << sformat( "Employee #%2d: %s%s/n", TableAllRefnum->Value, TableAllName->Text.c_str(),
  TableAllManagerFlag->Value ?"(Manager)" : "" ) << " Address: " <<
  TableAllAddress->Text.c_str() << endl << " " << TableAllCityProvZip->Text.c_str() <<
  endl << " " << NameCountry(TableAllCanada->Value) << endl;
  Report.footer();
}


检查表是否已打开
void TData::CheckEdit()
{
  for(int i=0; i < ComponentCount; i++)
  {
    if(dynamic_cast(Components[i]))
    {
      if(((TTable*)Components[i])->State == dsEdit)
      {
        String s = "Table " + Components[i]->Name + " is in edit mode" "/rWould you like to post it before entering new task?";
        if(MessageBox(NULL,s.c_str(),"Table in Edit Mode",MB_YESNO | MB_ICONINFORMATION) == IDYES)
          ((TTable*)Components[i])->Post();
        else
          ((TTable*)Components[i])->Cancel();
      }
    }
  }
}


表的状态操作
//关闭已打开的表并将他们恢复成初始状态。
void TData::MyTables(TForm * sender)
{
  int i;
  TTable * Table;
  bool *active = new bool[MyClass->ComponentCount];//在动态数组中存放每个表的初始状态,然后关闭所有的表
  for(i = 0; i < MyClass->ComponentCount; i++)
  {
    try
    {
      if((Table = dynamic_cast(MyClass->Components[i])) != NULL)
      {
        active[i] = Table->Active;
        Table->Active = false;
      }
    }
    catch(...) {}; //异常应该只来自于dynamic cast...
  }
  for(i = 0; i < MyClass->ComponentCount; i++)
  {
    try
    {
      if((Table = dynamic_cast(MyClass->Components[i])) != NULL)
      {
        if(Table->DatabaseName != OPTARDatabase->DatabaseName)
          continue;
        DBIResult result = DBIERR_NONE + 1;
        while(result != DBIERR_NONE) //若希望的话,这样允许用户重试!
        {
          result = DbiPackTable (OPTARDatabase->Handle,NULL,Table->TableName.c_str(),NULL, true);
          if(result != DBIERR_NONE)
          {
            AnsiString rsltText = "Unable to pack " + Table->TableName + "." ;
            char rslt[DBIMAXMSGLEN + 1];
            DbiGetErrorString(result, rslt) rsltText += ". Try again?";
            if(Application->MessageBox(rsltText.c_str(), "Error!",MB_YESNO) != IDYES)
              break;
          }
        }
      }
    }
    catch (...) {}; //异常应该只来自于dynamic cast...
  }
  // 将所有的表设回初始状态。
  for(i = 0; i < MyClass->ComponentCount; i++)
  {
    try
    {
      if((Table = dynamic_cast(MyClass->Components[i])) != NULL)
        Table->Active = active[i];
    }
    catch(...) {};
  }
  delete []active;
}


改变PageControl的标签
void __fastcall TfmMainForm::Cancel1Click(TObject *Sender)
{
  int i;
  switch (PageControl1->ActivePage->Tag))
  {
    case 1:
      for (i=0; i < ComponentCount; i++)
      {
        if (dynamic_cast(Components[i]))
          dynamic_cast(Components[i])->Enabled = false;
      }
      Data->tbDetail->Cancel();
      break;
    case 2:
      for (i=0; i < ComponentCount; i++)
      {
        if (dynamic_cast(Components[i]))
          dynamic_cast(Components[i])->Enabled = false;
      }
      Data->tbDetail->Cancel();
      break;
    case 3:
      for (i=0; i < ComponentCount; i++)
      {
        if (dynamic_cast(Components[i]))
          dynamic_cast(Components[i])->Text = "";
      }
    default:
      break;
  }
}


向Query传递参数
// 直接从表向Query传递参数的一种方法
TQuery *Query = new TQuery(this);
Query->DatabaseName = "dbServer";
Query->SQL->Clear();
Query->SQL->Add("DELETE FROM 'Events.DB' WHERE (TicketNo = " + Data->tbProblem->FieldByName("TicketNo")->AsString + ")" );
Query->ExecSQL();
Query->Close();
delete Query;


日期属性
TMaskEdit *meOpen;
TLabel *lbCount1;
TDateTime Date2;
void __fastcall TfmMainForm::CountOpen(TObject *Sender)
{
  switch(dynamic_cast<TComponent&>(*Sender).Tag)
  {
    case 1:
      count1 = StrToInt(lbCount1->Caption);
      count1 += 1;
      Date2 = Now() + count1;
      meOpen->Text = Date2.DateString();
      lbCount1->Caption = IntToStr(count1);
      break;
   case 2:
     count1 = StrToInt(lbCount1->Caption);
     count1 -= 1;
     Date2 = Now() + count1;
     meOpen->Text = Date2.DateString();
     lbCount1->Caption = IntToStr(count1);
     break;
  }
}


绘制状态条
void __fastcall TForm1::StatusBar1DrawPanel(TStatusBar *StatusBar, TStatusPanel *Panel, const TRect &Rect)
{
  TCanvas& c = *StatusBar->Canvas;
  switch (Panel->Index)
  {
    case 0 :
    {
      StatusBar1->Panels->Items[0]->Text = "Hello C++";
      c.Brush->Style = bsClear;
      TRect temp = Rect;
      temp.Top += 1;
      temp.Left += 1;
      c.Font->Color = clWhite;
      DrawText(c.Handle,Panel->Text.c_str(),-1,(RECT*)&temp,DT_SINGLELINE|DT_CENTER);
      c.Font->Color = clBlack;
      DrawText(c.Handle,Panel->Text.c_str(),-1,(RECT*)&Rect,DT_SINGLELINE|DT_CENTER);
      break;
    }
    case 1:
    {
      c.Brush->Color = clYellow;
      c.FillRect(Rect);
      c.Font->Color = clRed;
      DrawText(c.Handle,"clYellow Color", -1, (RECT*)&Rect, DT_SINGLELINE | DT_CENTER);
      break;
    }
    case 2:
    {
      Graphics::TBitmap* bm = new Graphics::TBitmap;
      bm->Handle = LoadBitmap(NULL, MAKEINTRESOURCE(32760));
      c.Draw(Rect.Left, Rect.Top, bm);
      delete bm;
      break;
    }
  }
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书特色 本书具有下面的一些特色: (1) 例程精练、实用、完整,易于查找本书的例程丰富,短小精练。在每章的前面部分,以一定的篇幅对基本理论、知识要点等进行论述;然后以经典的例程加以说明;最后对例程进行分析和总结。书中的例程完整,并全部按照章号进行了编号。在随书的光盘中有这些例程的源代码和编译、链接后的可执行文件。读者可以使用随书光盘中的“复制”程序(可执行文件为D5Samples.exe)将例程复制到硬盘的指定位置,也可以通过资源管理器进行复制。另外,对于每个例程都指定了若乾个关键字,可以根据关键字查找相关知识点的例程。 (2) 编程技巧丰富作者将自己在开发程序过程中总结、收集的经验和教训、一些读者在编程过程中遇到的问题等融合在本书中,并且将这些编程技巧尽量独立,便于读者快速查找。 (3) 内容广泛,兼容性强本书几乎涉及了C++Builder编程的所有领域,不仅适用于C++Builder 5,而且也适用于C++Builder 4和C++Builder 3等以前的版本。 (4) 体现了面向对象的技术和软件工程化的思想本书从总体上体现了面向对象程序设计的方法,同时将软件工程化的思想融于其中。 内容编排本书主要分为下面的六个部分: 第一部分 C++Builder编程基础 C++ Builder编程基础包括:C++Builder集成开发环境的介绍和C++语言的关键技术。 第二部分 C++Builder编程通用技术 C++ Builder编程核心技能包括:窗体和组件、菜单、工具栏和状态栏、键盘和鼠标、文件、目录和驱动器以及打印等。 第三部分 C++Builder高级编程技术 C++Builder 高级编程技术包括:数据共享、操作注册表、帮助系统的制作、安装与卸载、多线程应用程序、动态链接库和图形与多媒体等技术。 第四部分 数据库编程数据库编程部分包括:关系数据库、数据库组件、InterBase服务器、OLE DB/ADO和Web与数据库等。 第五部分 组件对象模型(COM) 组件对象模型(COM)包括:COM和OLE自动化等内容。 第六部分 分布式程序设计分布式程序设计包括:DCOM、MIDAS、ActiveForm、CORBA与分布式应用程序,以及其他的一些编程方法与技巧。 阅读建议: 对于C++Builder的初学者,可以按顺序进行阅读。如果读者对C++语言有一定的了解,也可以直接从第二部分开始,待使用C++Builder编程有了一定的经验后,再回过头来看看第一部分的内容。对于C++Builder的中级用户,可以按章节顺序阅读、上机,也可以直接挑选感兴趣的章节学习。值得注意的是,第一部分的内容对使用C++语言进行软件开发非常有用,一定要掌握好。对于C++Builder的高级用户,可以直接挑选感兴趣的章节阅读。
C++Builder精彩编程实例集锦的源代码(1,2,3部分): 第一部分 界面设计 实例001 如何实现程序闪屏效果 实例002 如何实现程序窗口闪烁 实例003 如何制作吸附窗口程序 实例004 如何制作透明程序窗口 实例005 如何制作半透明程序窗口 实例006 如何制作不规则程序窗口 实例007 如何制作程序渐变背景 实例008 如何设置程序背景图像 实例009 如何设置MDI程序背景图像 实例010 如何动态关闭MDI程序所有子窗口 实例011 如何去掉MDI程序子窗口标题栏 实例012 如何拖动非标题栏区域移动窗口 实例013 如何控制程序最小化窗口 实例014 如何限制程序最大最小化窗口 实例015 如何控制程序窗口自动隐藏或显示 实例016 如何隐藏应用程序 实例017 如何控制程序在任务栏上是否出现 实例018 如何使一个程序在任务栏同时出现多个标题 实例019 如何使程序窗口总在最前面显示 实例020 如何隐藏应用程序标题栏 实例021 如何设置程序主标题 实例022 如何设置程序图标 实例023 如何在程序中改变菜单位置 实例024 如何删除程序系统关闭菜单 实例025 如何拷贝当前程序界面 实例026 如何动态创建程序表单 实例027 如何遍历窗体所有组件 实例028 如何保证组件位置相对固定 实例029 如何在窗体中动态增加组件 实例030 如何使组件在程序运行时可以移动 实例031 如何使用组件创建托盘程序 实例032 如何使用动画组件播放动画 实例033 如何在状态栏上加载进度条 实例034 如何在编辑框内显示图像 实例035 如何在列表框中增加水平滚动条 实例036 如何在列表框中同时显示图像和文字 实例037 如何设置属性表组件标签图像 实例038 如何控制Memo组件的文字边界 实例039 如何使用代码控制文字滚动 实例040 如何纵向显示字符串 实例041 如何旋转显示字符串 实例042 如何设置显示文字分辨率 第二部分 程序设置 实例043 如何使用消息框 实例044 如何显示简单关于对话框 实例045 如何在程序中增加热键 实例046 如何在程序中自定义消息 实例047 如何在程序中自定义系统菜单 实例048 如何在执行程序间进行数据通信 实例049 如何使用OLE技术启动画图 实例050 如何在程序中添加Word文档表格 实例051 如何在程序中设置Word文档的字体风格 实例052 如何使用Onldle事件 实例053 如何使程序在循环时响应外界事件 实例054 如何设置程序在系统启动时自动运行 实例055 如何创建多线程程序 实例056 如何创建可独立执行程序 实例057 如何编写单文档应用程序 实例058 如何编写多文档应用程序 实例059 如何编写COM服务器程序 实例060 如何编写COM客户端程序 实例061 如何编写DDE服务器程序 实例062 如何编写DDE客户端程序 实例063 如何编写DLL服务器程序 实例064 如何编写DLL客户端程序 实例065 如何注册DLL服务器程序 实例066 如何制作聊天服务器程序 实例067 如何制作聊天客户端程序 实例068 如何获取程序名称和路径 实例069 如何获取程序命令行参数 实例070 如何析取动态链接库中的图标 实例071 如何设置Edit组件的文本选择范围 实例072 如何将小写金额转换成大写金额 实例073 如何将全角字符串转换成半角字符串 实例074 如何按照指定的有效位数转换数字 实例075 如何获取汉字的拼音索引 实例076 如何设置输入方法 实例077 如何控制数据输入格式 实例078 如何控制编辑框中的输入法 实例079 如何设置回车键后的焦点 实例080 如何将项目保存到对象库 实例081 如何检测鼠标信息 实例082 如何读取鼠标信息 实例083 如何实现鼠标拖动操作 实例084 如何限制鼠标活动范围 实例085 如何读取键盘信息 第三部分 文件操作 实例086 如何复制文件 实例087 如何定制文件复制操作 实例088 如何更名文件 实例089 如何更改文件扩展名 实例090 如何删除文件 实例091 如何删除文件夹 实例092 如何选择文件夹 实例093 如何创建多层文件夹 实例094 如何自动获取文件夹和文件 实例095 如何搜索指定目录下的文件 实例096 如何搜索指定目录下的隐藏文件 实例097 如何搜索文本文件中的字符串 实例098 如何替换文本文件中的字符串 实例099 如何将长文件名转换为短文件名 实例100 如何在文件打开对话框中选择多个文件 实例101 如何定制文件打开和关闭对话框 实例102 如何修改文件打开对话框的按钮标题 实例103 如何使用查找与替换对话框 实例104 如何获取和设置当前目录 实例105 如何判断文件类型 实例106 如何获取系统所有文件类型 实例107 如何获取和设置文件属性 实例108 如何获取和设置文件时间属性 实例109 如何对文件名函数进行操作 实例110 如何读写文本文件 实例111 如何打印文本文件 实例112 如何创建特大型文件 实例113 如何制作临时文件 实例114 如何启动帮助文件 实例115 如何使用组件在主机问传送文件 实例116 如何对文件进行编码和解码 实例117 如何设置RichEdit组件的存盘格式 实例118 如何在WIN.INI文件中保存程序信息 实例119 如何将数据转换成Word文档格式 实例120 如何直接从Excel文件导入数据 实例121 如何直接将数据导入到Excel文件 实例122 如何发送电子邮件(一) 实例123 如何发送电子邮件(二)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值