Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 01:50 Uhr.
Seite 2 von 2     12   

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