• ベストアンサー

次のDelphiプログラムで

type TStrArray = class private fStrList: TStringList; procedure SetItem(index: Integer; const Value: string); function GetItem(index: Integer): string; public constructor Create; destructor Destroy; override; procedure Clear; function GetCount: Integer; procedure Push(Item: string); function Pop: string; procedure UnShift(Item: string); function Shift: string; property Items[index: Integer]: string read GetItem write SetItem; default; end; TStrArray = class は TStrArray = class(TObject) としても同じでしょうか? GetItem write SetItem; default; の「default;」の意味を教えてください。

  • keyguy
  • お礼率68% (895/1314)

質問者が選んだベストアンサー

  • ベストアンサー
noname#9119
noname#9119
回答No.4

もちろん、デフォルトプロパティにできるのはクラス内で1つだけです。 格納指定子のdefaultはいくらでも使えます。

keyguy
質問者

お礼

ありがとうございます。

その他の回答 (3)

  • paspas
  • ベストアンサー率52% (47/90)
回答No.3

#2です。 >TStrArray = class >は >TStrArray = class(TObject) >としても同じでしょうか? >ちがいます。 >単にclassとする場合は継承しているものはありません。 >class(TObject)の場合は、TObjectを継承することができます。 訂正します。 classのみの場合は、暗黙的にTObjectからの派生となります。失礼いたしました。

  • paspas
  • ベストアンサー率52% (47/90)
回答No.2

>TStrArray = class >は >TStrArray = class(TObject) >としても同じでしょうか? ちがいます。 単にclassとする場合は継承しているものはありません。 class(TObject)の場合は、TObjectを継承することができます。 >GetItem write SetItem; default; >の「default;」の意味を教えてください default 指令の後には,プロパティと同じ型の定数を指定しなければなりません。次に例を示します。 property Tag: Longint read FTag write FTag default 0; default指令は格納指定子と呼ばれます。格納指定子はプログラムの動作に影響を及ぼすものではなく,実行時型情報(RTTI)の管理方法を制御するものです。具体的には,格納指定子により,パブリッシュプロパティの値をフォーム(.DFM)ファイルに保存するかどうかが決まります。

keyguy
質問者

お礼

ありがとうございます。 defaultの右が0の時には省略できるのでしょうか?

noname#9119
noname#9119
回答No.1

class の後ろを省略すると TObject からの派生なので多分同じ。 配列プロパティ定義に default をつけると、そのクラスのデフォルトプロパティになる。 デフォルトプロパティにすると省略形でアクセスできる。 この場合 StrArray.Items[index] を StrArray[index] と書ける。 文法レベルのことなのでヘルプにもっと詳しく書いてあると思います。

keyguy
質問者

お礼

ありがとうございました。 defaultに指定できるのはクラス内で1つだけなのでしょうか?

