-3

Game1 (メイン) クラスで使用できる別のクラスの関数から変数を取得するのに非常に苦労しています。具体的には、SetWindowSize.cs の SaveData 関数から幅と高さを取得し、Game1.cs の ReadSettings で使用したいと考えています。

エラーが発生します

「ShovelShovel.SetWindowSize」には「高さ」の定義が含まれていません。「幅」についても同様です。

Game1.cs (関数のみ)

protected void ReadSettings()
{
    try
    {
        if (File.Exists(SetWindowSize.savePath))
        {
            using (FileStream fileStream = new FileStream(SetWindowSize.savePath,
                                                          FileMode.Open))
            {
                using (BinaryReader binaryReader = new BinaryReader(fileStream))
                {
                    SetWindowSize.width = binaryReader.ReadInt32();
                    SetWindowSize.height = binaryReader.ReadInt32();
                }
            }
        }
    }
    catch
    {
    }
}

SetWindowSize.cs

namespace ShovelShovel
{
            protected void ReadSettings()
    {
        try
        {
            if (File.Exists(savePath))
            {
                using (FileStream fileStream = new FileStream(savePath, FileMode.Open))
                {
                    using (BinaryReader binaryReader = new BinaryReader(fileStream))
                    {
                        var windowSize = WindowSizeStorage.ReadSettings();

                        WindowSize.Width = windowSize.Width;
                        WindowSize.Height = windowSize.Height;
                    }
                }
            }
        }
        catch
        {
        }
    }

私を助けてくれるすべての人に感謝します。本当に感謝しています。

4

4 に答える 4

1

これはトリックを行うかもしれません:

public class WindowSize
{
    public int Width { get; set; }
    public int Height { get; set; }
}

public static class WindowSizeStorage
{
    public static string savePath = "WindowSize.dat";

    public static WindowSize ReadSettings()
    {   
        var result = new WindowSize();
        using (FileStream fileStream = new FileStream(SetWindowSize.savePath, FileMode.Open))
        {
            using (BinaryReader binaryReader = new BinaryReader(fileStream))
            {
                result.Width = binaryReader.ReadInt32();
                result.Height = binaryReader.ReadInt32();
            }
        }

        return result;
    }

    public static void WriteSettings(WindowSize toSave)
    {
        using (BinaryWriter binaryWriter = new BinaryWriter(File.Open(savePath, FileMode.Create)))
        {
            binaryWriter.Write(toSave.Width);
            binaryWriter.Write(toSave.Height);
        }
    }
}

使用法:

// Read
var windowSize = WindowSizeStorage.ReadSettings();

myForm.Width = windowSize.Width;
myForm.Height = windowSize.Height;

// Write
var windowSize = new WindowSize { Width = myForm.Width, Height = myForm.Height };

WindowSizeStorage.WriteSettings(windowSize);

このような回答を書く (すべてのコードを提示する) ことは、一般的な方法ではないことに注意してください。私はちょうどそれのように感じました。各クラスが独自の処理を行う、オブジェクト指向の設計原則を示してみました。

メソッド間で複雑なオブジェクト (つまり、複数のプリミティブ型) を転送する場合は、通常、 のようなデータ転送オブジェクト (DTO) を作成しますWindowSize

クラスは、そのようなオブジェクトWindowSizeStorageを格納および取得する唯一の責任を負います。WindowSizeコードから、必要な設定を保存または取得するようにストレージに指示するだけです。

しかし、あなたの質問とコメントからわかるように、あなたは C# を使用した経験があまりなく、おそらくプログラミングの経験もまったくありません。自分の考えをコードに反映する方法を理解できるように、チュートリアルを 1 つまたは 2 つ取り上げてみてください。

于 2012-12-10T10:56:36.377 に答える
0

その関数の外部で関数変数にアクセスすることはできません。これらの定義静的変数を実現するには、静的変数に高さと幅を割り当ててから、必要な場所からアクセスします。

于 2012-12-10T10:51:14.890 に答える
0

関数の目的は、変数を格納および公開することではありません。スコープが十分に広くない場合、変数にアクセスできません。あなたの場合、クラスに保存して公開することで、何らかの方法でそれらを公開する必要があります。次に例を示します。

class SetWindowSize
{
    public const string savePath = "file.dat";

    public int width {get; set; }
    public int height {get; set; }

    public static void SaveData(string width, string height)
    {            
        using (BinaryWriter binaryWriter = new BinaryWriter(File.Open(savePath, FileMode.Create)))
        {
            binaryWriter.Write(width);
            binaryWriter.Write(height);
            SetWindowSize.width = width;
            SetWindowSize.height = height;
        }
    }
}
}

これは最適とは言えませんが、機能します。

于 2012-12-10T10:53:55.100 に答える
0

SetWindowSize クラスに、幅または高さのメンバーが含まれていません。それらをプロパティとして追加できます。

public class SetWindowSize
{
// other stuff
public int Height {get;set;}
public int Width {get;set;}
// other stuff
}

その後、SetWindowSize インスタンスを使用してそれらにアクセスできます。

SetWindowSize sws = new SetWindowSize();
sws.Height = 512;
sws.Width = 512;
于 2012-12-10T10:54:03.900 に答える