2017-04-18 79 views
0

我使用FMX在Delphi 10.2中做了一個非常簡單的測試項目。 設置很簡單:FMX.TGrid如何讓用戶移動列而不搞亂數據

  • TGrid綁定到TClientDataSet(在設計器中完成)。
  • 按鈕,允許用戶打開一個XML文件

這一切工作正常和TGrid填充了XML文件中的所有記錄。 XML文件由另一箇舊項目的TClientDataSet創建。

現在的問題。
當我將一列移動到另一個位置時,所有數據都會混亂。我只需在列上按住鼠標並將其拖動到右側幾列即可完成此操作。
起初它看起來很好,但是當你開始垂直滾動時,似乎數據不再在正確的列中。
我感覺它只能糾正網格視覺部分的數據,並且一旦開始滾動,數據就不再處於正確的列中。

這是一個已知的錯誤還是我的項目有問題。
正如我之前所說,這個項目中絕對沒有任何代碼都是在設計器中完成的。 (除了offcourse的clientdataset1.LoadFromFile)

+0

說到FMX,由於過去幾年的許多變化,正確地指出Delphi版本非常重要。在你的文字中,你會談論* XE 10 *,它不存在。在你選擇'delphi-xe'的標籤中沒有FMX。所以,請編輯你的q並進行必要的更正。 –

+0

@TomBrunberg我沒有這個delphi在這裏,所以我不能現在檢查哪個版本。但是它是我在開始時看到的XE10。所以我很困惑。 – GuidoG

+0

@TomBrunberg我打電話給我的同事,這個德爾福它似乎是XE10.2 – GuidoG

回答

1

這個固定爲了我。 我只是移動在ClientDataSet中移動到網格中的字段,並且到目前爲止它似乎工作。

procedure TForm1.Grid1ColumnMoved(Column: TColumn; FromIndex, ToIndex: Integer); 
var 
    FieldFrom : string; 
    FieldTo : string; 
begin 
    FieldFrom := Grid1.ColumnByIndex(FromIndex).Header; 
    FieldTo := Grid1.ColumnByIndex(ToIndex).Header; 

    ClientDataSet1.FieldByName(FieldFrom).Index := FromIndex; 
    ClientDataSet1.FieldByName(FieldTo).Index := ToIndex; 
end; 

但我只是希望有一個更好的方式知道從TColumn哪個字段名參與。似乎這個班級最重要的信息是缺少的。

1

您可以嘗試手動填充您的數據(Grid: TGrid; CDS: TClientDataSet):

procedure TForm1.FormCreate(Sender: TObject); 
var 
    I: Integer; 
    Col: TColumn; 
begin 
    CDS.Active := True; 
    for I := 0 to CDS.FieldDefs.Count - 1 do begin 
    Col := TColumn.Create(Grid); 
    Grid.AddObject(Col); 
    Col.Header := CDS.FieldDefs[I].Name; 
    Col.Tag := I; 
    end; 
    Grid.RowCount := CDS.RecordCount; 
end; 

procedure TForm1.GridGetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue); 
begin 
    CDS.First; 
    CDS.MoveBy(ARow); 
    Value := CDS.Fields[ACol].Text; 
end; 

並在此之後,你可以用我的列的解決方案:stackoverflow.com/q/43418528/2292722

+0

你的解決方案將工作,但我找到了一種方法來解決它,並繼續使用綁定,所以我會堅持。謝謝 – GuidoG