2016-12-20 5 views
1

私はこの解決策の助けが必要です。 いくつかの形式のアプリケーションがあります。このフォームの1つは、選択したモニターで開く必要があります。例: 解決策1.複数のモニターが使用されている場合は、フォーム作成を行い、最後のモニターを開く場合はフォームを作成します。私はこのコードを試してみたが、運と:デルファイ - 第2のモニタのオープンフォーム

Application.CreateForm(TfrmDashboard, frmDashboard); 
    for I := 0 to Screen.MonitorCount -1 do 
    begin 
    // Checking Screen Position 
    ShowMessageFmt('%d, %d, %d, %d', 
       [Screen.Monitors[i].BoundsRect.Left, 
       Screen.Monitors[i].BoundsRect.Top, 
       Screen.Monitors[i].BoundsRect.Right, 
       Screen.Monitors[i].BoundsRect.Bottom]); 
    end; 

    if Screen.MonitorCount > 1 then 
    begin 
     frmDashboard.Top:= Screen.Monitors[i].BoundsRect.Top; 
     frmDashboard.Top:= Screen.Monitors[i].BoundsRect.Left; 
    end; 

ソリューション2.フォームを選択したモニタおよびOnDestroyイベントトップと左の位置にドラッグされていないINIファイルに書き込まれます。次回は同じモニターと同じ位置にフォームが開きます。私はこのコードを試してみてください、だけでなく、運がないと:

procedure TfrmDashboard.FormCreate(Sender: TObject); 
var 
    ini: TIniFile; 
begin 
    ini:= TIniFile.Create(extractfilepath(paramstr(0))+'Dashboard.ini'); 
    Left:= StrToInt(ini.ReadString('Left', 'Form_Left', '0')); 
    Top:= StrToInt(ini.ReadString('Top', 'Form_Top', '0')); 
    ini.Free; 
end; 

procedure TfrmDashboard.FormDestroy(Sender: TObject); 
var 
    ini: TIniFile; 
begin 
    ini:= TIniFile.Create(extractfilepath(paramstr(0))+'Dashboard.ini'); 
    ini.WriteString('Left', 'Form_Left', IntToStr(Left)); 
    ini.WriteString('Top', 'Form_Top', IntToStr(Top)); 
    ini.Free; 
end; 
+0

INIファイルをアプリケーションと同じディレクトリに作成するときは注意が必要です。たとえば、アプリケーションが\ programファイル内にある場合、Windowsの一部のバージョンでは、iniファイルを保存する一時ディレクトリが作成され、プログラムの終了時に削除されます。つまり、毎回バージンの実装のように見えます。たとえば、レジ​​ストリを使用したり、データを格納したり、ドキュメントディレクトリを使用する方がよいでしょう。技術的な詳細が間違っているかもしれませんが、これが効果です。 – Dsm

+1

'if'ステートメント内のコードの最初のセクションでは、スクリーン[1]がスクリーン[i]でないことを意味します。あなたが使用している時点では、私は定義されておらず、ごみが入っている可能性があります。 – Dsm

答えて

4
frmDashboard.Top:= ... 
frmDashboard.Top:= ... 

これは、単純なコピーペースト・エラーのように見えます。両方の時間をTopに設定します。おそらくあなたは、意味:

frmDashboard.Top:= ... 
frmDashboard.Left:= ... 

このコードは同じ間違いを作る:それは誤った定義になっているとき

if Screen.MonitorCount > 1 then 
begin 
    frmDashboard.Top:= Screen.Monitors[i].BoundsRect.Top; 
    frmDashboard.Top:= Screen.Monitors[i].BoundsRect.Left; 
end; 

さらに、それはiを指します。コンパイラはこれについて警告します。私はコンパイラの警告とヒントを有効にし、それらに注意を払うことを願っています。


INIファイルに無効なデータが含まれている場合、あなたのOnCreateイベントハンドラは、例外が発生します。たとえば、ユーザーが位置の値を非数値に編集した場合、StrToIntは例外を発生させます。あなたのプログラムはそれに耐えられるものでなければなりません。

OnCreateOnDestroyの両方のイベントハンドラは、INIファイルオブジェクトの有効期間を正しく管理しません。 INIファイルへのアクセスが失敗した場合、またはStrToIntへの呼び出しが失敗した場合(上記参照)、オブジェクトがリークします。これは、従うパターンです:

obj := TMyObject.Create; 
try 
    // do things with obj 
finally 
    obj.Free; 
end; 
+0

ありがとうございます。コードを修正しましたが、問題は解決しません。 – Mindaugas

+0

メイン画面/モニタでフォームが引き続き表示されます。 – Mindaugas

+0

@Mindaugas、あなたはループが終了した後に 'i'が使用されることを忘れていました。 –

関連する問題