関連するQ&A

  • Delphiプログラミングについて

    この内容ではいけないのでしょか? また、代わりの方法なども教えていただけると嬉しいです ボタン ラベル がフォーム1の上に1つずつあるだけです お願いいたします unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Button1: TButton; procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; i:integer; implementation {$R *.dfm} procedure hyouji; begin repeat form1.label1.caption:= 'strike'; until i = 10; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (KEY = VK_RIGHT) then i:=i+1; end; procedure TForm1.Button1Click(Sender: TObject); begin hyouji end; end.

  • 【delphi】クラスの継承、互換性について

    //Base.pas TSituation = class(TObject) public  procedure Update;virtual;abstract;  procedure Reflect;virtual;abstract; end; //Title.pas TSceneTitle = class(TSituation) private  ・  ・  ・ public  constructor Create;  destructor Destroy;override;  procedure Update;override;  procedure Reflect;override; end; //main.pas(メインフォーム) unit main; interface uses  ・・・, Base, Title;    ・    ・    ・ var  fm_main: Tfm_main;  Situation: TSituation; --------------------------------------------------- こう、きちんとクラスの宣言も継承もしているのに、(しているはず Situation := TSceneTitle.Create; とすると互換性がないといってコンパイルエラーになります。 なにかおかしいところがあるのでしょうか。

  • Delphiに関して  「このプログラム解読できません!」

    こんにちは。このプログラムが解読不可です。StringGridの1列目と2列目の各セルの内容を右寄せにする ということで、実行させると確かにそうなるのですが、どういう構造かいまいち分かりません。特に 'Rect.Top:=Rect.Top+2;' のところなんて"なんで+2なの~?"ってホントに謎です。gdFixedとかFillRectとかヘルプに書いてあることとなんか違う気がして....DT_RIGHTもわかりません。 このプログラムの解説お願いします! procedure TForm1.StringGrid1DrawCell(Sender:TObject;ACol,ARow:Integer;Rect: TRect; State: TGridDrawState); begin If Not (gdFixed In State) And (ACol In [1,2]) Then Begin StringGrid1.Canvas.FillRect(Rect); Rect.Top := Rect.Top + 2; If (ACol = 1)or(ACol = 2) Then DrawText(StringGrid1.Canvas.Handle, PChar(StringGrid1.Cells                 [ACol,ARow]),Lengthend(StringGrid1.Cells                [ACol,ARow]),Rect,DT_RIGHT) end; end;

  • 秀丸の正規表現用DLLをDelphiから使いたい

    秀丸に同梱されている正規表現処理用DLL、HMJRE.DLLをDelphiで使用しようとしているのですが、 うまくいきません。 実行しようとすると「エントリーポイントが見つかりません」と表示されます。 ---------------------- function dllfuncstr(func:String;find_str:String;target_str:String;start_pos:Integer;replace_str:String;kind:Integer):String; external 'HMJRE.DLL'; ... procedure TForm1.Button1Click(Sender: TObject); var find_str, target_str, replace_str:String; start_pos, kind:Integer; begin find_str := '123'; target_str := Memo1.Lines[0]; start_pos := 0; replace_str := 'abc'; kind := 1;// Memo2.Lines[0]:= dllfuncstr('ReplaceRegularNoCaseSence',find_str,target_str,start_pos,replace_str,1); end; ----- 秀丸のヘルプにマクロから呼び出す場合の例 が次のように記載されています。 $s = dllfuncstr( "ReplaceRegular", "([a-z]+)([0-9]+)", "--abcdefg1234567--", 0, "\\2\\1" ); message $s; DelphiのバージョンはXE5です。

  • Delphiのプロパティでのクラス型の取得

    プロパティにクラス型を設定した場合、セットされたことを認識するにはどうすればいいのでしょう? 言葉では伝えにくいので、ソースコードで。 TClassA = class private  FMemberA: Integer; public  property MemberA: Integer read FMemberA write FMemberA; end; TClassB = class private  FMember: TClassA;  procedure SetMember(Value: TClassA); public  constructor Create;override;  property Member: TClassA read FMember write SetMember; end; constructor TClassB.Create; begin  FMember:=TClassA.Create; end; procedure TClassB.SetMember(Value: TClassA); begin  FMember:=Value;  //<<したい処理>> end; とあって、 var Test:TClassB; begin  Test:=TClassB.Create;  Test.Member.MemberA:=5; ・・・ としたとき、TClassBのメンバーであるMemberはクラス型であるため、SetMemberは呼び出されないと思うのですが、このときに上の「したい処理」の部分のように処理を実行するにはどうすればよいのでしょうか? イメージでは、 Button.Font.Size:=10; のような感じの時に、Button側でFontの変更を知りたいということです。 よろしくお願いします。

  • StringGridの中身をCSV形式で保存するには、保存の際に、ファイル拡張子を自動で「.csv」を付与するには?

    こんにちは。 StringGridの中身をCSVデータとして保存したいのですが、 その際に、『自分の好きな名前』で『デスクトップ』に保存できるようにしたいと考えています。 ソース1では、CSV形式での保存は行えるのですが、 名前をつけるやり方とデスクトップの指定方法が分かりません。 opendialog,savedialogを使うと思うのですが、 上手く組み合わせることが出来ずに困っています。 ソース2では、理想どおりの結果を出力できるはずなんですが、 実行すると空の結果が出力されます。どこが間違っているか分からず、困り果てています。 ・間違っている部分がどこか? ・保存する際に自動で端子に.csvを付与するにはどうすれば良いか? アドバイス頂けると助かります。 宜しくお願いしします。 -----------ソース1:------------------------------------------ procedure TForm2.GridSaveCSV(SGrid:TStringGrid; fName: String); var stList :TStringList; ARow :Integer; begin stList:=TStringList.Create; try for ARow:=0 to SGrid.RowCount-1 do stList.Add(SGrid.Rows[ARow].CommaText); stList.SaveToFile(fName); finally stList.Free; end; end; //CSVFileからStringGridへ読込み1 procedure TForm2.GridLoadCSV(SGrid:TStringGrid; fName:string); var stList: TStringList; ARow: Integer; begin stList:=TStringList.Create; try stList.LoadFromFile(fName); SGrid.RowCount:= stList.Count; for ARow:=0 to stList.Count-1 do SGrid.Rows[ARow].CommaText:= stList[ARow]; finally stList.Free; end; end; procedure TForm2.Button3Click(Sender: TObject); var fName: String; begin fName := 'csvtest.csv'; GridSaveCSV(StringGrid1,fName); end; -------------------------------------------------------------- -----------ソース2:------------------------------------------ procedure TForm2.Button8Click(Sender: TObject); var F : TextFile; Str : String; CellA,CellB,CellC,CellD,CellE : String; RowCNT : Integer; begin if not SaveDialog1.Execute then exit; if FileExists(SaveDialog1.FileName) then //↑ここのFileNameの使い方が良く分かりません>< //保存するときに、自動で.csvが付与されるようにしたいと思っています。 if Application.MessageBox('上書きしますか','注意',MB_YESNO ) = 7 then exit; //_ AssignFile(F,SaveDialog1.FileName); Rewrite(F); RowCNT := 0; try while not (StringGrid1.Cells[0,RowCnt] = '') do begin CellA := StringGrid1.Cells[0,RowCnt]; CellB := StringGrid1.Cells[1,RowCnt]; CellC := StringGrid1.Cells[2,RowCnt]; CellD := StringGrid1.Cells[3,RowCnt]; CellE := StringGrid1.Cells[4,RowCnt]; Str := Format('%s,%s,%s,%s,%s'[CellA,CellB,CellC,CellD,CellE]); // ↑この辺りが怪しいと思っています。 WriteLn (F,Str); Inc(RowCNT); end; finally CloseFile(F); end; end;

  • クラスの記述を別ファイルに・・・

    VS2005でASP.NET Webサイトの開発を行っています。 新規作成時に生成される"Default.aspx.vb"に以下のようなコードを記述しました。 1 : Imports System 2 : 3 : Partial Class _Default 4 : Inherits System.Web.UI.Page 5 : 6 : Dim objX = New Space1.Class1 7 : 8 : Dim X = objX.method1(10, 2) 9 : 10 : Dim Y = objX.method2(10, 2) 11 : 12 : End Class 13 : 14 : Namespace Space1 15 : Class Class1 16 : Public Function Method1(ByVal X1 As Integer, ByVal X2 As Integer) As Integer 17 : Dim X3 As Integer 18 : X3 = X1 + X2 19 : Return X3 20 : End Function 21 : 22 : Public Function Method2(ByVal Y1 As Integer, ByVal Y2 As Integer) As Integer 23 : Dim Y3 As Integer 24 : 25 : Y3 = Y1 - Y2 26 : Return Y3 27 : End Function 28 : End Class 29 : End Namespace そこで、15行目以降にある"Class1"なのですが、 よく使用するクラスなので、15~29行目のコードを別のファイルに 記述したいと思っています。(例えば"AAA.vb"とかに) しかし、15~29行目を別ファイル(AAA.vb)に記述した途端、 "Default.aspx.vb"の6行目でSpace1.Class1が宣言されてない。 というエラーが生じます。 このようにクラスの記述部を別ファイルにした場合、 Default.aspx.vbでうまくインクルード(レガシーASPの言い方ですが) させるには、 どうすればよろしいのでしょうか?

  • プログラムを補って下さい(swing)

    下記のプログラムで実装できない所がありますので補える方は教えてください 1.チェックボックスで削除を選択した、行番号をコンソールに表示したい。 2.コンボボックスで選択されたコンボボックスの文字列と選択されたコンボボックス   のインデックス番号が知りたい 以上です。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.Class; import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableModel; public class JTableSample1 implements ActionListener{ JComboBox comboBox; public static void main(String[] args) { new JTableSample1().init(); } public void init() { String[] title = { "削除", "String", "Integer", "JComboBox" }; String prompt = "選んで下さい"; Object[][] records = { { Boolean.FALSE, "Rachel Green", new Integer(1970), prompt }, { Boolean.FALSE, "Monica Geller", new Integer(1969), prompt }, { Boolean.FALSE, "Phoebe Buffay", new Integer(1967), prompt }, { Boolean.FALSE, "Joey Tribbiani", new Integer(1967), prompt }, { Boolean.FALSE, "Chandler Bing", new Integer(1968), prompt }, { Boolean.FALSE, "Ross Geller", new Integer(1967), prompt } }; TableModel model = new DefaultTableModel(records, title) { public Class<?> getColumnClass(int column) { return getValueAt(0, column).getClass(); } }; JTable table = new JTable(model); comboBox = new JComboBox(); comboBox.addItem("ごはん食べてる"); comboBox.addItem("テレビみてる"); comboBox.addItem("仕事してる"); comboBox.addItem("寝てる"); TableCellEditor editor = new DefaultCellEditor(comboBox); table.getColumnModel().getColumn(3).setCellEditor(editor); JFrame frame = new JFrame("Joey Table"); frame.getContentPane().add(new JScrollPane(table)); frame.setSize(640, 240); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { System.out.println("選択されたコンボボックス:"+(String)comboBox.getSelectedItem()); System.out.println("選択されたコンボボックスのインデックス番号:"+comboBox.getSelectedIndex()); } }

    • ベストアンサー
    • Java
  • DLLサンプルプログラムが動きません

    Delphi XE5 starter で、 http://www39.atwiki.jp/kgh07155/pages/28.html を参考にして以下のようなプログラムを作りました。 コンパイルはできたのですが、Button1をクリックすると「TDllFormリソースが見つかりません」というエラーメッセージが出ます。 どういう風に修正すればいいのでしょうか? //***************************** //SamoleUnit2.pasの内容 unit Unit_Sample2; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} function ShowDLLForm(hOwner: HWND): TModalResult; stdcall; external 'DLLSample.dll'; procedure ShowDLLForm2; external 'DLLSample.dll'; // ここまで、DLLを呼び出すための記述。 procedure TForm1.Button1Click(Sender: TObject); begin ShowDLLForm(Application.Handle); // DLL側でフォームを作成した後、 // 通常のフォームのShowModalメソッドと同じ動作をして // 作成したフォームを破棄。 end; procedure TForm1.Button2Click(Sender: TObject); begin ShowDLLForm2; // DLL側でフォームを作成した後、 // 作成したフォームを表示。 end; end. //******************************** //DllSample.dprの内容 library DLLSample; uses System.SysUtils, System.Classes, Windows, Forms, Controls, Unit_DLLForm in 'Unit_DLLForm.pas' {Form1}, Unit_Sample2 in 'Unit_Sample2.pas' {Form2}; type TDllForm = class(TForm) end; {$R *.res} function ShowDLLForm(hOwner: HWND): TModalResult; stdcall; var DllForm:TDllForm; begin Application.Handle := hOwner; // 呼び出し元の情報をDLL側が受け取る。 DllForm := TDllForm.Create(Application); // DLL側でフォームを作成する。 // フォームに配置された各オブジェクトも、自動で作成される。 Result := DllForm.ShowModal; // 返し値を設定。 DllForm.Free; // DLL側で作成したフォームを破棄。 Application.Handle := 0; // 呼び出し元の情報を破棄。 end; procedure ShowDLLForm2; var DllForm:TDllForm; begin DllForm := TDllForm.Create(Application); // DLL側でフォームを作成する。 DllForm.Show; // 作成したフォームを表示。 end; exports ShowDLLForm, ShowDLLForm2; begin end. //******************************** //unit_DLLForm.pasの内容 unit Unit_DLLForm; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} end.

  • Double,Longをファイルに書き込み

    以下のように、Double,Longをファイルに書き込もうとした場合、どのようにキャストをすればよろしいのでしょうか? (String)でString型への変換や Integer.parseInt等を試したのですが、できませんでした。よろしくお願いします。 import java.io.*; class test { public static void main(String[] args) { double dNumber = 3.45; long lNumber = 12345; BufferedWriter bw = new BufferedWriter(new FileWriter("test.txt")); bw.write(dNumber); bw.write(lNumber); } //end main } //end class

    • ベストアンサー
    • Java

専門家に質問してみよう