![]() |
StringGrid.RowCount lässt sich nicht ändern
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:
Vielleicht hatte schon jemand ein ähnliches Problem bzw. wo könnte der Fehler liegen?
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; mfg Herbert |
Re: StringGrid.RowCount lässt sich nicht ändern
Tach ...,
versuch mal ob es jetzt funktionopelt
Delphi-Quellcode:
LG Mario
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; |
Re: StringGrid.RowCount lässt sich nicht ändern
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:
ist absolut nichts dazwischen.
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; 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 |
Re: StringGrid.RowCount lässt sich nicht ändern
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 |
Re: StringGrid.RowCount lässt sich nicht ändern
Zitat:
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:
Ich sehe also auch nicht, wo du was falsch gemacht haben könntest.
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; Gruss Reinhard |
Re: StringGrid.RowCount lässt sich nicht ändern
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 |
Re: StringGrid.RowCount lässt sich nicht ändern
Zitat:
|
Re: StringGrid.RowCount lässt sich nicht ändern
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 |
Re: StringGrid.RowCount lässt sich nicht ändern
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 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