IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Tstringgrid fonction save


Sujet :

Delphi

  1. #1
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2025
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2025
    Messages : 16
    Par défaut Tstringgrid fonction save
    bonjour a toutes et tous, ayant recréer mon carnet d'adresse avec deux stringgrid que ai nommé grid1 et grid2 j'ai réussi a retrouvé plusieurs fonction correspondant a mon F1book d'avant, mais je ne trouve pas comment utiliser correctement les deux fonction qu'il me manque, j'utilise un fichier book.xls mais sans excel, ma question est:

    1) j'arrive bien a ouvrir mon fichier book.xls mais comment enregistré les modifications que je note dans mon stringgrid1 """" grid1.save " book.xls" """


    2) seconde fonction qu'il me manque j'ai écrit cela :
    très certainement maladroit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    procedure TForm1.AjouterClick(Sender: TObject);
      var
      i: Integer;
    begin
     
    // avec cette fonction je supprime la ligne selectionnée sans souci
    { for i := grid1.Row to Grid1.RowCount - 1 do
    Grid1.Rows[i] := Grid1.Rows[i + 1] ;         
    Grid1.RowCount := Grid1.RowCount - 1 ;}
     
    //////////   ici je voudrai ajouter une ligne vide a partir de la rows sélectionnée ////////////
     
     for i := grid1.Row to Grid1.RowCount - 1 do
     
      Grid1.RowCount := grid1.Row;
      Grid1.Rows[i] := Grid1.Rows[i+1] ;           // ajoute bien une ligne mais supprime tout avant ?
      Grid1.RowCount := Grid1.RowCount +1 ;
     // Grid1.Cells[1, grid1.rowcount] := edit1.Text; // ajoute le text de edit1
    comment puis-je faire ma boucle insérer une ligne à partir de ma rows sélectionné
    même vide pas besoin du texte a ce niveau
    grid1.rows[grid1.rows +1];pouvez vous m'aider s'il vous plait merci

    Alain

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 999
    Par défaut
    Il faudrait avoir la fonction de Lecture pour proposer l'équivalent en écriture

    Si c'est un fichier XLS, est-ce par OLE que la lecture est faite ?



    Pour la seconde question, soyez plus clair
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2025
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2025
    Messages : 16
    Par défaut
    bonjour ,
    Citation Envoyé par ShaiLeTroll Voir le message
    Il faudrait avoir la fonction de Lecture pour proposer l'équivalent en écriture
    Si c'est un fichier XLS, est-ce par OLE que la lecture est faite ?
    ha oui vous avez raison de préciser car les fonction que ai utiliser jusqu'à maintenant enregistre bien un fichier mais je ne peut plus l'ouvrir avec ma fonction après
    la fonction utiliser pour ouvrir mon fichier book.xls est celle la qui fonctionne a merveille:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    procedure TForm1.openClick(Sender: TObject);
    var
      i, j, k: Integer;
      tab: TTabSheet;
      grid: TStringGrid;
      sheet: TSpreadSheet;
      Value: Variant;
      f,g: string;
     
      xlsEngine: TCustomMSExcel;
    begin
     ExtractFilePath(paramstr(0));
    f:='book.xls';
    g:='dxcc.xls';
      if (UpperCase(ExtractFileExt(f)) = '.XLSX') then
        xlsEngine := TMSExcelX.Create(Self)
      else
        xlsEngine := TMSExcel.Create(Self);
      with xlsEngine do
        try
          LoadFromFile(f);
     
          for k := 0 to Sheets.Count-1 do
          begin
            sheet := Sheets.SpreadSheet(k);
            if Assigned(sheet) then
            begin
     
            grid1.RowCount := sheet.Cells.UsedRowCount+1;
            grid1.ColCount := sheet.Cells.UsedColCount+1;
     
              for i := 1 to sheet.Cells.UsedRowCount+1 do
              begin
                  for j := 1 to sheet.Cells.UsedColCount+1 do
                  begin
                    Value := sheet.Cells.GetValue(j-1, i-1);
                    if (VarType(Value) = varBoolean) then
                    begin
                      if Value then
                        grid1.Cells[j, i] := 'True'
                      else
                        grid1.Cells[j, i] := 'False'
                    end
                    else
                      grid1.Cells[j, i] := VarToStr(Value);
                  end;
              end;
            end
          end
        finally
          Free
        end;
    cordialement Alain


    Pour la seconde question, soyez plus clair
    dans mon stringgrid1 je voudrais insérer une ligne a partir de l'endroit où j'ai cliqué si avec ma souris je sélectionne la rows 33 je souhaite inserer une ligne vide entre la ligne 32 et 33 qui deviendrait la ligne 34 etc...
    cordialement Alain

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 999
    Par défaut
    Autant faire des fonctions réutilisables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class procedure TForm1.DeleteRow(AStringGrid: TStringGrid; ARow: Integer);
    var
      Row: Integer;
    begin
      if (AStringGrid.FixedRows <= ARow) and (ARow < AStringGrid.RowCount) then
      begin
        for Row := ARow + 1 to AStringGrid.RowCount - 1 do
          AStringGrid.Rows[Row - 1] := AStringGrid.Rows[Row];
     
        AStringGrid.RowCount := AStringGrid.RowCount - 1;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class procedure TForm1.InsertRow(AStringGrid: TStringGrid; ARow: Integer);
    var
      Row: Integer;
    begin
      if (AStringGrid.FixedRows <= ARow) and (ARow < AStringGrid.RowCount) then
      begin
        AStringGrid.RowCount := AStringGrid.RowCount + 1;
     
        for Row := AStringGrid.RowCount - 1 downto ARow + 1 do
          AStringGrid.Rows[Row] := AStringGrid.Rows[Row - 1];
     
        AStringGrid.Rows[ARow].Clear();
      end;
    end;
    et voici comment les utiliser

    EditRow doit avoir typiquement une valeur entre 1 et RowCount - 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Col, Row: Integer;
    begin
      Row := StrToInt(EditRow.Text);
      InsertRow(StringGrid1, Row);
      if Row >= StringGrid1.FixedRows then
      begin
        //for Col := StringGrid1.FixedCols to StringGrid1.ColCount - 1 do
        //  StringGrid1.Cells[Col, Row] := Format('I: %d - %d', [Col, Row])
        StringGrid1.Cells[1, Row] := Edit1.Text;
      end;
     
     
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      DeleteRow(StringGrid1, StrToInt(EditRow.Text));
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    var
      Col, Row: Integer;
    begin
      CheckBoxDraw.Checked := False;
      for Col := StringGrid1.FixedCols  to StringGrid1.ColCount - 1 do
        for Row := StringGrid1.FixedRows to StringGrid1.RowCount - 1 do
          StringGrid1.Cells[Col, Row] := Format('%d - %d', [Col, Row])
     
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 999
    Par défaut
    Faudrait vraiment utiliser

    Citation Envoyé par alll1 Voir le message
    ha oui vous avez raison de précisé car les fonction que ai utiliser jusqu'à maintenant enregistre bien un fichier mais je ne peut plus l'ouvrir avec ma fonction après
    la fonction utiliser pour ouvrir mon fichier book.xls est celle la qui fonctionne a merveille:

    Vous utilisez TMS Flexcell, je n'ai pas ce composant, je ne l'ai pas utilisé depuis 15 ans

    Pouvez fournir maintenant le code que vous avez tenté d'écrire, c'est la même chose en inverse
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2025
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2025
    Messages : 16
    Par défaut
    bonjour ShaiLeTroll
    Autant faire des fonctions réutilisables
    ha ben oui sa serai effectivement bien c'est ce que j'ai essayer de faire avec ma désignation maladroite
    je vais tester votre solution cet après midi je vous tiendrai au courant

    Alain

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 999
    Par défaut
    Totalement empirique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    procedure TForm1.SaveClick(Sender: TObject);
    var
      Col, Row, i, j, k: Integer;
      tab: TTabSheet;
      grid: TStringGrid;
      sheet: TSpreadSheet;
      Value: Variant;
      f,g: string;
     
      xlsEngine: TCustomMSExcel;
    begin
     ExtractFilePath(paramstr(0));
    f:='book.xls';
    g:='dxcc.xls';
      if (UpperCase(ExtractFileExt(f)) = '.XLSX') then
        xlsEngine := TMSExcelX.Create(Self)
      else
        xlsEngine := TMSExcel.Create(Self);
      with xlsEngine do
        try
          LoadFromFile(f);
     
          for k := 0 to Sheets.Count-1 do
          begin
            sheet := Sheets.SpreadSheet(k);
            if Assigned(sheet) then
            begin
     
              for Row := grid1.FixedRows to grid1.RowCount - 1 do
              begin
                i := Row - grid1.FixedRows;
                  for Col := grid1.FixedCols to grid1.ColCount - 1 do
                  begin
                    j := Col - grid1.FixedCols;
     
                    if grid1.Cells[Col, Row] = 'True' then
                      sheet.Cells.SetValue(j, i, True)
                    else if grid1.Cells[Col, Row] = 'False' then
                      sheet.Cells.SetValue(j, i, False)
                    else
                      sheet.Cells.SetValue(j, i, grid1.Cells[Col, Row])
                  end;
              end;
            end
          end
     
          SaveToFile(f);
        finally
          Free
        end;
    end;
    Sinon SpreadSheet doit être toujours à Zero car une seule page, il y a surement une boucle inutile


    Il faudrait aussi mieux différencier les Col Row du StringGrid qui doivent prendre en compte les FixedCols et FixedRows
    Et les I et J de la Sheet qui doivent être en 0-based
    C'est pour cela que vous avez des +1 et -1 un peu partout
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2025
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2025
    Messages : 16
    Par défaut
    bonjours, ShaiLeTroll

    Totalement empirique
    pour le Save sa fonctionne au poil et je peut ré ouvrir avec mon open file déjà présent sa correspond parfaitement
    et pour l'ajoute d'une ligne ai juste du modifier
    DeleteRow(StringGrid1, StrToInt(EditRow.Text)); // qui me renvoyais un return valeur non entier

    a la place ai mis

    deleteRow(Grid1, grid1.Row); // la row sélectionné carrément géniale

    mes deux problèmes sont résolut avec mes remerciement

    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Design de fonction Save et Load
    Par rockeye dans le forum UML
    Réponses: 8
    Dernier message: 16/07/2008, 09h18
  2. [Embedded function] Problème avec la fonction SAVE
    Par bassemb dans le forum Simulink
    Réponses: 4
    Dernier message: 23/04/2008, 17h24
  3. [DOM] fonction Save CSS
    Par delphine S dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 28/01/2008, 14h52
  4. Sauvegarde de fichier 'fonction save'
    Par sseneor dans le forum MATLAB
    Réponses: 4
    Dernier message: 21/03/2007, 22h52
  5. fonction save()
    Par medtaher dans le forum C++
    Réponses: 1
    Dernier message: 26/10/2005, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo