Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Komponente - Constructor MainForm.Hide = Access Violation??? (https://www.delphipraxis.net/104403-komponente-constructor-mainform-hide-%3D-access-violation.html)

p.abend 3. Dez 2007 12:35


Komponente - Constructor MainForm.Hide = Access Violation???
 
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Nuclear-Ping 3. Dez 2007 12:40

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Wo wird denn die Komponente erzeugt?

Sie darf auf jeden Fall NICHT im MainForm-Create sein. Also wenn deine Hauptform Form1 heisst und du die Komponente auf Form1 packst bzw. in Form1.OnCreate erzeugst, ist klar, dass es da knallt. Denn da gibt es noch keine "MainForm" im Programm, sondern erst, nachdem FormCreate durchgelaufen ist (... und wahrscheinlich noch 'n paar Events später).

mashutu 3. Dez 2007 12:45

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Zitat:

Zitat von p.abend
Hallo !

Wenn ich die Anwendung mit der Komponente ausführe bekomme ich eine Access Violation, vermutlich mal wegen meiner MainForm.Hide Anweisung, aber wie kann man soetwas denn sonst machen?

"Soetwas"? Was willst du denn machen?

Auf jeden Fall ist es eine schlechte Idee 'soetwas' im Constructor des Mainforms zu veranstalten.

Ich rate jetzt mal:
Versuch im Constructor ein Flag zu setzen, das definiert, ob das Mainform oder das RegForm angezeigt werden soll

dann im Projektquelltext so etwas aehnliches wie:
Delphi-Quellcode:
...
Application.CreateForm(TfrmMain, frmMain);
if frmMain.statusFlag then
  Application.Run
else
begin
  frmMain.RunRegDlg
end;

Dazu muesstest Du eben noch die Methode RunRegDlg implementieren, die den entsprechenden Dialog anzeigt
Delphi-Quellcode:
frmRegDlg:=TfrmRegDlg.create(self);
frmRegDlg.showmodal;
frmRegdlg.free;
self.close;
[edit=SirThornberry]Delphi-Tags gesetzt - Mfg, SirThornberry[/edit]

p.abend 3. Dez 2007 14:07

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Also.. erstmal danke für das feedback!

Das ganze soll eine Komponente sein, die prüft ob eine Registrierungsdatei für die Anwendung vorhanden ist, oder nicht. Wenn nicht, dann soll nicht das mainForm angezeigt werden, sondern aus meiner Komponente ein Registrierungsformular.

Da das Programm ohne Registrierung nicht nutzbar sein soll, möchte ich das direkt nach dem Start prüfen und ausführen.

Die Idee die dahinter steckt ist, das ich meine Programme mit einfachem setzen meiner Komponente auf das Hauptformular schütze.

Wie das geht und ob das im Constructor geht ist eben die Frage. Das ist meine erste Komponente. Ich habe den Constructor gewählt, weil der ja beim Anwendungsstart ausgeführt wird.

Wichtig ist nur, das die Komponente das alles selber regeln soll, ohne das man später eine Zeile Code eingeben muss.

mashutu 3. Dez 2007 14:17

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Okay, dann mach es so wie ich oben geschrieben habe.

Setze ein Flag im constructor

Wenn das Flag gesetzt ist, entweder im Hauptprogramm den Reg-Dialog starten

oder im OnShow-event das Flag ueberpruefen und ggf. den RegDialog von dort aus starten.

sirius 3. Dez 2007 14:27

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Wenn du es nicht über Flags und Properties lösen kannst, dann könnten dir noch Messages helfen.

shmia 3. Dez 2007 16:26

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Delphi-Quellcode:
if Assigned(Application.MainForm) then // nur wenn es schon eine Mainform gibt
   Application.MainForm.Hide;          // dann verstecken

p.abend 3. Dez 2007 16:32

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Danke! Das werde ich mal ausprobieren. Melde mich dann wieder!

p.abend 3. Dez 2007 18:31

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Also das...

Delphi-Quellcode:
..
if Assigned(Application.MainForm) then // nur wenn es schon eine Mainform gibt
   Application.MainForm.Hide;          // dann verstecken
...
Funktioniert im Constructor nicht. Das Fenster wird ganz normal angezeigt.

Wie kann ich denn mit meiner Komponente auf das onShow Event von MainForm zugreifen? Denn Die Komponente soll ja alles steuern.

DeddyH 3. Dez 2007 18:41

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Und wenn Du es mal mit
Delphi-Quellcode:
Application.ShowMainForm := false
versuchst? Ist nur so ein Gedanke.

p.abend 3. Dez 2007 18:44

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Hallo Deddy!

So scheint es zu funktionieren. Vielen dank an dich und alle anderen die mir geholfen haben.

p.abend 4. Dez 2007 06:37

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Also langsam bekomme ich graue Haare,

wieso funktioniert das...

Delphi-Quellcode:
..
Application.ShowMainform := false;
Application.Messagebox('irgendwas','Irgendwas', MB_ICONINFORMATION + MB_OK);
..
aber das...

Delphi-Quellcode:
..
Application.ShowMainform := false;
RegForm.Show;
..

nicht? Bekomme mit diesem Versuch immer eine Access Violation...

cruiser 4. Dez 2007 07:22

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Wenn die RegForm vor der MainForm angezeigt werden soll, warum löst du das dann nicht in der Projekt-Datei, wo ja auch die Mainform erzeugt wird?

p.abend 4. Dez 2007 07:34

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Ganz einfach, weil es darum geht, das die Komponente den Spaß regelt, ein zusätzliches editieren in Projekt Dateien oder Quellcode soll nicht notwendig sein.

Das muss doch auch irgendwie so zu lösen sein...

cruiser 4. Dez 2007 15:41

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Wenn die Compo auf der Mainform liegt kannst du die Mainform nicht verstecken, da die Komponente erzeugt wird noch bevor Mainform.OnCreate aufgerufen wird.

ABER: Die Form wird noch gar nicht angezeigt. Versuch mal die Dialogform statt mit Show mit Showmodal aufzurufen. Dann dürfte er das Prog erst fortführen wenn die Eingabe abgeschlossen ist.

p.abend 4. Dez 2007 16:56

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Also so wie ich das sehe funktioniert mein Vorhaben nicht.

Naja, dann trotzdem danke.

DeddyH 4. Dez 2007 16:58

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Und wenn Du das Anzeigen der RegForm nach Loaded verschiebst?

sirius 4. Dez 2007 17:00

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Delphi-Quellcode:
RegForm:=TRegform.create(application);
regform.show;
Und Regform darf nicht automatisch erzeugt werden.

cruiser 4. Dez 2007 19:49

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Oder halt so.. (ungetestet)
Code:
RegForm:=TRegform.create([color=#ff003f]nil[/color]);
regform.show[color=#ff003f]modal[/color];

p.abend 5. Dez 2007 11:58

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Es hat jetzt dank eurer Hilfe tatsächlich funktioniert.
Ich bin beeindruckt. Darauf wäre ich nicht gekommen.

Habe es jetzt ins Loaded geschrieben.

Delphi-Quellcode:
..
procedure TMyAppReg.Loaded;
begin
  if Check = false then
  begin
  // Wenn Prüfung Fehlerhaft
  if FRegShowDialog = false then
  begin
   // Anwendung einfach beenden
   Application.Terminate;
  end
  else begin
   // RegForm anzeigen
   Application.ShowMainForm := false;
   RegForm := TRegform.create(nil);
   RegForm.showmodal;
  end;
 end;
end;
..

Vielen Dank nochmal!

p.abend 5. Dez 2007 13:46

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Jetzt habe ich doch noch eine Frage!

Wie kann ich denn jetzt von meinem RegForm aus auf die Variablen meiner Klasse zugreifen?

shmia 5. Dez 2007 16:09

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Zitat:

Zitat von p.abend
Wie kann ich denn jetzt von meinem RegForm aus auf die Variablen meiner Klasse zugreifen?

Das "tun man nicht", da es nicht objekt-orientiert ist.
Stattdessen bietet TRegForm ein oder mehrere Properties an:
Delphi-Quellcode:
else begin
   // RegForm anzeigen
   Application.ShowMainForm := false;
   RegForm := TRegform.create(nil);
   // Daten an Regform übergeben
   RegForm.ApplicationName := self.fApplicationName;
   if RegForm.showmodal = mrOK then
   begin
      // und auch entgegen nehmen
      self.regkey := RegForm.RegKey;
   end;
  end;

p.abend 5. Dez 2007 18:31

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Oh das wusste ich nicht! Danke für deine Hilfe.
Habe nur ein Problem, der kann mit der Zeile hier nichts anfangen...

Delphi-Quellcode:
..
RegForm.ApplicationName := self.fApplicationName;
..
Zitat:

[Pascal Fehler] RegUnit.pas(77): E2003 Undefinierter Bezeichner: 'ApplicationName'
Muss ich jetzt noch was beachten oder habe ich was falsch gemacht?

DeddyH 5. Dez 2007 18:36

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Hast Du denn eine Property ApplicationName im RegForm deklariert?

p.abend 5. Dez 2007 18:50

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Hatte ja am Anfang kurz geschrieben, dass das meine erste Kompo ist. Ich wusste nicht das ich noch eine property im RegForm anlegen muss.

Muss ich dann auch noch eine Property in meiner Klasse anlegen die ApplicationName heißt?

Ist das so für das Formular richtig?
Delphi-Quellcode:
  public
    { Public-Deklarationen }
    property ApplicationName: string;
  end;

DeddyH 5. Dez 2007 18:55

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Besser wäre
Delphi-Quellcode:
private
  FApplicationName: string;
public
  property ApplicationName: string read FApplicationName write FApplicationName;
end;
Und im Konstruktor FApplicationName gleich auf '' setzen.

p.abend 5. Dez 2007 19:05

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Also ich vermute mal das ich etwas falsch mache, denn der Wert wird nicht angezeigt.

mein RegForm
Delphi-Quellcode:
...
unit RegForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TRegForm = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Edit6: TEdit;
    Edit7: TEdit;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Button2: TButton;
    Button3: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FApplicationName: String;
  public
    { Public-Deklarationen }
    FRegCode: String;
    FRegWebsite: String;
    FRegExeName: String;
    FRegExtension: String;
    FRegFileName: String;
    FRegCustomerName: String;
    FRegCustomerEmail: String;
    FRegCustomerSerial: String;
    property ApplicationName: string read FApplicationName write FApplicationName;
  end;

var
  RegForm: TRegForm;

implementation

{$R *.dfm}

procedure TRegForm.Button2Click(Sender: TObject);
begin
 showmessage(fregcode);
end;

end.
...

Und in meiner Klasse steht jetzt
Delphi-Quellcode:
...
  strict private
    { Private-Deklarationen }
    ...
    FApplicationName: String;
  public
    { Public-Deklarationen }
    property ApplicationName : string read FApplicationName write FApplicationName;
...

DeddyH 5. Dez 2007 19:09

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Wo wird er nicht angezeigt?

p.abend 5. Dez 2007 19:16

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Im RegForm mit der Methode

Delphi-Quellcode:

procedure TRegForm.Button2Click(Sender: TObject);
begin
 showmessage(fregcode);
end;

DeddyH 6. Dez 2007 07:40

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Du setzt eine Property ApplicationName und fragst dann eine Variable fRegCode ab? :gruebel:

shmia 6. Dez 2007 10:01

Re: Komponente - Constructor MainForm.Hide = Access Violatio
 
Du brauchst auf TRegForm nicht mal Variablen; du kannst ein Property gleich einem Edit zuweisen:
Delphi-Quellcode:
   // ich lass den Prefix Reg mal weg, denn man weiss ja schon anhand der Klasse
    // worum es geht
    property FileName: String read GetFileName write SetFileName;
...
implementation
...
function TRegForm.GetFileName:string;
begin
  // du solltest deinen Controls wirklich lesbare Namen geben (Edit1 - Edit5 ist nicht so toll)
  Result := Edit4.Text;
end;

procedure TRegForm.SetFileName(const Value:string);
begin
  Edit4.Text := Value;
end;
Mit dieser Technik hast du die Daten sauber gekapselt, und der Code wird gut lesbar.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 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