![]() |
Ohne "Tags" über hundert Druckaufträge
Hi,
ich hab eine DB dort stehen Vornamen und der Nachname drin. In meinem Programm schreibt man als "Tag" z.B. <<Vorname>>, dann wird aus der DB der Vorname beim Drucken eingesetzt. Das Problem ist nun folgendes. Wenn ich mit diesen Tags schreibe, dann druckt er soviele mal wieder Datensätze vorhanden sind. Schreib ich aber keine "Tags" rein, dann knallt er mir den Drucker mit über 100 Druckaufträgen zu. Das ist meine Druckprocedure:
Delphi-Quellcode:
procedure TForm1.Printing;
var I, II: Integer; Left, Top: Integer; MS: TMemoryStream; begin Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('SELECT Mitgliederv4.* FROM Mitgliederv4'); Query1.Open; Query1.First; for I := 0 to Query1.Fields.Count do begin MS := TMemoryStream.Create; // MemoryStream erstellen reMessage.Lines.SaveToStream(MS); // Eingabe-RichEdit speichern MS.Position := 0; // an Position 0 gehen temp.Lines.LoadFromStream(MS); // Ausgabe-Richedit laden MS.Free; // MemoryStream freigeben //Ersetzen der "Tags" Replace('<<Vorname>>', 'vorname'); Replace('<<Nachname>>', 'name'); Replace('<<GB>>','geburtstag'); Replace('<<Straße>>', 'strasse'); Replace('<<HSN>>', 'hausnummer'); Replace('<<PLZ>>', 'plz'); Replace('<<Ort>>', 'ort'); //Drucken; Left := 100; Top := 100; Printer.Copies := 1; with Printer do begin Canvas.Font.Assign(Temp.Font); Title := 'Serienbrief'; BeginDoc; for II := 0 to temp.Lines.Count - 1 do Canvas.TextOut(Left, Top + (II * Canvas.TextHeight(Temp.Lines[II])), Temp.Lines[II]); EndDoc; end; Query1.Next; end; end; |
Re: Ohne "Tags" über hundert Druckaufträge
Hai Spider,
wofür ist den diese For-Do Schleife?
Delphi-Quellcode:
und was bring das Query1.Next in der Schleife?
.
. Query1.Open; Query1.First; for I := 0 to Query1.Fields.Count do begin . . Query1.Next; end; end; |
Re: Ohne "Tags" über hundert Druckaufträge
Hai Fisch,
das war mal dein Code nur etwas abgewandelt. Hab For-Do gemacht statt While not EOF do. // Edit: Jetzt klingelts grad. Ich geh ja eh alle Datensätze durch, deswegen müsste ich das Query1.Next ja weglassen können oder? |
Re: Ohne "Tags" über hundert Druckaufträge
Zitat:
Vorallem gibt Dir Query1.Fields.Count nicht die Anzahl der Datensätze sonder die Anzahl der Felder in der Tabelle zurück. Wenn schon dann Query1.RecordCount |
Re: Ohne "Tags" über hundert Druckaufträge
Hi,
was wäre dann besser? ForDo mit Query1.RecordCount oder While not EOF do? |
Re: Ohne "Tags" über hundert Druckaufträge
Zitat:
Ausserdem wurde mal gesagt das .RecordCount gelegentlich falsche Werte liefert. |
Re: Ohne "Tags" über hundert Druckaufträge
Ok, dann werde ich mal auf While-Do umbauen...
//Edit: Ich muss ja nur die For-Do-Schleife wegmachen und mit While-Do ersetzen oder? Ok, war so. |
Re: Ohne "Tags" über hundert Druckaufträge
Zitat:
Delphi-Quellcode:
...:cat:...
for I := 0 to MaxInt-1 do
begin Sleep(1000); Application.ProcessMessages; if AbortedSleep then Break; end; |
Re: Ohne "Tags" über hundert Druckaufträge
Zitat:
Delphi-Quellcode:
schöner ;-) Dann sehe ich beim ersten blick das es eine Abbruchbedingung gibt und muss diese nicht in der Schleife suchen :stupid:
begin
while not ((Query1.Eof) or (abbruch)) do begin . . Application.ProcessMessages; Query1.Next; end; end; |
Re: Ohne "Tags" über hundert Druckaufträge
Hi
Zitat:
Grüsse Woki |
Re: Ohne "Tags" über hundert Druckaufträge
Hi,
habs jetzt auch mit While gelöst. |
Re: Ohne "Tags" über hundert Druckaufträge
Aber klappen tuts doch noch net.
Meine Prozedure sieht nun so aus:
Delphi-Quellcode:
Aber trotzdem wird (obwohl 2 Datensätze vorhanden sind) nur ein Datensatz gedruckt. Warum?
var
I, II: Integer; Left, Top: Integer; MS: TMemoryStream; begin if pdPrint.Execute then //Print-Dialog begin Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('SELECT Mitgliederv4.* FROM Mitgliederv4'); Query1.Open; Query1.First; while not Query1.Eof do begin MS := TMemoryStream.Create; // MemoryStream erstellen reMessage.Lines.SaveToStream(MS); // Eingabe-RichEdit speichern MS.Position := 0; // an Position 0 gehen temp.Lines.LoadFromStream(MS); // Ausgabe-Richedit laden MS.Free; // MemoryStream freigeben //Ersetzen der "Tags" Replace('<<Vorname>>', 'vorname'); Replace('<<Nachname>>', 'name'); Replace('<<GB>>','geburtstag'); Replace('<<Straße>>', 'strasse'); Replace('<<HSN>>', 'hausnummer'); Replace('<<PLZ>>', 'plz'); Replace('<<Ort>>', 'ort'); //Drucken; Left := 100; Top := 100; Printer.Copies := 1; with Printer do begin Canvas.Font.Assign(Temp.Font); Title := 'Serienbrief'; BeginDoc; for II := 0 to temp.Lines.Count - 1 do Canvas.TextOut(Left, Top + (II * Canvas.TextHeight(Temp.Lines[II])), Temp.Lines[II]); EndDoc; end; Query1.Next; end; end; end; |
Re: Ohne "Tags" über hundert Druckaufträge
*Push* :angle2:
|
Re: Ohne "Tags" über hundert Druckaufträge
Hi,
schon mal mit dem debugger durchlaufen? Oder ein selct count ... um zu bestätigen, dass die Abfrage wirklich zwei Datenätze liefert? Auf den ersten Blick sehe ich keinen Grund für dein Problem. Grüsse Woki |
Re: Ohne "Tags" über hundert Druckaufträge
Hi Woki,
was genau meinst du mit Select Count? :gruebel: |
Re: Ohne "Tags" über hundert Druckaufträge
Hi Spider,
SQL-Code:
liefert z.b. die Anzahl der Datensätze einer Tabelle. Das kann man natürlich entsprechend verfeinern.
select count(*) from Tabellename
Damit du sicher bist, das die Abfrage wirklich zwei Datensätze zurückliefert. Grüsse Woki P.S.: Das ist sozusagen das datenbankseitige Gegenstück zu recordcount. |
Re: Ohne "Tags" über hundert Druckaufträge
Hi,
hab es nun ohne dieses Count gemacht. Ich glaube das mit dem drucken lag daran, wie meine "Tags" ersetzt wurden, oder das ich bei RichEdit1.Print(Caption: String), nur '' gemacht hab. |
Re: Ohne "Tags" über hundert Druckaufträge
Hi,
um Mißverständnisse zu vermeiden, das count sollte auch nur helfen, die Fehlerursache einzugrenzen, ansonsten wird es hier natürlich nicht gebraucht. Grüsse Woki |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 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