Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Stringgrid Zeilen füllen (https://www.delphipraxis.net/171920-stringgrid-zeilen-fuellen.html)

Ego 2. Dez 2012 19:57

AW: Stringgrid Zeilen füllen
 
@hoika:
Nein, ich halte es nicht für sinnvoll, zweimal das Array zu durchlaufen. Ist nicht gerade optimal. Jedesmal rowcount um einen erhöhen, wenn es gebraucht wird, klappt besser.
Das gemeine an der Sache ist, daß bei mir in den Probläufen mit der ersten Methode alles klappte, als ich immer nur relativ kurze Arrays mit ca. 10 bis 20 Komponenten benutzte(rowcount wird also 'automatisch' erhöht (bzw. ist vorgegeben) bis wohl 50.)
Deswegen nahm ich an, daß es immer gehen würde. Dann, im Ernstfall mit langen Arrays (> 200) klappte es eben nicht mehr, bei ca. 50 Einträgen war Schluß. Ein ganz böse Falle! Sinnvoller wäre es, wenn bei meiner ersten Methode eine - und nur ein - Zeile gefüllt würde. Dann wüßte man gleich Bescheid.

Recht hast du mit deinem zweiten Eintrag. Das ist auch so eine üble Sache beim Stringgrid, auf die ich schon mal reingefallen bin.

@ helmi:
Danke für den Hinweis, sehr interessant!

Helmi 2. Dez 2012 20:00

AW: Stringgrid Zeilen füllen
 
setz halt
Delphi-Quellcode:
RowCount := high(xyarray) + FixRows
Dann braucht das Array nur einmal durchlaufen

hoika 3. Dez 2012 05:03

AW: Stringgrid Zeilen füllen
 
Hallo,

auch ein guter Ansatz von helmi,
da hier ja die maximale Anzahl bekannt ist.
Dann noch mit BeginUpdate/EndUpdate arbeiten,
und der User bekommt vom Füllen nix mit.

Heiko

Ego 3. Dez 2012 07:10

AW: Stringgrid Zeilen füllen
 
Zitat:

Zitat von Helmi (Beitrag 1194038)
setz halt
Delphi-Quellcode:
RowCount := high(xyarray) + FixRows
Dann braucht das Array nur einmal durchlaufen

Nein, das ist Platzverschwendung; z.B. Array > 200 und nur 15 Einträge werden gebraucht, da mache ich doch kein riesengroßes Stringgrid!

Das, was ich als zweite Methode angegeben habe, ist schon optimal. Mein Problem ist ja nicht: 'Wie mache ich das?' sondern: 'Wieso verhält sich Stringgrid so tückisch, daß Methode 1 teilweise (aber eben nur teilweise!) funktioniert?'

Helmi 3. Dez 2012 07:40

AW: Stringgrid Zeilen füllen
 
Dann zähl halt die notwendigen Zeilen mit

(Pseudocode weil mir grad mein Delphi fehlt)

Delphi-Quellcode:
RowCount := high(xyarray) + FixRows;

j := 0;
for i := low(xyarray) to high(xyarray) do
  begin
    If xyarray[i] = 'text' then
      begin
        inc(j);
        MitIrgendEinerProcedureDasStringGridBefüllen; //hier das Grid befüllen, in der Zeile "j"
      end;
  end;

RowCount := j + FixRows;

Blup 3. Dez 2012 08:18

AW: Stringgrid Zeilen füllen
 
Zitat:

Zitat von Ego (Beitrag 1194065)
Zitat:

Zitat von Helmi (Beitrag 1194038)
setz halt
Delphi-Quellcode:
RowCount := high(xyarray) + FixRows
Dann braucht das Array nur einmal durchlaufen

Nein, das ist Platzverschwendung; z.B. Array > 200 und nur 15 Einträge werden gebraucht, da mache ich doch kein riesengroßes Stringgrid!

Das ist keine Platzverschwendung, Stringvariablen sind im Delphi nur Pointer.
Ein Array mit 200 Einträgen nimmt also ca. 200 * 4Byte in Anspruch.
Die einzelnen Zeilen werden intern auch nur in einem Array gespeichert.
Solange da nichts reingeschrieben wird, braucht man auch nicht mehr Speicher.

Sir Rufo 3. Dez 2012 08:40

AW: Stringgrid Zeilen füllen
 
Zitat:

Zitat von Ego (Beitrag 1194065)
Das, was ich als zweite Methode angegeben habe, ist schon optimal. Mein Problem ist ja nicht: 'Wie mache ich das?' sondern: 'Wieso verhält sich Stringgrid so tückisch, daß Methode 1 teilweise (aber eben nur teilweise!) funktioniert?'

Das StringGrid verhält sich nicht tückisch, sondern du benutzt es nicht as designed.

Du hast ein Verhalten beobachtet und daraus ein Standardverhalten abgeleitet, welches aber nicht zugesichert wird.

Somit bleibt nur die Möglichkeit des ständigen Setzens der Zeilenanzahl (deine Methode 2)

oder

die maximal benötigte Anzahl vor der Schleife setzen, und am Ende die tatsächlich benötigte Anzahl zu setzen. In den meisten Fällen sollte das auch die schnellste Möglichkeit sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 Uhr.
Seite 2 von 2     12   

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