AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf dynamisch erstellte Komponente

Ein Thema von wendelin · begonnen am 18. Jul 2011 · letzter Beitrag vom 21. Jul 2011
Antwort Antwort
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#1

Zugriff auf dynamisch erstellte Komponente

  Alt 18. Jul 2011, 23:16
Hallo,

für ein größeres Project (techn. Aktienanalyse) möchte ich mit Hilfe von Quickreport und einem DBGrid Daten ausgeben und diese in einer Preview darstellen.

Bisher habe ich den QReport nur statisch (also NICHT zur Laufzeit
erstellt). Dies hat den Nachteil, dass ich für jede neue Tabelle wieder einen neuen Report erstellen muß.
Da ich die Daten mit Hilfe von "SQL" filtere, zusammenfasse,auswerte (Joins,Group's etc.) ist eine statische Erstellung sehr un-
praktisch.
Nun habe ich durch Zufall im Netz eine Procedur gefunden, die genau das macht, was ich möchte. Nämlich mit EINEM leeren QReport Formular (statisch erzeugt) und
den dazugehörigen Bänder, TQRLabels, TQRDBText etc. (Erstellung NUR zur Laufzeit) beliebige Felder und Inhalte von verschiedenen Tables
in einer Preview auszugeben (und auszudrucken).
Autor R.R. Aguilo ->
http://www.delphi3000.com/articles/article_2398.asp?SK=

Nach der Korrektur einiger kleiner Fehler läuft mein Testprogramm sehr zufriedenstellend.
Nun möchte ich wegen der besseren Lesbarkeit mit Hilfe von Procedure "BeforePrint" (s.u.) Tabellierpapier simulieren.
Beim Entwurf von QReport (zur Designzeit) gibt es keine Probleme.
In meinem Testprogramm jedoch gibt es zur Designzeit noch keine Komponente "DetailBandXXX". Ein weiteres Problem ist, dass mit jedem
neuen Aufruf von "GridRepPreview(Grid : TDBGrid)" wieder ein neues
Detailband erzeugt wird (und später freigegeben) wird.
Ich habe es schon mit TComponentList bzw. mit TObjectList probiert.
Kein Erfolg. Da ich ein reiner Hobbyprogrammierer bin wäre ich für
ein paar Anregungen oder Lösungsansätze sehr dankbar.

Wendelin
Delphi-Quellcode:
unit DBQRGridReport; // DELPHI 7E.

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,Controls, Forms,Dialogs, ExtCtrls, QuickRpt, QRCtrls, DB, DBQRUnit1,
  DBGrids,DBQRDataModul;

type
  TGridReport = class(TForm)
    GridRep: TQuickRep;
    procedure GridRepPreview(Grid : TDBGrid);

  (*  procedure GridRepBeforePrint(Sender: TCustomQuickRep;
      var PrintReport: Boolean);  *)


  private
    { Private declarations }

  public
 
  end;

var
  GridReport: TGridReport;
implementation

{$R *.dfm}

procedure TGridReport.GridRepPreview(Grid : TDBGrid);
var
  i, CurrentLeft, CurrentTop : integer;
begin
  GridRep.Dataset:=Grid.DataSource.DataSet;
    
  if not GridRep.Bands.HasColumnHeader then
    GridRep.Bands.HasColumnHeader:=true;

  if not GridRep.Bands.HasDetail then
      GridRep.Bands.HasDetail:=true;
      
  if not GridRep.Bands.HasPageFooter then // NEU
    GridRep.Bands.HasPageFooter := TRUE;

  GridRep.Bands.ColumnHeaderBand.Height:= Abs(Grid.TitleFont.Height) + 10;
  GridRep.Bands.DetailBand.Height := Abs(Grid.Font.Height) + 10;
  GridRep.Bands.PageFooterBand.Height := Abs(Grid.Font.Height) + 10;

  CurrentLeft := 12;
  CurrentTop := 4; // 6

  Grid.DataSource.DataSet.DisableControls; // don't flicker !!

  try
    for i:=0 to Grid.FieldCount - 1 do
    begin
      if (CurrentLeft + Canvas.TextWidth(Grid.Columns[i].Title.Caption)) >
         (GridRep.Bands.ColumnHeaderBand.Width) then
      begin
        CurrentLeft := 12;
        CurrentTop := CurrentTop + Canvas.TextHeight('A') + 6;
        GridRep.Bands.ColumnHeaderBand.Height :=
        GridRep.Bands.ColumnHeaderBand.Height +
          (Canvas.TextHeight('A') + 10);
        GridRep.Bands.DetailBand.Height :=
        GridRep.Bands.DetailBand.Height +
          (Canvas.TextHeight('A') + 10);
      end;

      {Create Header with QRLabels}
      with TQRLabel.Create(GridRep.Bands.ColumnHeaderBand) do
      begin
        Parent := GridRep.Bands.ColumnHeaderBand;
        Color := GridRep.Bands.ColumnHeaderBand.Color;
        Left := CurrentLeft;
        Top := CurrentTop - 10; // korr. !
        Caption := Grid.Columns[i].Title.Caption;
        Font.Style := [fsBold,fsUnderline];
      end;

      {Create Detail with QRDBText}
      with TQRDBText.Create(GridRep.Bands.DetailBand) do
      begin
        Parent := GridRep.Bands.DetailBand;
        Color := GridRep.Bands.DetailBand.Color;
        Transparent := TRUE; // NEU für Farbwechsel
        Left := CurrentLeft;
        Top := CurrentTop;
        Alignment := taLeftJustify; // NEU / Alt -> Grid.Columns[i].Alignment;
        AutoSize := FALSE;
        AutoStretch := FALSE; // korr. !
        WordWrap := FALSE; // NEU
        Width := Grid.Columns[i].Width;
        Dataset := GridRep.Dataset;
        DataField := Grid.Fields[i].FieldName;
        CurrentLeft := CurrentLeft + (Grid.Columns[i].Width) + 15;
      end;
    end;

    {Create SysData / Datum-Zeit}
    with TQRSysData.Create(GridRep.Bands.PageFooterBand) do
    begin
      Parent := GridRep.Bands.PageFooterBand;
      Color := clWhite;
      Left := 12;
      Top := CurrentTop;
      Alignment := taLeftJustify;
      Data := qrsDateTime;
      Font.Charset := DEFAULT_CHARSET;
      Font.Color := clWindowText;
      Font.Height := -13;
      Font.Name := 'Arial';
      Font.Style := [fsBold];
    end;
    
    {Create Label / TableName}
    with TQRLabel.Create(GridRep.Bands.PageFooterBand) do
    begin
      Parent := GridRep.Bands.PageFooterBand;
      Color := clWhite;
      Left := 512;
      Top := CurrentTop;
      Alignment := taLeftJustify;
      Caption := 'TABLE 1';
      Font.Charset := DEFAULT_CHARSET;
      Font.Color := clWindowText;
      Font.Height := -13;
      Font.Name := 'Arial';
      Font.Style := [fsBold,fsUnderline];
    end;

    {Create Label / Seite :}
    with TQRLabel.Create(GridRep.Bands.PageFooterBand) do
    begin
      Parent := GridRep.Bands.PageFooterBand;
      Color := clWhite;
      Left := 948;
      Top := CurrentTop;
      Alignment := taLeftJustify;
      Caption := 'SEITE :';
      Font.Charset := DEFAULT_CHARSET;
      Font.Color := clWindowText;
      Font.Height := -13;
      Font.Name := 'Arial';
      Font.Style := [fsBold];
    end;

    {Create SysData / Seitennummer}
    with TQRSysData.Create(GridRep.Bands.PageFooterBand) do
    begin
      Parent := GridRep.Bands.PageFooterBand;
      Color := clWhite;
      Left := 1024;
      Top := CurrentTop;
      Alignment := taLeftJustify;
      Data := qrsPageNumber;
      Font.Charset := DEFAULT_CHARSET;
      Font.Color := clWindowText;
      Font.Height := -13;
      Font.Name := 'Arial';
      Font.Style := [fsBold];
    end;

    {After all, call the QuickRep preview method}
    GridRep.Preview; {or PreviewModal if you prefer}

  finally
    // FREE it NEU!
    GridRep.Bands.ColumnHeaderBand.Free; // wichtig sonst eListError
    GridRep.Bands.DetailBand.Free; // wichtig sonst eListError
    GridRep.Bands.PageHeaderBand.Free; // wichtig sonst eListError
    
    with Grid.DataSource.DataSet do
    begin
      EnableControls;
    end;
  end;
end;

// Für Tabellierpapier
(* procedure TGridReport.GridRepBeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
  If GridReport.DetailBandXXX.Color  = clWhite THEN
    GridReport.DetailBandXXX.Color := clMoneyGreen ELSE
    GridReport.DetailBandXXX.Color := clWhite;
end; *)


end.
Wolfgang

Geändert von SirThornberry (19. Jul 2011 um 08:36 Uhr) Grund: Delphi-Tags ergänzt
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Zugriff auf dynamisch erstellte Komponente

  Alt 18. Jul 2011, 23:44
Nun möchte ich wegen der besseren Lesbarkeit mit Hilfe von Procedure "BeforePrint" (s.u.) Tabellierpapier simulieren.
Ich verstehe diese Formulierung nicht. Aber vielleicht jemand anderes, der dir dann helfen kann.

Viel Glück
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#3

AW: Zugriff auf dynamisch erstellte Komponente

  Alt 19. Jul 2011, 07:27
Kauf dir die DevExpress-komponenten (Grid und Printing suite). Dann ist Ruhe im Karton.

Quickreport ist doch &%&$%"§$".

[Edit]: Beim zweiten Durchlesen das Wort 'Hobbyprogrammierer' gelesen... Deswegen ist dieser Tipp hier unbrauchbar... Sorry [/Edit]
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zugriff auf dynamisch erstellte Komponente

  Alt 19. Jul 2011, 08:28
Bitte Quellcode wegen der Lesbarkeit mit zutreffendem Delphi- oder Code-Tag klammern, dann bleibt die Formatierung im wesentlichen erhalten. Dafür gibts im Bearbeitungsformular auch Schaltflächen.

Den QReport hab ich nicht installiert, aber im Prinzip sollte es doch so funktionieren:
Delphi-Quellcode:
procedure TGridReport.MyDetailBeforePrint({...});
begin
  {...}
end;

// Ereignisbehandlung zuweisen
GridRep.Bands.DetailBand.BeforePrint := MyDetailBeforePrint;
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Zugriff auf dynamisch erstellte Komponente

  Alt 19. Jul 2011, 23:04
Hallo Omata,

ich meine damit: Tabellierpaper bedeutet das die ZEILEN im Report der besseren Lesbarkeit halber alternierend z.B. in weiss - grün - weiss -
grün u.s.w. dargestellt werden s.u. Natürlich kann auch eine andere
Farbkombination gewählt werden.

begin
If GridReport.DetailBandXXX.Color = clWhite THEN
GridReport.DetailBandXXX.Color := clMoneyGreen ELSE
GridReport.DetailBandXXX.Color := clWhite;
end;
Dennoch vielen Dank für die schnelle Bearbeitung
Wolfgang
  Mit Zitat antworten Zitat
wendelin

Registriert seit: 29. Dez 2010
Ort: Nürnberg
126 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Zugriff auf dynamisch erstellte Komponente

  Alt 19. Jul 2011, 23:38
Hallo FredlFesl

mag zwar ein guter Tipp sein, ist mir aber deutlich zu teuer!
599 - 1999 $ !!
Habe schon mit RaveReport gearbeitet, benötige ich nicht, da zu
komplex und für meine Anforderungen überdimensioniert.

Dennoch danke für die schnelle Bearbeitung.
P.S. Was bedeutet das : &%&$%"§$" ??
Wolfgang
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
721 Beiträge
 
Delphi 12 Athens
 
#7

AW: Zugriff auf dynamisch erstellte Komponente

  Alt 21. Jul 2011, 09:31

Nun möchte ich wegen der besseren Lesbarkeit mit Hilfe von Procedure "BeforePrint" (s.u.) Tabellierpapier simulieren.
Beim Entwurf von QReport (zur Designzeit) gibt es keine Probleme.
In meinem Testprogramm jedoch gibt es zur Designzeit noch keine Komponente "DetailBandXXX". Ein weiteres Problem ist, dass mit jedem
neuen Aufruf von "GridRepPreview(Grid : TDBGrid)" wieder ein neues
Detailband erzeugt wird (und später freigegeben) wird.
Ich habe es schon mit TComponentList bzw. mit TObjectList probiert.
Kein Erfolg. Da ich ein reiner Hobbyprogrammierer bin wäre ich für
ein paar Anregungen oder Lösungsansätze sehr dankbar.

Wendelin
Wenn ich dich richtig verstehe, hast du schon eine funktionierende BeforePrint-Methode, die das Tabellierpapier simuliert. Die must du nur dem dynamisch erzeugten DetailBand zur Laufzeit zuweisen.

Delphi-Quellcode:
  GridRep.Bands.DetailBand.Height := Abs(Grid.Font.Height) + 10;
  GridRep.Bands.DetailBand.BeforePrint:=GridRepBeforePrint;


// Für Tabellierpapier
procedure TGridReport.GridRepBeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
  If GridRep.Bands.DetailBand.Color = clWhite THEN
    GridRep.Bands.DetailBand.Color := clMoneyGreen ELSE
    GridRep.Bands.DetailBand.Color := clWhite;
end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:57 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 by Thomas Breitkreuz