フリーソフト

« 2006年6月 | トップページ | 2006年9月 »

[Delphi] ListViewのHeaderに画像を表示する

ListViewのHeaderにソートの方向を表す矢印(三角マーク)を表示したりするときに、役に立つと思います。

TreeViewEx1.ColumnImages[2]:=0;

のように設定すると2列目のヘッダにSmallImageに設定されているImageListの最初の画像が表示されます。消すときはColumnImages[2]:=-1のようにします。

[BCB] CheckBox付きのMessageDialog

TModalResult CheckMessageDialog(AnsiString Message, AnsiString Caption,
  AnsiString CheckBoxCaption, bool &Checked,
  TMsgDlgType DlgType, TMsgDlgButtons Buttons)
{
   TForm *Dialog=CreateMessageDialog(Message, DlgType, Buttons);
   if (!Caption.IsEmpty()) Dialog->Caption = Caption;

   int LeftEdge=Dialog->ClientWidth;
   int TopEdge =Dialog->ClientHeight;
   if (Dialog->ControlCount>0) {
     for (int i = 1; i < Dialog->ControlCount; i++) {
       TControl *Ctrl=Dialog->Controls[i];
       if (Ctrl->Left < LeftEdge) LeftEdge=Ctrl->Left;
       if (Ctrl->Top  < TopEdge)  TopEdge =Ctrl->Top;
     }
   } else {
     LeftEdge=20;
     TopEdge=20;
   }

   TCheckBox * CheckBox = new TCheckBox(Dialog);
   CheckBox->Parent  = Dialog;
   CheckBox->Caption = CheckBoxCaption;
   CheckBox->Checked = Checked;
   CheckBox->Left    = LeftEdge;
   CheckBox->Top     = Dialog->ClientHeight;
   CheckBox->Width   = Dialog->Canvas->TextWidth(CheckBox->Caption)+30;

   Dialog->ClientHeight = Dialog->ClientHeight + CheckBox->Height + TopEdge;

   if (CheckBox->Width + LeftEdge*2 > Dialog->ClientWidth)
     Dialog->ClientWidth = CheckBox->Width + LeftEdge*2;

   TModalResult Result = Dialog->ShowModal();
   Checked = CheckBox->Checked;

   delete Dialog;
   Dialog=NULL;
   
   return Result;
}

使い方
  bool Checked=false;
   CheckMessageDialog("本当に削除してもよろしいですか ?\r\nC:\\tmp\\*.*",
      "確認","今後は確認しない", Checked,
      mtConfirmation, (TMsgDlgButtons() << mbYes << mbNo << mbHelp));

[BCB] ListViewで行毎に背景色を変える

void __fastcall TForm1::ListView1AdvancedCustomDrawItem(
      TCustomListView *Sender, TListItem *Item, TCustomDrawState State,
      TCustomDrawStage Stage, bool &DefaultDraw)
{
  if (Item->Index%2==0)
    Sender->Canvas->Brush->Color=(TColor)RGB(240,240,255);
}

[Delphi] マウスホイールに対応する

type
  TForm1 = class(TForm)
  private
   procedure WMMousewheel(var Msg: TMessage); message WM_MOUSEWHEEL;
        :

implemetation

procedure TForm1.WMMousewheel(var Msg: TMessage);
begin
 if (Msg.WParam > 0) then begin
    //奥の方向にホイール
  Sendmessage(○○.Handle, WM_VSCROLL, SB_LINEUP, 0); //or SB_PAGEUP
 end
  else
  begin
    //手前の方向にホイール
  Sendmessage(○○.Handle, WM_VSCROLL, SB_LINEDOWN, 0); //or SB_PAGEDOWN
 end;
end;

[BCB] 右寄せのTStatusBar

//header file
class TForm1 : public TForm
{
   :
private: // ユーザー宣言
        int *FStatusBarWidths;
   :
};

//cpp file
//

[BCB] 中間ファイルを使用せずにWebBrowserに直接書き込む

Delphiでは割と簡単だったのですが。もっと簡単な方法があるのでしょうか?


  AnsiString Str="<html>aaaa</html>";

  SAFEARRAY *safe_array = SafeArrayCreateVector(VT_VARIANT,0,1);
  VARIANT *variant;

  SafeArrayAccessData(safe_array,(void **)&variant);
  variant->vt      = VT_BSTR;            
  variant->bstrVal = SysAllocString(WideString(Str));
  SafeArrayUnaccessData(safe_array);

  IHTMLDocument2 *Html=NULL;
  CppWebBrowser1->Navigate(L"about:blank");
  CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2,(void **)&Html);
  Html->write(safe_array);

  Html->close();
  Html->Release();

  SafeArrayDestroy(safe_array);

[BCB] バイナリサーチ(2分探索)

int __fastcall TSortedObjectList::BinSearch(int Key)
{
  if (FList->Count==0)  return -1;

  int LeftIdx=0;
  int RightIdx=FList->Count-1;

  while (LeftIdx<=RightIdx) {
    int MidIdx=(LeftIdx+RightIdx)/2;
    int MidVal=(int)FList->Items[MidIdx];
    if (MidVal==Key) return MidIdx;  //見つかった
    else if (Key>MidVal) LeftIdx=MidIdx+1;
    else RightIdx=MidIdx-1;
  }

   return -1;
}

[BCB] Enterキーで次のコントロールにフォーカスを移動する

void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
  if (Key==VK_RETURN) {
    SendMessage(Handle, WM_NEXTDLGCTL, 0, 0);
    Key=0x00;
  }
}

[LaTeX] jpgやbmpをepsに変換する

ImageMagickを使った変換方法です。

>convert test.jpg eps2:test.eps

割とサイズの小さいepsファイルを作ることができます。

[Delphi,BCB] StrToIntで例外が発生するのがめんどくさい

StrToIntは文字列を数字に変換するための関数ですが、引数に数字として不正な文字列(例えば「125a」とか)を渡すと例外が発生してしまいます。これをきちんと処理するのが面倒だったり、単純に不正な文字列が渡された場合は-1を返してほしいと思う場合があったりします。そういう時に便利なのがStrToIntDefという関数です。

i:=StrToIntDef(Edit1.Text,-1);

というようにデフォルト値を指定して変換ができます。変換に失敗した場合はデフォルト値が返される仕組みです。例外は発生しません。場合によっては非常に便利な関数です。

« 2006年6月 | トップページ | 2006年9月 »