16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE:Dialog的なフォームを関数化する"
この発言は #01359 凛 さんのDialog的なフォームを関数化する に対するコメントです
凛 さん、こんにちわ。お陰で暫定版が出来ました。
Form の表示位置や大きさの制御がまだですが、実用上は十分です。
Function PopA(Title: String;
var Str1:string; var Str2:string; Lines: String):Char;
(手続き的)プログラムの中で、
var
Csp1: Char;
Sp1,Sp2: String;
:
:
Csp1 := PopA('表面処理仕様の選択',Sp1,Sp2,
'-- 無処理 :Non ;'
+'A. 電解金メッキ :AuE ;'
+'B. 無電解金メッキ :AuD ;'
+'N. ニッケルメッキ :Ni ;'
+'F. フラックス :Flx ';
の様に書き、現れた ListBox の3行目をクリックすると、
Csp1 'B'
Sp1 'B. 無電解金メッキ '
Sp2 'AuD '
となります。Form に隠れる通常の ListBox.Items と違い、表示・選択の内容
がプログラム上で見えるのと、ロジックの進行上で必要な時だけ表示され、此
処で選択しないと先に進まないのがミソです。
Function PopA には Form を含まず、この中で Fpopup を起動します。Form
を含まないから、LibUnit の中に置けます。FPopup の中身とインターフェー
スは、index を返す他は、殆どご教示頂いたままです。
Function PopA(Title: String;
var Str1:string; var Str2:string; Lines: String):Char;
var
SS1 : Array [0..20] of String;
SS2 : Array [0..5] of String;
N1,N2,jj,Idx : Integer;
S1,Text,Ans : String;
Cp : Char;
begin
S1 := Lines;
result := S1[1];
N1 := StrDim(S1,';',SS1,1); // 文字列を配列に分解
JJ := 1;
Text := '';
while jj <= N1 do
begin
StrDim(SS1[jj],':',SS2,1);
Text := Text + SS2[1];
if jj < N1 then
Text := Text + ',';
JJ := JJ + 1;
end;
if popupf(Title,Text,Idx,ans) = mrOK then // 此処で Form を作る。
begin
S1 := SS1[Idx];
N2 := StrDim(S1,':',SS2,1);
Str1 := SS2[1];
Str2 := SS2[2];
Cp := S1[1];
end
else
begin
Cp := '?';
Str1 := '****';
Str2 := '****';
end;
Result := Cp;
end;
// 指定した Delimiter で文字列を配列に分解する
Function StrDim(St: String; Sep: String;
out XX: Array of String; Ini: Integer): Integer;
var
N1,P1,L1,L3: Integer;
S1,S2,Sp : String;
begin
S1 := St;
Sp := Sep;
L1 := Length(S1);
L3 := Length(XX);
N1 := Ini - 1;
While L1>0 do
begin
P1 := Pos(Sp,S1);
if P1>0 then
begin
S2 := Copy(S1,0,P1-1);
S1 := Copy(S1,P1+1,L1-P1) ;
L1 := Length(s1);
end
else
Begin
S2 := S1;
L1 := 0;
end;
N1 := N1 + 1;
XX[N1] := S2;
if N1 >= L3 then
L1 := 0;
end;
Result := N1;
end;
unit Xpopup;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TFpopup = class(TForm)
ListBox1: TListBox;
procedure ListBox1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
ResultString:string;
ResultIndex :Integer;
end;
function popupf(Title: String;Lines: String;
var Indx: Integer;var ChosenLine:string):TModalResult;
var
Fpopup: TFpopup;
implementation
uses
Lib1;
{$R *.DFM}
function popupf(Title: String; Lines:String;
var Indx: Integer; var ChosenLine:string): TModalResult;
var
F2:TFpopup;
AA: Array[0..30] of String;
NL,j: Integer;
begin
F2:=TFpopup.Create(Application);
NL := StrDim(Lines,',',AA,1);
j := 1;
while j <= NL do
begin
F2.ListBox1.Items.Add(AA[j]);
j := j + 1;
end;
F2.caption := Title;
result:=F2.ShowModal;
ChosenLine:=F2.ResultString;
Indx := F2.ResultIndex;
F2.Release;
end;
procedure TFpopup.ListBox1Click(Sender: TObject);
begin
ResultString:=ListBox1.Items[ListBox1.ItemIndex];
ResultIndex :=ListBox1.ItemIndex+1;
ModalResult:=mrOK;
end;
end.
CommaText を使うと、ブランクも区切りに見てしまうので、此処でも StrDim
(StringToDimension)を使いました。他言語で使い慣れたルーチンです。
NOVO
Original document by NOVO 氏 ID:(PXU13352)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|