Autor Beitrag
thommy f
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows 2K pro
Delphi 5 Enterprise
BeitragVerfasst: Di 19.02.13 14:12 
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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
    //Formular erzeugen
    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;
    //Formular deaktivieren
    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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 19.02.2013 um 15:45

_________________
Der Mensch wächst mit seinen Aufgaben *** Wer kämpft kann verlieren, wer nicht kämpft hat schon verloren
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 19.02.13 14:26 
Ich habe zwar ewig nichts mehr mit Quickreport gemacht, aber funktioniert das hier evtl.?
ausblenden Delphi-Quelltext
1:
F_Druck_Termine.QRM_Termine.Lines.Assign(F_Haupt.M_Termine_vereinbaren.Lines);					
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 19.02.13 14:26 
Zuweisung einer Stringliste sollte afaik so laufen:

ausblenden 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... :(

_________________
We are, we were and will not be.
thommy f Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows 2K pro
Delphi 5 Enterprise
BeitragVerfasst: 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?

_________________
Der Mensch wächst mit seinen Aufgaben *** Wer kämpft kann verlieren, wer nicht kämpft hat schon verloren
thommy f Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows 2K pro
Delphi 5 Enterprise
BeitragVerfasst: 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...

_________________
Der Mensch wächst mit seinen Aufgaben *** Wer kämpft kann verlieren, wer nicht kämpft hat schon verloren
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Do 28.02.13 12:53 
Wenn es etwas kosten darf könntest Du Dir einmal FastReport anschauen, der läuft auch noch unter Delphi 4 und ist ab $79 erhältlich.
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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).

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
(*
//Formular erzeugen
    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.PrinterSettings.PrinterIndex := Printer.PrinterIndex. // habe ich mal hinzugefügt, falls der Report ncith weiß, wohin er drucken soll.
    F_Druck_Termine.QR_Termine.print;
(*
    //Formular deaktivieren
    if F_Druck_Termine <> nil then
    begin
      F_Druck_Termine.Release;
      F_Druck_Termine := nil;
    end;
*)

  end;

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
thommy f Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows 2K pro
Delphi 5 Enterprise
BeitragVerfasst: 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.

_________________
Der Mensch wächst mit seinen Aufgaben *** Wer kämpft kann verlieren, wer nicht kämpft hat schon verloren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows 2K pro
Delphi 5 Enterprise
BeitragVerfasst: 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

_________________
Der Mensch wächst mit seinen Aufgaben *** Wer kämpft kann verlieren, wer nicht kämpft hat schon verloren