Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi nachgeladene Form Fenster Drucken (https://www.delphipraxis.net/48964-nachgeladene-form-fenster-drucken.html)

spartakus 3. Jul 2005 14:24


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:
 procedure TForm1.Button1Click(Sender: TObject);
 var
  LDialog: TForm2;
 begin
  LDialog := TForm2.create(self);
  try
    LDialog.showmodal;

  finally
    FreeAndNil(LDialog);
  end;
 end;
..................................................................
[delphi]
procedure TForm2.Button1Click(Sender: TObject);
begin
Form2.Print;
end;


danke Mfg

SirThornberry 3. Jul 2005 14:26

Re: nachgeladene Form Fenster Drucken
 
würdest du uns den Fehelr verraten???????????

ich tippe auf eine AV weil dabei
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
  Form2.Print;
end;
form2 nie initialisert wird. schließlich weißt du die instanz der Variable Dialog zu.
Abhilfe schafft
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
  Self.Print;
end;
Das ist auch im Sinne der Objectorientierung.

spartakus 3. Jul 2005 14:32

Re: nachgeladene Form Fenster Drucken
 
Hallo
eine fehler meldung :Adresse 0000000000 nicht gefunden usw.

mfg

SirThornberry 3. Jul 2005 14:37

Re: nachgeladene Form Fenster Drucken
 
hab ichs doch geahnt, die Lösung hab ich ja schon gepostet.

spartakus 3. Jul 2005 14:52

Re: nachgeladene Form Fenster Drucken
 
OK
ich werde probieren

danke dir ....

omata 3. Jul 2005 16:49

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

SirThornberry 3. Jul 2005 17:12

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..

omata 3. Jul 2005 17:34

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

SirThornberry 3. Jul 2005 17:47

Re: nachgeladene Form Fenster Drucken
 
@omata: Laut Hilfe stimmt dies zum teil. Angenommen folgende Situtation ist gegeben
Delphi-Quellcode:
procedure TForm1.DoSomeThing;
begin
  ShowMessage('Hallo');
  //Free or Release?
  Caption := 'Test';
end;
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.

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:
procedure TForm1.DoSomeThing;
begin
  ShowMessage('Hallo');
  //Free or Release?
  Application.ProcessMessage;
  Caption := 'Test';
end;
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.

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.

omata 3. Jul 2005 17:57

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 09:43 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz