Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Im Stringgrid oben eine neue Zeile einfügen (https://www.delphipraxis.net/50731-im-stringgrid-oben-eine-neue-zeile-einfuegen.html)

Hallo_Thomas 30. Jul 2005 18:08


Im Stringgrid oben eine neue Zeile einfügen
 
Hallo, ich füge mit

Delphi-Quellcode:
StringGrid1.Cells[Spalte,0] := IntToStr(Zahl);
eine Zahl hinzu, diese sollte bei der nächsten Eingabe um eine Zeile nach unten rutschen.

Ich dachte da, das man da am besten oben eine neue Zeile einfügt oder so?

Wie kann ich Position 0 eine Zeile einfügen bzw, das alle Zahlen um eine Zeile nach unten rutschen am effizentesen umsetzen.

yankee 30. Jul 2005 18:14

Re: Im Stringgrid oben eine neue Zeile einfügen
 
ungetestet:
Delphi-Quellcode:
procedure insertGridLine(Grid :TStringGrid; index: integer);
var i:integer;
begin
    Grid.RowCount :=Grid.RowCount +1;
    for i :=Grid.RowCount -2 downto index do
    begin
        Grid.Rows[i] :=Grid.Rows[i-1];
    end;
end;

Hallo_Thomas 30. Jul 2005 18:59

Re: Im Stringgrid oben eine neue Zeile einfügen
 
Fast perfekt, Danke, hat echt weiter geholfen!

getestet
Delphi-Quellcode:
procedure TForm1.insertGridLine(Grid :TStringGrid; index: integer);
var i:integer;
begin
    Grid.RowCount :=Grid.RowCount +1;
    for i :=Grid.RowCount -2 downto index do
    begin
        Grid.Rows[i] :=Grid.Rows[i-1];
        Grid.Rows[i-1].clear;
    end;
end;

marabu 30. Jul 2005 19:33

Re: Im Stringgrid oben eine neue Zeile einfügen
 
Was haltet ihr von diesem Code?

Delphi-Quellcode:
procedure TDemoForm.InsertRow(iRow: integer);
var
  i: integer;
begin
  with StringGrid do begin
    if iRow < FixedRows then
      raise Exception.Create('you cannot insert a fixed row');
    RowCount := RowCount + 1;
    for i := RowCount - 1 downto Succ(iRow) do
      Rows[i].Assign(Rows[i-1]);
    Rows[iRow].Clear;
  end;
end;
Grüße vom marabu

yankee 30. Jul 2005 19:38

Re: Im Stringgrid oben eine neue Zeile einfügen
 
@marabu:
doofes Codedesign, für den Zweck zu komplex und generell nicht so übersichtlich.
Außerdem haben wir die Lösung längst...

EDIT: sry, war nicht böse gemeint.

Sharky 30. Jul 2005 19:44

Re: Im Stringgrid oben eine neue Zeile einfügen
 
Hai yankee,

Bitte etwas höflicher in der DP! Danke.

marabu 30. Jul 2005 21:17

Re: Im Stringgrid oben eine neue Zeile einfügen
 
Hallo yankee,

Zitat:

Zitat von yankee
Außerdem haben wir die Lösung längst...

warum habt ihr die Lösung denn nicht in diesem thread gepostet und lasst weiter euren fehlerhaften Code stehen?

Nachdenkliche Grüße vom marabu

yankee 30. Jul 2005 22:51

Re: Im Stringgrid oben eine neue Zeile einfügen
 
Zitat:

Zitat von marabu
warum habt ihr die Lösung denn nicht in diesem thread gepostet und lasst weiter euren fehlerhaften Code stehen?

Nachdenkliche Grüße vom marabu

Welchen fehlerhaften code? Es funzt doch alles, wir sind doch alle glücklich!

marabu 31. Jul 2005 08:50

Re: Im Stringgrid oben eine neue Zeile einfügen
 
Hallo yankee,

Thomas hat deinen Code in eine procedure of object verwandelt. Das bei deinem Code fehlende Leeren der neu eingefügten Zeile hat er unglücklicherweise in die Schleife gepackt - es gehört dahinter, was aber lediglich die Performanz beeinträchtigt und keinen zusätzlichen Fehler darstellt.
In deinem Code befinden sich 3 Fehler unterschiedlicher Fehlerklassen. Der erste Fehler ist, dass du eventuell vorhandene FixedRows nicht berücksichtigst. Der zweite Fehler ist, dass du für das Kopieren der Zeileninhalte copy by assignment verwendest - reine Glückssache, dass es funktioniert. Normalerweise würdest du auf diese Weise ein Speicherleck schaffen, aber so verletzt du nur das black box Prinzip. Der dritte und letzte Fehler ist gravierend. Durch eine falsche Indizierung vernichtest du den Inhalt der letzten Zeile.

Ich wollte euch beide durch meinen ersten Beitrag nur zum Nachdenken anregen. Das hat offenbar nicht funktioniert. Schade.

Freundliche Grüße vom marabu

yankee 31. Jul 2005 10:07

Re: Im Stringgrid oben eine neue Zeile einfügen
 
Ok, das mit dem clear ist rihtig...
mit den FixedRows: das kann ja auch absicht sein die zu verschieben. Und er hat in seinem Beispiel ja 0 genommen. Daher habe ich das mal weggelassen.

das mit dem copy by assignment: Interessiert mich jetzt aber mal. Warum ist das Glückssache? Und was macht assign anders?

Den Fehler mit der indizierung muss ich wohl einsehen. Es ist eben -1 und nicht -2.

marabu 31. Jul 2005 10:47

Re: Im Stringgrid oben eine neue Zeile einfügen
 
Hallo yankee,

die Signatur deiner Funktion InsertGridLine() zeigt mir, dass du dir schon etwas mehr Gedanken als ein Anfänger machst. Durch die von dir gewählte Signatur erhöhst du die Wiederverwendbarkeit beträchtlich. Ist doch schade, wenn du dann bei der Implementierung nur die Minimalanforderung von Thomas umsetzt. Deswegen mein Hinweis auf die FixedRows.

Ich glaube ja nicht, dass du vor dem Schreiben deiner Schleife den Quellcode von der Komponente analysiert hast. Solange der accessor für die array property Rows aber TStrings zurückliefert, musst du nach dem black box Prinzip die für das Kopieren vorgesehene Methode Assign() verwenden. Wäre jetzt eine Row wirklich eine Komponente der Klasse TStrings, dann würdest du Zeiger kopieren, wobei der Zeiger auf die letzte Row vernichtet würde und der Zeiger auf die neue Zeile identisch mit dem der Zeile darüber wäre - oder? Ergebnis wäre ein Speicherleck und eine Doppelreferenz der Zeilen index und Succ(index) auf die gleichen Daten. Passiert aber nicht, weil intern die Spaltenwerte erst beim Zugriff zu einer StringList zusammen gezogen werden. Auch der Schreibzugriff ist etwas komplexer als eine bloße Zeigerzuweisung. Also sage ich "Glück gehabt", aber es gilt ja auch "Glück hat nur der Tüchtige" und dann bist du ja auf dem richtigen Weg.

Sonntagsgrüße vom marabu

Hallo_Thomas 31. Jul 2005 11:40

Re: Im Stringgrid oben eine neue Zeile einfügen
 
@marabu sieht das nicht schon besser aus, für meine Minimalanforderung:


Ich hab jetzt mal versucht die Hinweise umzusetzen, sieht doch besser aus!!

Delphi-Quellcode:
procedure TForm1.insertGridLine(Grid :TStringGrid; index: integer);
var i:integer;
begin
  Grid.RowCount :=Grid.RowCount +1;
  for i :=Grid.RowCount -1 downto index do
  begin
    Grid.Rows[i].Assign(Grid.Rows[i-1]);
    Grid.Rows[i-1].clear;
  end;
end;

marabu 31. Jul 2005 12:06

Re: Im Stringgrid oben eine neue Zeile einfügen
 
Hallo Thomas,

durch das Clear() in der Schleife löschst du alle Spaltenwerte, nachdem du sie in die nächste Zeile kopiert hast - nur um die geleerten Zellen im nächsten Schritt mit den Werten einer anderen Zeile zu überschreiben. Meinst du nicht, es würde ein Row[index].Clear außerhalb der Schleife genügen?

marabu

PS: Und schau dir den Laufbereich für dein i nochmal genau an... (vergleiche mal mit meinem Code)

Sharky 31. Jul 2005 17:02

Re: Im Stringgrid oben eine neue Zeile einfügen
 
Hai ihr lieben,

ich kann und möchte jetzt nichtst zu der Frage von H_Thomas sagen ;-)

Mir geht es mehr um das "miteinander". Es ist nich immer leicht etwas so zu sagen/schreiben wie man es eigentlich meint.

Darum ja auch meine kleine Kritik an yankee doch bitte etwas höflicher zu sein.
Andererseits könnte die Wortwahl in diesem Thread auch dazu führen das sich jemand als person angegriffen fühlte.

Als DP-Hai möchte ich euch jetzt nur um eines bitten ->

Versucht immer die Aussagen von anderen Usern so zu sehen das sie nie persönlich gegen euch gerichtet sind.
Und auch bei der "Bewertung" von den Code-Beispielen sollte man zurückhaltend sein!

Kritik, im konstruktieven sinne, ist sicher immer erlaubt und auch gewünscht.

Ein Vorschlag von mir *blubb*

Sammelt eure Erkentnisse aus diesem Thread um macht daraus einen Beitrag in der Code-Library. :-D

Naja, meine Linksschreibung ist leider auch nicht besser geworden.

saschi35 5. Sep 2013 09:34

AW: Im Stringgrid oben eine neue Zeile einfügen
 
HALLO ich habe eine Frage,

ich habe ein stringgrid erstellt, dieses füllt sich nach eingabe meiner edits und mit dem abschluss durch klicken auf einen button.

Beispiel:

NAME ORT DATUM
HALLO HALLO HALLO
.... ..... .....

wie kann ich beim nächsten klick auf den Button nach unten rutschen, sprich der 2 eintrag steht unter dem ersten oder noch besser wäre der 2 eintrag steht über dem 1.

Vielen Dank

Derzeit habe ich es so stehen, aber es funktioniert nicht:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.visible:= true;

//EINGABEN IN LISTE ANZEIGEN//
stringgrid1.cells[1,1]:= e_name.Text;
stringgrid1.cells[2,1]:= e_ort.Text;
stringgrid1.cells[3,1]:= e_stra.Text;
stringgrid1.cells[4,1]:= e_stich.Text;
stringgrid1.cells[5,1]:= e_anz.Text;


stringgrid1.RowCount := stringgrid1.RowCount + 1;

bcvs 5. Sep 2013 11:24

AW: Im Stringgrid oben eine neue Zeile einfügen
 
Zitat:

stringgrid1.cells[1,1]:= e_name.Text;
stringgrid1.cells[2,1]:= e_ort.Text;
stringgrid1.cells[3,1]:= e_stra.Text;
stringgrid1.cells[4,1]:= e_stich.Text;
stringgrid1.cells[5,1]:= e_anz.Text;
Überleg mal: Wofür steht denn die 1 nach dem Komma bei cells[1,1]?

Wenn du immer in die erste Zeile schreibst, wirst due den zweiten Eintrag nie unter den ersten bekommen.

Um einen neuen Eintrag in die erste Zeile zu bekommen und die vorhanden Einträge nach unten zu verschieben musst due eine eigene Routine schreiben, die RowCount erhöht und die Zellinhalte nach unen kopiert.

mkinzler 5. Sep 2013 11:27

AW: Im Stringgrid oben eine neue Zeile einfügen
 
Man sollte halt Anzeigekomponenten nicht zur Datenspeicherung missbrauchen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz