![]() |
nachgeladene Form Fenster Drucken
Hallo !
Ich habe in meinem Programm 2 Formen! Form2 wird mit Form-create erzeugt, dann möchte ich form2-fenster Drucken (Form2.Print). aber es gibt eine fehler meldung nach dem ich versuche zu Druken. Hier ist Code...
Delphi-Quellcode:
[delphi]
procedure TForm1.Button1Click(Sender: TObject);
var LDialog: TForm2; begin LDialog := TForm2.create(self); try LDialog.showmodal; finally FreeAndNil(LDialog); end; end; .................................................................. procedure TForm2.Button1Click(Sender: TObject); begin Form2.Print; end; danke Mfg |
Re: nachgeladene Form Fenster Drucken
würdest du uns den Fehelr verraten???????????
ich tippe auf eine AV weil dabei
Delphi-Quellcode:
form2 nie initialisert wird. schließlich weißt du die instanz der Variable Dialog zu.
procedure TForm2.Button1Click(Sender: TObject);
begin Form2.Print; end; Abhilfe schafft
Delphi-Quellcode:
Das ist auch im Sinne der Objectorientierung.
procedure TForm2.Button1Click(Sender: TObject);
begin Self.Print; end; |
Re: nachgeladene Form Fenster Drucken
Hallo
eine fehler meldung :Adresse 0000000000 nicht gefunden usw. mfg |
Re: nachgeladene Form Fenster Drucken
hab ichs doch geahnt, die Lösung hab ich ja schon gepostet.
|
Re: nachgeladene Form Fenster Drucken
OK
ich werde probieren danke dir .... |
Re: nachgeladene Form Fenster Drucken
Moin,
eine kleine Anmerkung habe ich da noch: TForm sollte nicht mit FREE zerstört werden, sondern mit RELEASE MfG Thorsten |
Re: nachgeladene Form Fenster Drucken
@omata: Warum mit Release? Mit Release wird doch einfach nur eine message an das Form gepostet welches ein Free aufruft. Somit würde Release nur sinn machen wenn das free innerhalb des gleichen Forms aufgerufen wird. Da aber in diesem Fall FreeAndNil von außerhalb des zu zerstörenden Forms aufgerufen wird, macht Free (FreeAndNil) mehr Sinn.
@spartakus: Wenn das Problem gelöst ist (was es mit der geposteten Lösung ist) dann kennzeischne den Thread als erledigt und lasse ihn nicht weiter als offene Frage.. |
Re: nachgeladene Form Fenster Drucken
War nur ein Hinweis, mach wie du willst.
Aber siehe Delphi-Hilfe: Beschreibung: Mit Release können Sie das Formular aus dem Speicher entfernen. Release gibt das Formular erst frei, nachdem die Ausführung der Ereignisbehandlungsroutinen des Formulars und seiner untergeordneten Komponenten beendet ist. Die Methode stellt auch sicher, daß alle Botschaften in der Ereigniswarteschlange des Formulars vor dessen Freigabe bearbeitet werden. Jede Ereignisbehandlungsroutine für das Formular oder für dessen untergeordnete Objekte sollte Release anstelle von Free (Delphi) oder Delete (C++) benutzen. Ansonsten kann ein Speicherzugriffsfehler auftreten. Hinweis: Release gibt die Steuerung sofort an die aufrufende Routine zurück und wartet nicht, bis das Formular freigegeben wird. MfG Thorsten |
Re: nachgeladene Form Fenster Drucken
@omata: Laut Hilfe stimmt dies zum teil. Angenommen folgende Situtation ist gegeben
Delphi-Quellcode:
In diesem Fall muss man Release verwenden da das Form frühestens nach Beendigung de Procedure zerstört werden soll. Würde man Free nehmen gäbe es dann bei "Caption := ..." eine AV.
procedure TForm1.DoSomeThing;
begin ShowMessage('Hallo'); //Free or Release? Caption := 'Test'; end; Für den Rest dürfte es allerdings keine Rolle spielen. Natürlich könnte jetzt das Argument kommen das bei Release noch Messages abgearbeitet werden. Aber wer/was verhindert das nach Release noch eine Message an das Programm geschickt wird bevor die Message von Release abgearbeitet wird. Niemand/Nichts und somit wäre man wieder am Anfang - nämlich das nicht alle Nachrichten abgearbeitet sind. Der Vorteil von Release ist einfach nur der das, das Form erst freigegeben wird wenn die Message abgearbeitet ist welche von Release gesendet wird. Wenn allerdings folgende Situtation gegeben ist
Delphi-Quellcode:
so spielt es keine Rolle ob man Release oder Free nimmt, denn durch das "Application.ProcessMessages" wird die Message zum freigeben des Formulars auch abgearbeitet bevor das Ende der Procedure erreicht wird und eine AV sollte ebenfalls damit auftreten.
procedure TForm1.DoSomeThing;
begin ShowMessage('Hallo'); //Free or Release? Application.ProcessMessage; Caption := 'Test'; end; Kurz und Knapp. Wenn man weiß das, das Form und dessen unterkomponenten gerade nichts abarbeiten kann man auch free nutzen, und das sollte hier auch der Fall sein, denn die Anweisung wird ja erst ausgeführt wenn ShowModal zurück gekehrt ist, und dies setzt ja auch vorraus das die wm_close-Nachricht abgeabeitet wurde und somit ist ausgeschlossen das sich die Anwendung gerade in einer Procedure befindet. |
Re: nachgeladene Form Fenster Drucken
Tja, und das ist eben die Frage, wenn man weiss was man tut...
Der sichere Weg für TForm ist Release. Natürlich kann man sich überlegen, wie man Dinge auch anders hinbekommt. Aber ich vertrete die Ansicht, sicher zu programmieren. Wenn man ein Programm erstellt, weiss man nicht was da noch alles mal geändert wird. Wenn man also in der Zukunft nicht über Fehler stolpern will, die man gemacht hat, weil man Annahmen gemacht hat, die dann nicht mehr eingehalten werden. Dann sollte man sicher programmieren. Bezogen auf die aktuelle Frage bedeutet dass, wenn ich in dem Button-Ereignis z.B. die Form über Self.Print ausdrucke und danach ModulResult setzt, um die Form zuverlassen. Dann könnte ich mir vorstellen, dass es zu einer AV kommt. (mit Release aber nicht) Wie dem auch sei, macht was ihr wollt... MfG Thorsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 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