Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Stringlist error "Out of Bounds"
thommy f - Di 19.02.13 14:12
Titel: Stringlist error "Out of Bounds"
Hallo Forum...
In Google habe ich nichts gefunden, was mich weiter brächte, und auch die Forumssuche hat zwar ein paar mal was zu dieser Fehlermeldung ausgespuckt, aber leider immer in anderen Zusammenhängen, als das bei mir der Fall ist.
Ich habe in einem Programm ein normales MEMO-Feld, das ich beim Programmstart nach gewissen Kriterien mit Einträgen aus verschiedenen Datenbank-Tabellen füttere. Das funktioniert auch einwandfrei. Nun hätte ich gerne den Inhalt des Memos in einen Quickreport übernommen und dießen anschließend ausgedruckt.
Wahrscheinlich habe ich einen éinfachen (betriebsblinden) Denkfehler in der ganzen Geschichte.
Folgende Sequenz sollte das relativ simpel erledigen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| if F_Druck_Termine = nil then F_Druck_Termine := TF_Druck_Termine.Create(Application); F_Druck_Termine.QRL_Headline.Caption := 'TERMINE vereinbaren ' + ' ' + FormatDateTime('dd.mm.yyyy',now); F_Druck_Termine.QRM_Termine.Lines := F_Haupt.M_Termine_vereinbaren.Lines; F_Druck_Termine.QR_Termine.print; if F_Druck_Termine <> nil then begin F_Druck_Termine.Release; F_Druck_Termine := nil; end; end; |
lt. Step by Step löst das Programm bei der -.print Anweisung zwar das Drucken an sich aus, aber ich bekomme anschließend sofort die Fehlermeldung:
Project: ***.exe raised exception class EStringListError with message 'List index out of bounds(3)'. Process Stopped.
Wenn ich das Programm dann über Delphi "zurücksetze" druckt er mir das gewünschte Resultat zwar, aber immer nur eine Zeile...
Bitte um kurze "Denkanstöße".
DANKE!
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Di 19.02.2013 um 15:45
WasWeißDennIch - Di 19.02.13 14:26
Ich habe zwar ewig nichts mehr mit Quickreport gemacht, aber funktioniert das hier evtl.?
Delphi-Quelltext
1:
| F_Druck_Termine.QRM_Termine.Lines.Assign(F_Haupt.M_Termine_vereinbaren.Lines); |
Gausi - Di 19.02.13 14:26
Zuweisung einer Stringliste sollte afaik so laufen:
Delphi-Quelltext
1:
| F_Druck_Termine.QRM_Termine.Lines.Assign(F_Haupt.M_Termine_vereinbaren.Lines); |
Dabei werden die Strings von der einen Liste in die andere kopiert. Einfach den Listen-Pointer umzubiegen, kann schonmal schief gehen: Wenn das eine Objekt zerstört wird, zerstört es auch "seine" Stringliste, die aber eigentlich einem anderen Objekt gehört - und dann knallts...
Edit: zu langsam... :(
thommy f - Mi 20.02.13 19:39
... danke für den Tipp! Hat aber leider noch nichts gebracht.
Er macht die Sequenz komplett durch, nach dem .print spricht er den Drucker auch an, dann kommt ohne dass der Statusbalken der Druckanzeige einen Rucker macht, die oben erwähnte Fehlermeldung und das Programm hängt sich auf...
Noch jemand eine andere Idee?
thommy f - Do 28.02.13 12:28
...
weitere Versuche den Fehler zu beheben, haben mich nun eher in die Richtung geführt, dass der Fehler evtl. von der QuickReport Komponente ausgelöst wird.
Auch andere Druckroutinen in dem Programm verursachen ähnliche Fehler.
Ich möchte jedoch die QuickReport-Komponente nur sehr ungern raus werfen, da mir diese doch recht komfortable Möglichkeiten bietet, die ausgedruckten Seiten optisch zu gestalten.
Gibt's da überhaupt andere Möglichkeiten?
Bin um jeden Tipp dankbar...
Tranx - Do 28.02.13 13:17
Musst Du denn das Formular ständig neu erzeugen und wieder löschen?
Versuche es einmal, indem Du das Formular in Dein Programm einbindest und dann die Create-Prozedur sozusagen in der Projektdatei erledigen lässt. Dann existiert das Formular beim Druck und Du beendest das Ganze erst am Ende des Programms. Vielleicht hilft das weiter.
Dann müsstest Du aber die Speicherfreigabe und die Erzeugung beim Druck herausnehmen (siehe meinen Vorschlag).
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| F_Druck_Termine.QRL_Headline.Caption := 'TERMINE vereinbaren ' + ' ' + FormatDateTime('dd.mm.yyyy',now); F_Druck_Termine.QRM_Termine.Lines := F_Haupt.M_Termine_vereinbaren.Lines; F_Druck_Termine.QR_Termine.PrinterSettings.PrinterIndex := Printer.PrinterIndex. F_Druck_Termine.QR_Termine.print;
end; |
thommy f - Mo 24.06.13 08:33
... leider hat auch das ^^ nicht geholfen. Die Fehlermeldung tritt trotzdem weiterhin auf. Stutzig macht mich, dass Sie von
.print bzw. .preview ausgelöst wird.
er öffnet zunächst den "wird gedruckt" Prozess, der Statusbalken bewegt sich jedoch nicht, da anschließend sofort die oben genannte Fehlermeldung auftaucht.
noch eine weitere Erkenntnis:
Der Druckauftrag steht in der Drucker-Warteschlange korrekt drin, wird aber nicht ausgeführt. Ich vermute also, dass der Fehler evtl. vom Spooler ausgelöst werden könnte...
Hat noch jemand weitere Ansätze???
Danke für eure Mithilfe schonmal.
Gruß:
Thommy
P.S. wenn ich den Druckauftrag in der Warteschlange manuell erneut starte, druckt er mir den ersten "Datensatz aus der StringListe. Aber leider NUR den.
jaenicke - Mo 24.06.13 09:10
Du könntest Debuginformationen in deine Exe linken (Projektoptionen) und mit JclDebug aus der JECI Code Library einen Stacktrace erzeugen um herauszufinden wo genau es knallt. Mit einkompilierten Debug-DCUs könntest du evtl. auch beim Debuggen schon genauer herausfinden wo das passiert, aber ich vermute die Quelltexte von QuickReport sind nicht dabei.
Der Spooler oder etwas in der Windows API hat damit jedenfalls definitiv nichts zu tun, da ein EStringListError nur in Delphi selbst ausgelöst werden kann.
baumina - Mo 24.06.13 09:20
Auch ich kenne QuickReport nicht, aber interessant wäre ja im Formular F_Druck_Termine das Feld QRM_Termine. Gibt's da irgendein Ereignis wie OnPrint oder so, wo du dir mal Lines.Count anzeigen lassen kannst? Oder ein anderes Ereignis das pro Zeilendruck ausgelöst wird um da zu sehen warum er über den Index des von Lines hinausschießt?
Auch die Einstellungen in der .dfm von QRM_Termine wären interessant.
jasocul - Mo 24.06.13 10:36
Habe lange kein QR mehr in den Fingern gehabt ...
Kann es vielleicht sein, dass die Komponente im QR nicht mehrere Zeilen annimmt und deswegen den Fehler ausgibt? Hat die Komponente eine Multiline-Eigenschaft, die nicht gesetzt ist, o.ä.? Eine andere Idee ist noch die automatische Höhensteuerung der Komponente oder des Bandes (wenn auch unwahrscheinlich).
Notfalls die Komponente, die die Zeilen annehemen soll einfach nochmal rausschmeißen und neu drauf packen. Vielleicht auch mal ganz weg lassen. Könnte ja sein, dass du den Fehler an der falschen Stelle suchst.
thommy f - Mo 24.06.13 12:29
habe das Problem jetzt mit einer Datenbanktabelle und einer DBText-Komponente in einem Detail-Band gelöst. Danke für eure Hilfe.
Gruß:
Thommy
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!