2013-01-04 73 views
-1

我有一個StrinGrid組件和程序:如何將StringGrid行號傳遞給另一個表單?

procedure TForm3.StringGrid1Click(Sender: TObject); 
begin 
    SelectedElement := stringgrid1.Cells[0,stringgrid1.Row]; 
end 

SelectedElement在公共部分聲明:

public 
SelectedElement : String; 
end; 

當我在本機上使用它,例如Label1.Caption := SelectedElement,它工作正常。但在另一個單元中,我在implementation中指定了uses unit1,並且我嘗試使用這個變量,如Label1.Caption := Form1.SelectedElement,它將標籤設置爲空字符串。但是當我手動設置變量例如在第一個表單create時,則該值以第二種形式出現,即使變量稍後從stringgrid更改爲值。

+0

我有一種模糊的感覺,即當您單擊第一個窗體的網格單元格時,您希望第二個窗體上的標籤反映所選元素。它是否正確? –

+0

是的,但它不必等待更改,只顯示通過第一個表格上的按鈕打開第二個表單時選擇的元素 – maciejjo

+0

我無法猜測它爲什麼不起作用。 –

回答

1

你應該將屬性添加到返回所需的值形式:

.... 
private 
    function GetSelectedElement: string; 
public 
    property SelectedElement: string read GetSelectedElement; 
.... 

並實施這樣的:

function TForm3.GetSelectedElement: string; 
begin 
    Result := StringGrid1.Cells[0, StringGrid1.Row]; 
end; 

這將始終返回我相信這是什麼當前狀態你要。

+0

現在,當我讀取第二種形式的值時,它始終將SelectedElement值設置爲第0列0行,而不是所選行;當我以第一種形式閱讀它時,它就起作用了。 – maciejjo

+0

@ user1766392:它可以做到的唯一方法是如果'StringGrid1.Row'確實是0.閱讀'Form2'中的'Form3.SelectedElement'可以正常工作,只要'Form3'指向一個有效的'TForm3'對象開始。 –

+0

@user問問你自己怎麼可能如此。正如雷米所說,你一定在做錯事。 –

2

由於目前顯示的代碼量很小,因此很難確切診斷您的問題,但根據您的意見到目前爲止,聽起來像您可能在運行時動態創建您的對象TForm3,時間使用TForm3.Create(),並且不將該對象分配給全局指針Form3,但嘗試使用全局指針Form3訪問SelectedElement值。那是對的嗎?

此外,您顯示TForm3.StringGrid1Click()設置爲TForm3.SelectedElement,但您訪問Form1.SelectedElement而不是Form3.SelectedElementTForm1有其自己的SelectedElement會員嗎?還是你沒有顯示你真正的項目複製/粘貼真正的代碼?

+1

+1這是我可以相信的唯一解釋匹配陳述的行爲 –

+0

代碼是真實的,Form1沒有它自己的SelectedElement。 Form3是我的主要形式,它通過'Form1:= TForm1.Create(Application);'創建Form1。 'Form1.SelectedElement'是一個錯誤,我將它改爲'Form3.SelectedElement'。 – maciejjo

相關問題