AGB  ·  Datenschutz  ·  Impressum  







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

StringGrid.RowCount lässt sich nicht ändern

Ein Thema von hsbc · begonnen am 19. Nov 2006 · letzter Beitrag vom 19. Nov 2006
Antwort Antwort
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#1

StringGrid.RowCount lässt sich nicht ändern

  Alt 19. Nov 2006, 09:56
Hallo!

Ich lese mittels FtpFindFirstFile/InternetFindNextFile die einzelnen Einträge einer Server-Datei ein und speichere sie in einem StringGrid. Funktioniert auch alles einwandfrei.

Wenn ich jetzt mit FtpCreateDirectory ein neues Verzeichnis einfüge, so wird dieses auch ordnungsgemäss eingefügt.

NUR: Wenn ich jetzt den Server neu einlese, werden alle bereits vorher gespeicherten Einträge in das StringGrid neu eingetragen, der neu hinzugekommene Eintrag leider nicht mehr. Hier kommt beim Versuch, RowCount um 1 zu erhöhen die Fehlermeldung, dass der Gitterindex von RowCount außerhalb des zulässigen Bereiches liegt. Wie gibt es so etwas ???

Hier noch der dafür verantwortliche Code-Teil:

Delphi-Quellcode:
  for ARow := 1 to Pred(StringGrid.RowCount) do
    StringGrid.Rows[ARow].Clear;

  StringGrid.FixedRows := 1;
  c := StringGrid.FixedRows;

  hSearch := FtpFindFirstFile(hConnect, nil, FindData, INTERNET_FLAG_DONT_CACHE, 0);
  if hSearch <> nil then
  repeat
    if (c >= StringGrid.RowCount) then StringGrid.RowCount := c + 1; // <---- hier kommt der Fehler

    StringGrid.Cells[0, c] := FindData.cFileName;
    StringGrid.Cells[1, c] := IntToStr(FindData.nFileSizeLow);

    inc(c);
  until NOT (InternetFindNextFile(hSearch, @FindData));

  InternetCloseHandle(hSearch);
  hSearch := nil;
Vielleicht hatte schon jemand ein ähnliches Problem bzw. wo könnte der Fehler liegen?

mfg
Herbert
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#2

Re: StringGrid.RowCount lässt sich nicht ändern

  Alt 19. Nov 2006, 12:57
Tach ...,
versuch mal ob es jetzt funktionopelt
Delphi-Quellcode:
var c: integer;
begin
  for ARow := 1 to Pred(StringGrid.RowCount) do
    StringGrid.Rows[ARow].Clear;

  StringGrid.RowCount:= 2;
  StringGrid.FixedRows := 1;
  c := StringGrid.FixedRows;

  hSearch := FtpFindFirstFile(hConnect, nil, FindData, INTERNET_FLAG_DONT_CACHE, 0);
  if hSearch <> nil then
  repeat
    StringGrid.Cells[0, c] := FindData.cFileName;
    StringGrid.Cells[1, c] := IntToStr(FindData.nFileSizeLow);
    inc(c);
    StringGrid.RowCount:= c;
  until NOT (InternetFindNextFile(hSearch, @FindData));

  InternetCloseHandle(hSearch);
  hSearch := nil;
end;
LG Mario
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#3

Re: StringGrid.RowCount lässt sich nicht ändern

  Alt 19. Nov 2006, 13:42
Es hat sich leider nichts verändert.

So lange ich kein neues Verzeichnis anlege, funktioniert alles wunderbar. Auch Verzeichnisse löschen und nachher neu einlesen, funktioniert fehlerfrei. Sobald jedoch neue Verzeichnisse angelegt werden und RowCount beim neuerlichen Einlesen neu gesetzt werden soll (auch bereits vor der Schleife - StringGrid.RowCount := 2), kommt diese ominöse Fehlermeldung.

Vermutlich muss der Fehler ganz wo anders liegen, nur wo. Ausser der einen Routine

Delphi-Quellcode:
  if InputQuery('Neues Verzeichnis erstellen', 'Name des Verzeichnisses', Neu) then
  begin
    if NOT FtpCreateDirectory(hConnect, PChar(Neu)) then Fehler(GetLastError)
      else btServerVerzClick(Sender); // hier wird das Verzeichnis wieder neu eingelesen
  end;
ist absolut nichts dazwischen.

Ergänzung: Soeben haben ich folgenden Versuch gemacht:

1.) Ich starte meine Anwendung und lese das Verzeichnis ein - alles fehlerfrei - lasse weiterhin das Programm weiterlaufen.
2.) Ich starte zusätzlich eine andere Anwendung und lege von dort aus ein neues Verzeichnis am gleichen Server an.
3.) Ich lese von meiner ersten Anwendung, die ja noch läuft, das Verzeichnis neu ein - und wundere mich - alles fehlerfrei.

Sobald ich jedoch von meiner ersten Anwendung ein Verzeichnis neu anlege und danach neu einlesen möchte, ist der Fehler da.

Sehr sehr seltsam das ganze.

mfg
Herbert
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#4

Re: StringGrid.RowCount lässt sich nicht ändern

  Alt 19. Nov 2006, 14:50
Hmm, Dann hat das ganze aber nix mit dem Grid zu tun. Oder drehst Du irgenwo noch an RowCount? Schalte mal FixedRows ab ...

LG Mario
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#5

Re: StringGrid.RowCount lässt sich nicht ändern

  Alt 19. Nov 2006, 15:42
Zitat von hsbc:
Es hat sich leider nichts verändert.

So lange ich kein neues Verzeichnis anlege, funktioniert alles wunderbar. ...

mfg
Herbert
Hallo Herbert,

setz doch mal einen Haltepunkt und lass dir c anzeigen (mit Start - Auswerten).

Grundsätzlich muss das funktionieren, ich habe Anwendungen mit mehr als 10 grossen Stringgrids, die werden beim Einlesen ensprechend immer weiter hochgesetzt bis über 1000 Rows, und notfalls auch wieder herunter. Anbei mein Code dafür, der keine Probleme macht:

Delphi-Quellcode:
procedure TRKMainForm.AddRowToGrid (var G : TStringGrid);
var NewSel : TGRidRect;
begin
G.RowCount := G.RowCount + 1;
NewSel.Top := G.RowCount - 1;
NewSel.Left := 1;
NewSel.Bottom := NewSel.Top;
NewSel.Right := 1;
G.Selection := NewSel;
end;

procedure TRKMainForm.InsertRowToGrid (var G : TStringGrid; docopy : boolean);
var ActSel : TGRidRect;
    c,cmax,r,rins : integer;
begin
ActSel := G.Selection;
r := ActSel.Top ;
if (r < 1) or (r >= G.RowCount) then
  begin
  Beep;
  exit;
  end;
G.RowCount := G.RowCount + 1;
rins := r;
cmax := G.ColCount - 1;
for r := G.RowCount - 2 downto rins do
  for c := 0 to cmax do G.Cells [c,r+1] := G.Cells[c,r];
if docopy then
  for c := 0 to cmax do G.Cells[c,rins] := G.Cells[c,rins+1]
else
  for c := 0 to cmax do G.Cells[c,rins] := '';
ActSel.Left := 1;
ActSel.Top := rins;
ActSel.Right := 1;
ActSel.Bottom := rins;
G.Selection := ActSel;
end;

procedure TRKMainForm.DeleteRowFromGrid (var G : TStringGrid);
var ActSel : TGRidRect;
    r,ri,rmax : integer;
begin
ActSel := G.Selection;
r := ActSel.Top ;
if (r < 1) or (r >= G.RowCount) then
  begin
  Beep;
  exit;
  end;
for ri := r to G.RowCount - 2 do
  G.Rows[ri] := G.Rows[ri+1];
G.RowCount := G.RowCount - 1;
end;
Ich sehe also auch nicht, wo du was falsch gemacht haben könntest.

Gruss Reinhard
  Mit Zitat antworten Zitat
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#6

