Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 Uhr.
Seite 1 von 2  1 2      

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