AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
【Jw_cad 外部変形】文字連結
今回は、文字連結を行うプログラムを作成しようと思います。ばらばらになっている文字データを合わせて1つの文字データにします。範囲選択して行う場合と、文字を2つ選択して1文字目+2文字目を行う場合、を考えます。
文字の最大長さは、半角128文字(全角64文字)とします。文字位置・文字種等は1文字目に合わせる事とします。範囲選択時、選択した文字が多すぎる場合は処理を途中終了することとします。これは、想定しない位置等で文字連結をされると利用者側は困ってしまうであろうから、です。
 
範囲選択時、水平位置(左→右)でチェックするモードと垂直位置(上→下)でチェックするモードの切替指定を行います。一番左側/上側を1つ目の文字データとします。軸角に対応。また、文字データと文字データを連結する際、間に区切り文字を挿入したい場合、それを入力出来るようにします。余り長い文字を入れる事は無いと思いますので、文字長さを半角4文字までとします。
 
それではバッチファイルから。
p049_文字連結.bat
REM p049−文字連結
@echo off
start /w p049.exe %1
GOTO END
REM
REM
REM ----- ----- ----- ----- ----- -----
REM #jww
REM #cd
REM #hc 文字連結を行う外部変形です。機能を選択して下さい(1〜3)
REM #hm文字連結|1)範囲選択|2)2文字選択|3)設定|
REM
REM #:1 -----範囲選択-----
REM #hf
REM #zs
REM #zz
REM #zw
REM #bz
REM #h3
REM #hc 【範囲選択】文字を選択して下さい。
REM #g1
REM #hr
REM #e
REM
REM #:2 -----2文字選択-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #bz
REM #1ch 1文字目を指示して下さい。
REM #2ch 2文字目を指示して下さい。
REM #hr
REM #e
REM
REM #:3 -----設定-----
REM #hf
REM #zs
REM #zc
REM #zz
REM #zw
REM #bz
REM #hr
REM #e
REM
:END
REM 終了
 
プロジェクト「p049」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「p049」というフォルダを作成し、Delphi6を起動します。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
 タイトル
p049−文字連結
[ディレクトリ/条件]頁
 パス及びディレクトリ
C:\DelphiProgram\jww\p049

メニュー「ファイル」→「名前を付けて保存」
「C:\DelphiProgram\jww\p049」の中に「Unit1.pas」を保存
メニュー「ファイル」→「プロジェクトに名前を付けて保存」
「C:\DelphiProgram\jww\p049」の中に「p049.dpr」として保存

Form1の画面は、取りあえずいつもと同じく、大きさを扱いやすいよう小さくし、オブジェクトインスペクタで Form1 のプロパティを設定します。
BorderIcons
 biMaximize
False最大化しないように
BorderStylebsSingle画面をリサイズしないように
Caption文字連結タイトルバーに表示されます
ColorclSkyBlue画面色 御自由にどうぞ
Font内
 Name
MS ゴシック プロポーショナルフォントは
文字配置調整が微妙なので
Font内
 Size
10小さいと少し見難い為
ScaledFalse 動作環境によっての文字の
大きさ変動を少し抑えられる

メニュー「表示」→「プロジェクトマネージャ」
を実行し、コード画面の左側にドッキングさせておきます。前回及び上記で作成した「MyFunc.pas」「JwwGaibu.pas」を取り込みます。Unit1.pas の uses節に MyFunc と JwwGaibu を追加します。(※以下では全角空白を付けて桁調整等をしていますが実際は半角空白或いは無しです)
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,
  MyFunc, JwwGaibu ;
 
type
  TForm1 = class(TForm)
・・・
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。アイコンが Delphi6デフォルトのものになっていますので、アイコンファイルを作成してフォーム・プロジェクトで指定しておきます。

画面上に [Standard]内の RadioGroup コンポーネントを1つ、Label コンポーネントを1つ、Editコンポーネントを1つ、Button コンポーネントを2つ配置します。
RadioGroup1
Caption範囲選択時(&A)左上の表示内容
Columns1横項目(カラム)の数
Items 水平揃え(左→右)
垂直揃え(上→下)
表示項目内容
ItemIndex0デフォルト指定
Label1
Caption文字間に挿入する区切文字表示内容
Edit1
MaxLength4最大入力可能な文字長さ
Text 文字内容(空;何も無し)
Button1
CaptionOK(&Y)ボタン上の文字
DefaultTrue[Enter]キーを押したら[OK]
Button2
Captionキャンセル(&N)ボタン上の文字
CancelTrue[Esc]キーを押したら[キャンセル]
画面のレイアウトは下図のようにしてみました。

 
オブジェクトインスペクタにて Form1 の イベント OnShowの箇所でダブルクリック、OnCloseの箇所でダブルクリック、及び、
Button1、Button2 をダブルクリックして OnClickイベントを記述出来るようにします。
Unit1.pas
(・・・前略・・・)
type
  TForm1 = class(TForm)
 (・・・)
  private
   { Private 宣言 }
   AppPath : string ;
   rm : integer ;
   sp : string ;
   procedure OpenDatFile ;
   procedure SaveDatFile ;
   procedure Syori1 ;
   procedure Syori2 ;
  public
   { Public 宣言 }
  end;
 
var
Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
// データファイルを読み込む
procedure TForm1.OpenDatFile ;
var
  fn: string ;
  F : TextFile ;
  s : string ;