Re: StringGrid.RowCount lässt sich nicht ändern

  Alt 19. Nov 2006, 16:05
Hallo Reinhard,

Die Werte an verschiedenen Haltepunkten ergaben alle das richtige Ergebnis.

Ich habe das ganze mal "provisorisch" so zum Laufen gebracht, indem ich am Ende der Schleife RowCount nicht immer um 1 erhöhe, sondern so:

StringGrid.RowCount := c + 3;

Komischerweise funktioniert hier alles einwandfrei - NUR leider hat das StringGrid jetzt halt 3 Leerzeilen am Ende mehr.

Wenn ich jetzt versuche, diese 3 Leerzeilen am Ende des Auslesens auf die richtige Anzahl zu reduzieren, so funktioniert das auch noch, die 3 Leerzeilen sind erwartungsgemäss weg. Aber jetzt kommts:

Wenn ich nach dem Entfernen der 3 Leerzeilen ein neues Verzeichnis einfüge und danach neu einlese, ist der Fehler wieder da. Auch wenn ich vor dem Einfügen eines neuen Verzeichnisses RowCount wieder um den Wert 3 erhöhe, das neue Verzeichnis speichere und neu einlese, kommt der Fehler. Das ist mit Sicherheit der blödeste Fehler, der mir je untergekommen ist.

Ich weiss echt nicht mehr, wie ich den Fehler noch eingrenzen könnte.

mfg
Herbert
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: StringGrid.RowCount lässt sich nicht ändern

  Alt 19. Nov 2006, 16:22
Zitat von hsbc:
Ich habe das ganze mal "provisorisch" so zum Laufen gebracht, indem ich am Ende der Schleife RowCount nicht immer um 1 erhöhe, sondern so:

StringGrid.RowCount := c + 3;

Komischerweise funktioniert hier alles einwandfrei...
Vielleicht stimmt die Vermutung nicht, denn keiner hat folgendes erwähnt : FixedRows fangen mit 1 an. Rows aber mit 0. Könnte trotzdem fast wetten, daß c + 1 auch geht und wenn das +1 weg ist, dann krachts. Teste das mal. Was soll eigentlich das Pred am Anfang ? Wozu ist das gut ? Ist doch im Klartext -1, oder ? Muß da immer überlegen. Hasse diese Funktionen aus der Lochkartenzeit sowieso.
Gruß
Hansa
  Mit Zitat antworten Zitat
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#8

Re: StringGrid.RowCount lässt sich nicht ändern

  Alt 19. Nov 2006, 16:46
Hallo Hansa,

Sobald ich den Wert nicht um 3 erhöhe, kracht es. Also auch bei c+2 oder c+1. Es geht erst ab +3.

Ist eben komisch, aber ist so.

mfg
Herbert
  Mit Zitat antworten Zitat
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#9

Re: StringGrid.RowCount lässt sich nicht ändern

  Alt 19. Nov 2006, 18:05
Hallo nochmal!

FEHLER GEFUNDEN !!!

Ich hatte mir selbst ein Ei gelegt. Ich habe das StringGrid mit einem PopUp-Menü verbunden. Der Aufruf der Funktion "Neues Verzeichnis anlegen" erfolgte über dieses PopUp-Menü.

Gleichzeitig habe ich im StringGrid das onMouseDown-Ereignis ausgewertet. Und genau hier lag der Fehler:

Das StringGridMouseDown sollte nichts anderes machen, als die entsprechende Zeile im Grid bei einem RechtsKlick zu markieren. Leider habe ich in der Auswertung übersehen, eine Gültigkeitsabfrage der gedrückten Zeile einzubauen, so dass es vorgekommen ist, dass die Zeile bzw. die Spalte auf -1 gesetzt wurde und dadurch das Grid bei StringGrid.Selection abgestürzt war.

Na gut, hatte meinen Fehler eben schön versteckt, aber so lernt man ja auch ...

Besten Dank nochmals an alle, die sich bemüht hatten, mir zu helfen.

mfg
Herbert
  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 01:37 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