![]() |
Frames mit neuen Eigenschaften/Ereignissen
Hi,
ich möchte gerne ein Frame erstellen, das zusätzliche Eigenschaften/Ereignisse hat. Habe dazu folgende Struktur angelegt:
Delphi-Quellcode:
angelegt. So, lagere ich das Frame nun in ein Package aus und registriere ich es in der Tool-Palette, kann ich es verwenden, wie ich es gerne hätte. Das habe ich allerdings nicht vor - ich möchte nicht für jeden Mist ein neues Symbol in der Tool-Palette haben. Außerdem soll das Frame auch auf meine Datenbank zugreifen können und damit hätte ich sonst Probleme.
type
TDocumentType = (dtInvoiceDetail, dtInvoice); TDeviceTypes = (dtPrinter, dtPDF, dtExcel); TPrintClickEvent = procedure (Sender: TObject; var PrintHandled : Boolean) of object; TBeforePrintEvent = procedure (Sender: TObject; DataID : Integer) of object; TPrintReport = Record DeviceType : TDeviceTypes; FileName : String; DocumentType : TDocumentType; StandardFileName : String; ExportFileNameList : TStringList; DocumentIDs : TList; End; TPrintingFrame = class(TFrame) btnAbbrechen: TJvImgBtn; btnDrucken: TJvImgBtn; JvBevel1: TJvBevel; navPanel: TJvNavigationPane; NavPageDrucker: TJvNavPanelPage; Label1: TLabel; Label2: TLabel; Label3: TLabel; cbPrinters: TJvComboBox; cbBinNames: TComboBox; cbPreview: TCheckBox; seCopyCount: TJvSpinEdit; NavPagePDF: TJvNavPanelPage; Label4: TLabel; FilenameEditPDF: TJvFilenameEdit; NavPageExcel: TJvNavPanelPage; Label5: TLabel; FilenameEditExcel: TJvFilenameEdit; procedure btnDruckenClick(Sender: TObject); procedure cbPrintersChange(Sender: TObject); procedure btnAbbrechenClick(Sender: TObject); private FPrintReport : TPrintReport; FReport : TppReport; FOnCancelClick : TNotifyEvent; FOnPrintClick : TPrintClickEvent; FOnAfterPrint : TNotifyEvent; FOnBeforePrint : TBeforePrintEvent; procedure GetStandardFileName(DocIDIndex : Integer = 0; SetIt : Boolean = false); public Procedure PrepareFrame(DocumentType : TDocumentType; Parameter1, Parameter2 : Integer); published Constructor Create(AOwner : TComponent); override; Destructor Destroy; override; Property Report : TppReport read FReport write FReport; Property PrintReport : TPrintReport read FPrintReport write FPrintReport; Property OnCancelClick : TNotifyEvent read FOnCancelClick write FOnCancelClick; Property OnPrintClick : TPrintClickEvent read FOnPrintClick write FOnPrintClick; Property OnAfterPrint : TNotifyEvent read FOnAfterPrint write FOnAfterPrint; Property OnBeforePrint : TBeforePrintEvent read FOnBeforePrint write FOnBeforePrint; end; Nun gut - also habe ich es nicht ausgelagert, sondern binde es direkt in eine Form ein. Dort wird es auch schön angezeigt, allerdings kann ich auf die neuen Eigenschaften/Ereignisse nicht zugreifen. Wie kann ich das jedoch hinbekommen? Gruß, Dominik |
Re: Frames mit neuen Eigenschaften/Ereignissen
Hallo Dominik,
wenn ich den Frame mit Datei|Neu|Frame entwerfe, dann im Projektverzeichnis speichere und anschließend seine Verwendung in meiner Form über die Standardpalette festlege, dann habe ich problemlos Zugriff auf die zum Frame gehörigen Komponenten. Was machst du anders? Freundliche Grüße vom marabu |
Re: Frames mit neuen Eigenschaften/Ereignissen
Hallo,
auf die Komponenten kann ich auch zugreifen - kein Problem. Diese sind mir aber egal - da ändert sich nichts dran. Ich habe zusätzliche Eigenschaften/Ereignisse entworfen. Ich möchte nämlich einen ReportBuilder-Report mit dem Frame verknüpfen. Das Frame kann dann alle Einstellungen automatisch vornehmen und ich muss das nicht für jeden Druck neu machen. Dazu muss ich aber wissen, wann der User auf "Drucken" klickt. Dafür habe ich dann ein onPrintButtonClick-Ereignis für das Frame eingebaut. Auf diese Ereignisse kann ich leider nicht zugreifen :-/ Zumindest nicht über den Objektinspektor. Per Quelltext sollte das gehen meine ich... Das möchte ich allerdings vermeiden. Gruß, Dominik |
Re: Frames mit neuen Eigenschaften/Ereignissen
Wenn du den Frame nicht installiert hast, kannst du auch nicht mit dem Object Inspector auf seine properties zugreifen - und installieren willst du ja auch nicht. Ein Teufelskreis. Kannst du nicht einfach die bereits registrierten Ereignisse der Komponenten in deinem Frame verwenden?
marabu |
Re: Frames mit neuen Eigenschaften/Ereignissen
Ehrlich gesagt weiß ich gerade nicht, was du meinst. Welche bereits registrierten Ereignisse meinst du?
Ich habe mir jetzt so geholfen, dass ich die Zuweisungen, der (zum Glück nur wenigen) Properties beim Starten der Form, die das Frame beinhält, mache:
SQL-Code:
Finde ich zwar eher unschön - aber geht jetzt nicht anders.
procedure TPrintingInvoiceForm.ModuleFormStart(Sender: TObject; Parameter1,
Parameter2: Integer; var Stop: Boolean); begin PrintingFrame.Report := ppRepInvoice; PrintingFrame.OnCancelClick := PrintingFrameCancelClick; PrintingFrame.OnBeforePrint := PrintingFrameBeforePrint; PrintingFrame.OnAfterPrint := PrintingFrameAfterPrint; PrintingFrame.PrepareFrame(ModuleAction, Parameter1, Parameter2); end; Gehe ich denn recht in der Annahme, dass eine Installation ohne Auslagerung in Package, etc. nicht möglich ist? Viele Grüße und schon mal danke, Dominik |
Re: Frames mit neuen Eigenschaften/Ereignissen
Mit registrierten Ereignissen meine ich z.B. OnClick des Buttons, den du auf deinen Frame packst und dessen Caption du auf "Abbrechen" setzt. Wenn ich dich richtig verstehe, dann suchst du nach einer Möglichkeit deine event handler per Object Inspector zu setzen. Da du deinen Frame ja ohne Installation als Unit im Projekt führst, kannst du doch das Ereignis OnClick des CancelButton auch im OI manipulieren. Was gewinnst du denn, wenn du eine zusätzliche property OnCancelClick deklarierst?
Und was das Installieren angeht - ja, damit du eine Komponente installieren kannst, musst du sie in ein package aufnehmen. marabu |
Re: Frames mit neuen Eigenschaften/Ereignissen
Ich würde eine Menge dadurch gewinnen, dass ich diese "neuen" Ereignisse hätte:
Der Standard-Ablauf ist folgender: Der Benutzer klickt auf den Button "Drucken". Dann kümmert sich das Frame vollkommen automatisch dadrum, dass der Report vorbereitet wird, bestimmte Eigenschaften, wie ausgewählter Drucker, etc. eingestellt werden und so weiter. Dann wird das Ereignis OnBeforePrint gefeuert mit einer DokumentenID (i.d.R. Rechnungsnummer oder ähnlicher Primärschlüssel). Dann kann das Fenster eine Query öffnen, so dass das richtige Dokument gedruckt wird. Dann kommt wieder das Frame zum Einsatz und startet den tatsächlichen Druck. Da ich auch PDF-Dateien erstellen lassen kann und evtl. auch einen eMail-Versand einbauen möchte, kommt da schon einiges an Funktionalität zusammen, was ich nicht für jeden Druck copy&pasten möchte. Daher hat das Frame diese Ereignisse. Wenn ich nun im OI einfach einen neuen Ereignishandler für den Drucken-Button schreiben muss, bringt mir das Frame nicht mehr ganz so viel, bzw. ist nicht so simpel wie gewünscht einsetzbar. Viele Grüße, Dominik |
Re: Frames mit neuen Eigenschaften/Ereignissen
Okay, das kann ich nachvollziehen. Ich würde die Zusatzlogik aber nicht an das Frame koppeln, sondern eine Komponente entwerfen (TPrintManager), die mir eine weitgehende Trennung von Funktion und Visualisierung gestattet. Wenn du diese Komponente abstrakt genug hältst, dann wirst du sie sicher gerne installieren und hast so dann den gewünschten Zugriff auf ihre properties im Object Inspector.
marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 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