begin
  fn := ChangeFileExt(Application.ExeName,'.dat') ;
  rm := 0 ;
  sp := '';
  // 読み込み
  if not(FileExists(fn)) then exit;
  try
   AssignFile(F, fn);
   FileMode := 0;
   Reset(F);
   ReadLn(F, s);   rm := SInt(s);
   ReadLn(F, s);   sp := CTrim(s);
   CloseFile(F);
  except
   CloseFile(F);
  end;
end;
 
// データファイルを保存する
procedure TForm1.SaveDatFile ;
var
  fn: string ;
  F : TextFile ;
begin
  fn := ChangeFileExt(Application.ExeName,'.dat') ;
  try
   AssignFile(F, fn);
   ReWrite(F);
   WriteLn(F, IntToStr(rm));
   WriteLn(F, sp);
   CloseFile(F);
  except
   CloseFile(F);
   if FileExists(fn) then DeleteFile(fn);
  end;
end;
 
// 起動時
procedure TForm1.FormShow(Sender: TObject);
begin
  if (ParamCount >= 1) then
   if (ParamStr(1) <> '3') then
    Form1.WindowState := wsMinimized ;
  // 初期設定
  InitJwwGaibu ;
  // プログラムのあるフォルダを取得します
  AppPath := ExtractFilePath(Application.ExeName) ;
  //
  OpenDatFile ;
  if (ParamCount >= 1) then begin
   if (ParamStr(1) = '1') then begin
    // 範囲選択
    Syori1 ;
   end
   else if (ParamStr(1) = '2') then begin
    // 2文字選択
    Syori2 ;
  end
   else if (ParamStr(1) = '3') then begin
    // 設定
    Form1.Left := Mouse.CursorPos.X - Form1.Width div 2;
    Form1.Top := Mouse.CursorPos.Y - 4;
    RadioGroup1.ItemIndex := rm ;
    Edit1.Text := sp ;
   end;
  end;
end;
 
// 終了時
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // 最終処理
  EndJwwGaibu ;
end;
 
// [OK]
procedure TForm1.Button1Click(Sender: TObject);
begin
  rm := RadioGroup1.ItemIndex ;
  sp := Edit1.Text ;
  SaveDatFile ;
  close ;
end;
 
// [Cancel]
procedure TForm1.Button2Click(Sender: TObject);
begin
  Close ;
end;
 
// 処理1:範囲選択
procedure TForm1.Syori1 ;
var
  i,j,k : integer ;
  za : array of double ;
  tn : array of integer ;
  xx,yy : double ;
  s : string ;
begin
  OpenTempFile(AppPath+'JWC_TEMP.TXT') ;
  S_Init ; // 初期化
  if (JW_EntTextN >= 2) then begin
   // 座標を一時的に配列に入れる
   SetLength(za,JW_EntTextN) ;
   SetLength(tn,JW_EntTextN) ;
   for i:=0 to JW_EntTextN-1 do begin
    tn[i] := i ;
    with JW_EntText[i] do begin
     dRev(xx,yy,x1,y1,0.0,0.0,-JG_Jikukaku);
     if (rm = 0) then
      za[i] :=-xx
     else
      za[i] := yy ;
    end;
   end;
   // 座標を並び替える
   for i:=0 to JW_EntTextN-2 do begin
    xx := za[i] ;
    k := -1;
    for j:=i+1 to JW_EntTextN-1 do begin
     if (xx < za[j]) then begin
      xx := za[j] ;
      k := j;
     end;
    end;
    if (k <> -1) then begin
     SwapF(za[i],za[k]) ;
     SwapI(tn[i],tn[k]) ;
    end;
   end;
   // 文字連結
   s := JW_EntText[tn[0]].st ;
   j := 0 ;
   for i:=1 to JW_EntTextN-1 do begin
    if (Length(s+sp+JW_EntText[tn[i]].st) <= 128) then begin
     s := s + sp + JW_EntText[tn[i]].st ;
     j := i ;
    end
   else begin
    break ;
    end;
   end;
   JW_EntText[tn[0]].st := s ;
   // 文字連結されたものを無効化する
   for i:=1 to j do begin
    for k:=0 to JW_EntN-1 do begin
     if (JW_EntNo[k].yn = 4)and(JW_EntNo[k].no = tn[i]) then
      JW_EntNo[k].yn := 0;
    end;
   end;
   // 生成
   SendMem('hd');
   SendMem('bz'); // 図寸モード
   S_EntAll(-1,-1,-1,-1,-1,-1,-1,0, nil);
  end;
  SaveTempFile(AppPath+'JWC_TEMP.TXT') ;
  Close ;
end;
 
// 処理2:2文字選択
procedure TForm1.Syori2 ;
var
  s : string ;
begin
  OpenTempFile(AppPath+'JWC_TEMP.TXT') ;
  S_Init ; // 初期化
  if (JW_EntTextN = 2) then begin
   s := JW_EntText[0].st + sp + JW_EntText[1].st ;
   if (Length(s) <= 128) then begin
    JW_EntText[0].st := s ;
    JW_EntNo[1].yn := 0 ;
    SendMem('hd');
    SendMem('bz'); // 図寸モード
    S_EntAll(-1,-1,-1,-1,-1,-1,-1,0, nil);
   end;
  end;
  SaveTempFile(AppPath+'JWC_TEMP.TXT') ;
  Close ;
end;
 
end.
 
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して下さい。
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p049」内に作成された「p049.exe」をフォルダ「Gapp」内へコピーします。外部変形を実行して動作確認をしてみて下さい。
 
 
今回のバッチファイルと実行ファイル、及び、ソースファイルについては、Pcataサイトに置いておきますので必要な方はそちらからダウンロードして下さい。
 
 
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
M7
Jw_cad
 [BACK]
 [NEXT]
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.