Watch, Follow, &
Connect with Us

Please visit our new home
community.embarcadero.com.


Welcome, Guest
Guest Settings
Help

Thread: Memo1の高さや幅を入力された文字列が隠れないように自動的に変更してゆくには?



Permlink Replies: 0
osamu nagao

Posts: 97
Registered: 3/22/04
Memo1の高さや幅を入力された文字列が隠れないように自動的に変更してゆくには?
Click to report abuse...   Click to reply to this thread Reply
  Posted: Aug 28, 2016 2:02 AM
nagaoです。 いつも教えて頂き、ありがとうございます。
TmemoのインスタンスのMemo1で、始め何も表示されていない場合は、1行分の高さにしておき、
改行すると、1行目に入力した文字が隠れることがなく、2行分の高さにMemo1の高さを自動的に
変えることは、出来ないでしょうか? 3行目以降に行が増えた場合も同様のことを希望します。
一行の文字列の文字数が長くなった場合も、入力された文字がすべてその行に表示されるように
するため、自動的にmemo1の幅も増やしたいです。
なお、この様な動きをするMemo1を実現すべく、私なりにサンプルプログラムを作ってみましたので、
それを下記致しますが、このサンプルプログラムでは、次の欠点があります。
  1)正確にMemo1.widthやMemo1.heightが計算できていないので、これを補うため、必要以上に
   Memo1の高さや幅を大きくしている。そのため余白が多い。
2)余白を小さくすると、改行した時に、高さは2行分に変わるものの、一行目の文字が隠れた状態
    になる。

***************************私の作ったサンプルプログラム*************************************************
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Image1: TImage;
Memo1: TMemo;
procedure FormShow(Sender: TObject);
procedure Memo1Change(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
hh:integer; //一行の高さ
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
var
ahandle:thandle;
Pixelperinch:integer;
begin
Memo1.Font.Size:=22;
Image1.Canvas.Font.Size:=Memo1.Font.Size;
Image1.Canvas.Font.Style:=Memo1.Font.style;
Image1.Canvas.Font.Name:=Memo1.Font.Name;
ahandle:=getdc(0);
Pixelperinch:=GetDeviceCaps(ahandle,LOGPIXELSX);
Releasedc(0,ahandle);
//次の行で一行の高さを求める。
hh:=round(Image1.Canvas.Font.Size/72*Pixelperinch);
Memo1.Lines.Clear;
Memo1.Height:=hh*2+30;
//Memo1.Height:=hh; //本当は上のコードをこのように変えたい
end;

procedure TForm1.Memo1Change(Sender: TObject);
var
s:string;
i,k,max:integer;
begin
if hh=0 then exit;
Memo1.Height:=hh*(Memo1.Lines.count+1)+30;
//Memo1.Height:=hh*(Memo1.Lines.count); //本当は上のコードをこのように変えたい
max:=0;
for i:=0 to Memo1.Lines.count-1 do begin
s:=Memo1.lines[i];
k:=Image1.Canvas.Textwidth(s);
if k>max then max:=k;
end;
Memo1.Width:=max+100;
//Memo1.Width:=max; //本当は上のコードをこのように変えたい
end;

end.
Legend
Helpful Answer (5 pts)
Correct Answer (10 pts)

Server Response from: ETNAJIVE02