お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"通信の内容を表示するコンポーネント"



皆さん こんにちは らせん企画の佐々木です

  通信のログを表示するコンポーネントはないかという要望
に対するサンプルです。まだまだ早くできます。
  それと表示内容を TSrings に取っているのはログの保存も
兼ねるようにとの配慮からです。Property は自分で作ってく
ださい。



unit MsgPanel;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

Type
  TScanLines = Array [0..65535] Of PByteArray;
  PScanLines = ^TScanLines;

  TMsgPanel = class(TCustomPanel)
  private
    { Private 宣言 }
    FMsgList: TStrings;
    FOutMap: TBitMap;
    FBMapRect: TRect;
    FLeftMargin, FTopMargin, FLineMargin,
    FLineHeight, FLineCount: Integer;

    FMsgCount: Integer;
    FLastMsg: String;

    Procedure BMapSizeSet;
    Function GetMsgCount: Integer;
    Function GetLastMsg: String;
    Procedure SetLeftMargin(pMargin: Integer);
    Procedure SetLineMargin(pMargin: Integer);
    Procedure SetTopMargin(pMargin: Integer);
    Procedure TextView;

    Property MsgCount: Integer Read GetMsgCount;
    Property LastMsg: String Read GetLastMsg;
  protected
    { Protected 宣言 }
    procedure Resize; Override;
  public
    { Public 宣言 }
    Constructor Create(AOwner: TComponent); Override;
    Destructor Destroy; Override;
    Procedure Add(pMsg: String);
  published
    { Published 宣言 }
    Property Align;
    Property Font;
    Property MarginLeft: Integer Read FLeftMargin Write SetLeftMargin
                     Default 2;
    Property MarginLine: Integer Read FLineMargin Write SetLineMargin
                     Default 2;
    Property MarginTop: Integer Read FTopMargin Write SetTopMargin
                     Default 2;
  end;

procedure Register;

implementation

{ Create }
Constructor TMsgPanel.Create(AOwner: TComponent);
Begin
  Inherited Create(AOwner);
  If csDesigning in ComponentState Then
    Self.Caption := '';
  FOutMap := TBitMap.Create;
  FMsgList := TStringList.Create;
  FLeftMargin := 2;
  FTopMargin := 2;
  FLineMargin := 2;
  Color := clWindow;
  BMapSizeSet;
End;

{ Destroy }
Destructor TMsgPanel.Destroy;
Begin
  FMsgList.Free;
  FOutMap.Free;
  Inherited;
End;

{ Add }
Procedure TMsgPanel.Add(pMsg: String);
Begin
  FMsgList.Add(pMsg);
  TextView;
End;

{ BMapSizeSet }
Procedure TMsgPanel.BMapSizeSet;
Var
  ixH: Integer;
  Procedure BMInit(pBM: TBitMap);
  Begin
    pBM.PixelFormat := pf1bit;
    pBM.Height := Self.Height;
    pBM.Width  := Self.Width;
    pBM.Canvas.Font.Assign(Self.Font);
    pBM.Canvas.FillRect(Rect(0, 0, Self.Width, Self.Height));
  End;
Begin
  BMInit(FOutMap);
  With FOutMap.Canvas Do
  Begin
    FLineHeight := TextHeight('Ag') + FLineMargin;
    FLineCount := Self.Height Div FLineHeight;
  End;
End;

{ GetMsgCount }
Function TMsgPanel.GetMsgCount: Integer;
Begin
  Result := FMsgList.Count;
End;

{ GetLastMsg }
Function TMsgPanel.GetLastMsg: String;
Begin
  Result := FMsgList[MsgCount - 1];
End;

{ Resize }
Procedure TMsgPanel.Resize;
Begin
  BMapSizeSet;
  TextView;
End;

{ SetLeftMargin }
Procedure TMsgPanel.SetLeftMargin(pMargin: Integer);
Begin
  If pMargin < 0 Then
    FLeftMargin := 0
  Else If pMargin > (Self.Width Div 2) Then
    FLeftMargin := Self.Width Div 2;
  TextView;
End;

{ SetLineMargin }
Procedure TMsgPanel.SetLineMargin(pMargin: Integer);
Begin
  If pMargin < 0 Then
    FLineMargin := 0
  Else If pMargin > (Self.Height Div 2) Then
    FLineMargin := Self.Height Div 2;
  TextView;
End;

{ SetTopMargin }
Procedure TMsgPanel.SetTopMargin(pMargin: Integer);
Begin
  If pMargin < 0 Then
    FTopMargin := 0
  Else If pMargin > (Self.Height Div 2) Then
    FTopMargin := Self.Height Div 2;
  TextView;
End;

{ TextView }
Procedure TMsgPanel.TextView;
Var
  ixW, ixH, wEnd, wLine: Integer;
Begin
  If MsgCount = 0 Then  Exit;
  wEnd := MsgCount - 1;
  wLine := FLineCount - 1;
  If FLineCount > MsgCount Then
    wLine := MsgCount - 1;
  If wLine >= FLineCount - 1 Then
  Begin
   FOutMap.Canvas.Draw(0, (FLineHeight * -1), FOutMap);
   FOutMap.Canvas.FillRect(Rect(0, FTopMargin + (wLine) * FLineHeight
                        , Self.Width, Self.Height));
  End;
  FOutMap.Canvas.TextOut(FLeftMargin
                       , FTopMargin + (wLine) * FLineHeight
                       , LastMsg);
  Self.Canvas.Draw(0, 0, FOutMap);
End;

procedure Register;
begin
  RegisterComponents('Samples', [TMsgPanel]);
end;

end.

             99/8/23(Mon) 04:32pm  BYQ05322 らせん企画の佐々木

Original document by らせん企画      氏 ID:(BYQ05322)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum