AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

hat TStringgrig eine innere Größenbeschränkung?

Ein Thema von p80286 · begonnen am 15. Sep 2010 · letzter Beitrag vom 17. Sep 2010
Antwort Antwort
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

AW: hat TStringgrig eine innere Größenbeschränkung?

  Alt 16. Sep 2010, 16:22
fastMM war eine gute Empfehlung. Da ist prompt eine Schusseligkeit in einer alten Unit hochgekommen, aber der Fehler bleibt.
Ich hab es mal mit
Delphi-Quellcode:
for i:=0 to maxint do
  stringgrid1.cells[0,i]:=inttohex(i,8);
versucht.
Das läuft, wie zu erwarten, vor die Speicherwand. Es sieht so aus, als würde der Fehler durch eine bestimmte Kombination aus Daten/Satznummer verursacht.
Mal weiter testen, vielleicht finde ich noch etwas.

Edith:
Jetzt ist der Cursor zum ersten Mal im Sourcecode zu sehen gewesen. Könnt Ihr mit dieser Routine etwas anfangen?
Delphi-Quellcode:
unit Grids


function TSparsePointerArray.MakeAt(Index: Integer): PPointer;
var
  dirP: PSecDir;
  p: Pointer;
  byteP: PChar;
  secIndex: Word;
begin
  { Expand Section Directory if necessary. }
  secIndex := Index shr secShift; { Unsigned shift }
  if secIndex >= slotsInDir then
    dirP := expandDir(secDir, slotsInDir, secIndex + 1)
  else
    dirP := secDir;

  { Index into Section Directory using high order part of
    index.  Get pointer to Section. If null, create new
    Section.  Index into Section using low order part of index. }

  secDir := dirP;
  p := dirP^[secIndex];{------------------------------ hier stet der Cursor !!!!!
  if p = nil then begin
    p := makeSec(secIndex, FSectionSize);
    dirP^[secIndex] := p
  end;
  byteP := p;
  Inc(byteP, (Index and indexMask) * SizeOf(Pointer));
  if Index > FHighBound then
    FHighBound := Index;
  Result := PPointer(byteP);
  cachedIndex := -1
end;
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

AW: hat TStringgrig eine innere Größenbeschränkung?

  Alt 16. Sep 2010, 17:02
Delphi-Quellcode:
for i:=0 to maxint do
  stringgrid1.cells[0,i]:=inttohex(i,8);
Das läuft, wie zu erwarten, vor die Speicherwand
maxint ist gleich 2147483647
Das ist eine völlig andere Größenordnung als ~300000.

Zitat von p80286:
kann ich Rowcount auch erst zum bitteren Ende setzen?
Die OH war da nicht so eindeutig, und die Praxis schein nicht dagegen zu sprechen.
Nein, RowCount muss gesetzt werden bevor die Zellen mit Daten befüllt werden.

Also ein Stringgrid mit 300000 Zeilen ist eigentlich "gar kein Problem":
Delphi-Quellcode:
var
   i : Integer;
begin
   StringGrid1.RowCount := 300000; // VORHER setzen !
   for i := 1 to StringGrid1.RowCount-1 do
      StringGrid1.Cells[1, i] := IntToStr(i);
end;
Die Schleife braucht zwar ~4 Minuten bis sie fertig ist,
aber Anzeigen und Scrollen funktioniert.
Interessanterweise dauert das Beenden des Programms ca 1,5 Minuten;
im Hintergrund werden wohl einige Hunderttausende Windows-Botschaften verschickt
und das braucht Zeit.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: hat TStringgrig eine innere Größenbeschränkung?

  Alt 16. Sep 2010, 17:45
Also ein Stringgrid mit 300000 Zeilen ist eigentlich "gar kein Problem":
Keine Einwände.

Interessanterweise dauert das Beenden des Programms ca 1,5 Minuten;
im Hintergrund werden wohl einige Hunderttausende Windows-Botschaften verschickt
und das braucht Zeit.
Ich würde das auf's "Speicheraufräumen" schieben, so ca. ein Gig muß ja schließlich ordentlich entsorgt werden.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#4

AW: hat TStringgrig eine innere Größenbeschränkung?

  Alt 16. Sep 2010, 19:24
Also die Hinweise zusammengeworfen, (wenn schon die ganze Datenbank eingelesen und angezeigt werden muss) würde es am meisten Sinn machen, die Daten in einen schnellen "Container" einzulesen.

Also Daten erst in ein passendes dyn. Array einlesen und über eine simple Funktion die Werte für die jeweilige Zeile/Spalte bereitstellen (ist im Ausgangspost ja quasi schon vorhanden)
function GetDatabaseArrayValue(ACol, ARow): String; .

Nach dem Einlesen ist RowCount bekannt und kann im StringGrid gesetzt werden. Das StringGrid wird jetzt nicht gefüllt sonder wie mkinzler vorgeschlagen hat, nur der sichtbare Bereich via DrawCell angezeigt (Beispiel mit einer fixed Row):
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject;
  ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);

var
  s : String;
begin
  with (Sender as TStringGrid) do begin

    if gdFixed in State then
      SetTextStyle(Canvas, clBtnFace, clBtnText, [])
    else
    if gdSelected in State then
      SetTextStyle(Canvas, clHighlight, clHighlightText, [])
    else
      SetTextStyle(Canvas, clWindow, clWindowText, []);

    if ARow = 0 then
      s := Cells[Acol,Arow]
    else
      s := GetDatabaseArrayValue(ACol, ARow);

    Canvas.TextRect(Rect,Rect.Left +2,Rect.Top+2, s);
  end;
end;

Geändert von Satty67 (16. Sep 2010 um 19:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: hat TStringgrig eine innere Größenbeschränkung?

  Alt 17. Sep 2010, 11:05
@Satty67
Das wird das beste sein.
Mal sehen was ich damit anfangen kann. Ich würde es so benennen:
"Ein Browserfenster über die Daten gleiten lassen."
Da als alternative Ausgabe Text/TMemo vorhanden ist kann man da gleich Nägel mit Köpfen machen. CopyundPaste bliebe dann zwar auf der Strecke habe ich bisher aber nicht benötigt.

Ich hab mal an der Ausgangsfragestellung weiter gebastelt und würde jetzt "ja" sagen.
(zumindestens bei Stringgrids mit weniger als 512 Cols)
Mein Fehler tritt immer dann auf, wenn das Stringgrid x7FFF80 oder mehr Cells enthalten soll.
egal ob der Eintrag in das Grid über Cells[x,y] oder Rows[y] erfolgt.
bevor es jemand anmerkt, ja RowCount und CellCount waren initialisiert.

Vielen Dank an alle, die sich Ihren Kopf darüber zerbrochen haben.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr.
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