2017-01-04 1 views
1

Iam ayant un stringGrid, les champs de la première ligne proviennent de CSV et dans la deuxième ligne sont les noms de colonnes d'une table dans DB.Delphi enregistrer les données dans StringGrid au fichier JSON

Maintenant, après, cliquez sur Enregistrer BTN il devrait me créer un fichier JSON comme ci-dessous

{ 
"GHARGA": "GHARGA", 
"SELLINGPRICE1": "SELLPRICE1", 
"SELLPRICE2": "SELLPRICE2", 
"SELLPRICE3": "SELLPRICE3", 
"PCODE": "PCODE" 
} 

J'ai essayé comme ceci:

procedure TfrmMapping.btnsaveClick(Sender: TObject); 
var 
    Dat1: TStringList; 
    i: Integer; 
    lJsonObj: TJSONObject; 
begin 
    lJsonObj := TJSONObject.Create; 

    Dat1 := TStringList.Create; 

    if btnsave.Caption = 'Save' then 
    begin 
    for i := 0 to StrGrdCsv.RowCount - 1 do 
    begin 
    Dat1.AddStrings(StrGrdCsv.Rows[i]); 
    end; 

    for i := Dat1.Count - 1 Downto StrGrdCsv.ColCount do 
    begin 
     lJsonObj.AddPair(TJSONPair.Create(TJSONString.Create(Dat1.Strings[i]), 
     TJSONString.Create(Dat1.Strings[i]))); 
    end; 

    TFile.WriteAllText(cmbBXDBTables.Text + '.json', lJsonObj.ToString); 
    btnsave.Caption := 'Load Data'; 
     end; 
     end; 

mais il crée comme

{ 
    "GHARGA": "GHARGA", 
    "SELLPRICE1": "SELLPRICE1", 
    "SELLPRICE2": "SELLPRICE2", 
    "SELLPRICE3": "SELLPRICE3", 
    "PCODE": "PCODE" 
    } 
+0

Avez-vous lu le code? Regardez ce que vous passez à AddPair. De toute façon, vous n'avez pas besoin d'une liste de chaînes temporaires. C'est juste pour vous dérouter. Lisez les données directement à partir de la grille de chaînes. –

+0

@DavidHeffernan, je lis le code, vous dites changer la déclaration comme 'lJsonObj.AddPair (TJSONPair.Create (TJSONString.Create (StrGrdCsv.Rows [1] .ToString), TJSONString.Create (StrGrdCsv.Rows [2] .ToString))); ' – userhi

+2

Vous semblez obsédé par la propriété Rows. Vous pouvez lire des cellules individuelles. Et l'indexation est basée sur zéro. –

Répondre

2

Modifié le code selon les suggestions de @DavidHeffemann et @RemyLeebeau

procedure TfrmMapping.btnsaveClick(Sender: TObject); 
var 
    i: Integer; 
    lJsonObj: TJSONObject; 
begin 
    lJsonObj := TJSONObject.Create; 

    if btnsave.Caption = 'Save' then 
    begin 
    for i := 0 to StrGrdCsv.ColCount do 
    begin 
     lJsonObj.AddPair(StrGrdCsv.Cells[i, 0], StrGrdCsv.Cells[i, 1]); 
    end; 
    TFile.WriteAllText(cmbBXDBTables.Text + '.json', lJsonObj.ToString); 
    btnsave.Caption := 'Load Data'; 
    end; 
end; 

Modifié la boucle For et l'a fait fonctionner à l'aide de Cells of String Grid.

Merci, @DavidHeffemann et @RemyLeebeau pour vos suggestions.