Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ohne "Tags" über hundert Druckaufträge (https://www.delphipraxis.net/26669-ohne-tags-ueber-hundert-druckauftraege.html)

Die Muhkuh 27. Jul 2004 12:32


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;

Sharky 27. Jul 2004 12:35

Re: Ohne "Tags" über hundert Druckaufträge
 
Hai Spider,

wofür ist den diese For-Do Schleife?

Delphi-Quellcode:
.
.
  Query1.Open;
  Query1.First;
  for I := 0 to Query1.Fields.Count do
  begin
.
.

    Query1.Next;
  end;
end;
und was bring das Query1.Next in der Schleife?

Die Muhkuh 27. Jul 2004 12:37

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?

Sharky 27. Jul 2004 12:40

Re: Ohne "Tags" über hundert Druckaufträge
 
Zitat:

Zitat von Spider
...Hab For-Do gemacht statt While not EOF do.

Ganz schlecht!
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

Die Muhkuh 27. Jul 2004 12:42

Re: Ohne "Tags" über hundert Druckaufträge
 
Hi,


was wäre dann besser? ForDo mit Query1.RecordCount oder While not EOF do?

Sharky 27. Jul 2004 12:46

Re: Ohne "Tags" über hundert Druckaufträge
 
Zitat:

Zitat von Spider
...was wäre dann besser? ForDo mit Query1.RecordCount oder While not EOF do?

Ich persönlich bevorzuge eine While-DO Schleife. Dann kann ich nämlich noch eine "Abbruchvariable" benutzen und so dem Anwender die Möglichkeit geben den Druckauftrag abzubrechen (wenn nicht schon alles im Druckerpuffer ist).
Ausserdem wurde mal gesagt das .RecordCount gelegentlich falsche Werte liefert.

Die Muhkuh 27. Jul 2004 12:47

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.

sakura 27. Jul 2004 12:48

Re: Ohne "Tags" über hundert Druckaufträge
 
Zitat:

Zitat von Sharky
Ich persönlich bevorzuge eine While-DO Schleife. Dann kann ich nämlich noch eine "Abbruchvariable" benutzen und so dem Anwender die Möglichkeit geben den Druckauftrag abzubrechen ...

Kann man doch auch in einer "normalen" For...do Schleife :gruebel:
Delphi-Quellcode:
for I := 0 to MaxInt-1 do
begin
  Sleep(1000);
  Application.ProcessMessages;
  if AbortedSleep then
    Break;
end;
...:cat:...

Sharky 27. Jul 2004 12:52

Re: Ohne "Tags" über hundert Druckaufträge
 
Zitat:

Zitat von sakura
..Kann man doch auch in einer "normalen" For...do Schleife :gruebel:...

Klar, aber ich finde es halt mit
Delphi-Quellcode:
begin
  while not ((Query1.Eof) or (abbruch)) do
  begin
    .
    .
    Application.ProcessMessages;
    Query1.Next;
  end;
end;
schöner ;-) Dann sehe ich beim ersten blick das es eine Abbruchbedingung gibt und muss diese nicht in der Schleife suchen :stupid:

woki 27. Jul 2004 14:03

Re: Ohne "Tags" über hundert Druckaufträge
 
Hi

Zitat:

Zitat von Spider
Hi,


was wäre dann besser? ForDo mit Query1.RecordCount oder While not EOF do?

Ich würde die while Variante empfehlen, nicht weil ich glaube das recordcount falsche Werte liefert, man muß sich nur bewußt sein, was recordcount für Werte liefert, nämlich die Anzahl der Datensätze, die aktuell in die Datenmenge geladen sind, das hat aber nicht unbedingt etwas mit der Anzahl der vorhandenenen Datensätze zu tun, z.B. dann, wenn die Datenmenge so eingestellt ist, dass sie Daten bei Bedarf lädt, und dann verändert sich recordcount beim durchscrollen plötzlich. Aber wie gesagt, "It's not abug, it's a feature".

Grüsse
Woki

Die Muhkuh 27. Jul 2004 14:06

Re: Ohne "Tags" über hundert Druckaufträge
 
Hi,


habs jetzt auch mit While gelöst.

Die Muhkuh 27. Jul 2004 14:09

Re: Ohne "Tags" über hundert Druckaufträge
 
Aber klappen tuts doch noch net.

Meine Prozedure sieht nun so aus:

Delphi-Quellcode:
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;
Aber trotzdem wird (obwohl 2 Datensätze vorhanden sind) nur ein Datensatz gedruckt. Warum?

Die Muhkuh 28. Jul 2004 11:28

Re: Ohne "Tags" über hundert Druckaufträge
 
*Push* :angle2:

woki 28. Jul 2004 11:49

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

Die Muhkuh 28. Jul 2004 11:56

Re: Ohne "Tags" über hundert Druckaufträge
 
Hi Woki,


was genau meinst du mit Select Count? :gruebel:

woki 28. Jul 2004 14:14

Re: Ohne "Tags" über hundert Druckaufträge
 
Hi Spider,


SQL-Code:
select count(*) from Tabellename
liefert z.b. die Anzahl der Datensätze einer Tabelle. Das kann man natürlich entsprechend verfeinern.
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.

Die Muhkuh 28. Jul 2004 14:36

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.

woki 28. Jul 2004 17:12

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