novaの日記: bcb6 覚書
bcb6 でクリップボードを使う
クリップボードを使うには……専用の関数を使うだけです。read, write 共に一行で済んでしまいます。 それだけでは何なので、クリップボードから文字列を読み込んで、url を抽出して、クリップボードに書き込む コードを書いてみました。url 抽出部分はかなり手抜きですが……。
---------- mainForm.h ----------
#include <vcl\clipbrd.hpp>
#include <stdio.h>
#include <string.h>
---------- mainForm.cpp ----------
// cb, log という名前の TRichEdit があるものとする。
// cbGet, exec, cbPut という名前の TButton があるものとする。
void __fastcall TmainForm::cbGetClick(TObject *Sender)
{
//クリップボードから TRichEdit にコピー。
// if(Clipboard()->AsText.Length() != 0){
cb->PasteFromClipboard();
// }
}
//---------------------------------------------------------------------------
void __fastcall TmainForm::execClick(TObject *Sender)
{
// url を抜き出す。
// target ~ " までを抽出する。
// url の途中で改行されていても抽出出来るが、
// target 文字列の途中で改行されていると抽出出来ない。
int totalLines; // cb の行数。
int i; // 汎用イテレータ。
TStringList *cache; // cb を複製。
char *buf; // cache の内容を一行保持。
char target[3072]; // 検索する文字列。
char *point; // 処理対象の文字のポインタ。
int len_buf; // buf の長さ。
int modeFlg; // 0:処理範囲外
// 1:"で括られている文字列
// 2:"で閉じた後の文字列
AnsiString pushString; // 出力用バッファ。
sprintf(target, "<a href=\"");
buf = NULL;
point = NULL;
pushString = "";
modeFlg = 0;
totalLines = cb->Lines->Count;
cache = new TStringList;
//cb の内容を cache に複製。
for(i = 0;i < totalLines;i ++)cache->Add(cb->Lines->Strings[i]);
//url を抽出。
for(i = 0;i < totalLines;i ++){
len_buf = cache->Strings[i].Length();
if(buf != NULL)free(buf);
buf = (char *)calloc(len_buf + 1, sizeof(char));
strcpy(buf, cache->Strings[i].c_str());
point = &buf[0];
while(1){
point = strstr(point, target);
if(point == NULL && modeFlg != 1)break;
else{
// " に囲まれた文字列を取得する。
if(point == NULL && modeFlg == 1)point = &buf[0];
for(;*point != '\0';point ++){
if(*point == '"')modeFlg ++;
else{
if(modeFlg == 1)pushString += *point;
if(modeFlg == 2)break;
}
}
if(modeFlg == 2){
modeFlg = 0;
log->Lines->Add(pushString);
pushString = "";
}
if(*point == '\0')break;
}
}
}
delete cache;
}
//---------------------------------------------------------------------------
void __fastcall TmainForm::cbPutClick(TObject *Sender)
{
//TRichEdit からクリップボードにコピー。
log->SelectAll(); //全て選択。
// log->CutToClipboard(); //切り取り
log->CopyToClipboard(); //コピー
}
//---------------------------------------------------------------------------
bcb6 覚書 More ログイン