パスワードを忘れた? アカウント作成
546984 journal

novaの日記: bcb6 覚書

日記 by nova

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(); //コピー
}
//---------------------------------------------------------------------------

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

物事のやり方は一つではない -- Perlな人

読み込み中...