Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Anzeige der Nebenform vor der Hauptform (https://www.delphipraxis.net/61993-anzeige-der-nebenform-vor-der-hauptform.html)

Avax2k 29. Jan 2006 12:57


Anzeige der Nebenform vor der Hauptform
 
Hallo, habe abermals ein Problem und weiss nicht mehr weiter...

Ich verwende folgenden Code um ein Fenster vor der MainForm einzublenden..das funktioniert auch tadellos... nur wenn ich bei dem eingeblendeten Fenster den Befehl Free verwende bekomme ich immer eine Fehlermeldung, dann geht das Programm aber weiter. Lasse ich free weg bleibt das Fenster immer im Vordergrund aber im Hintergrund wird die Hauptform gestartet..

hier der Code

Delphi-Quellcode:
Form2 := TForm2.Create(Application);
Form2.Edit1.Text := 'Hallo';
ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'test.ini');
Form2.Edit2.Text := Ini.ReadString('Text', 'Test','');
Form2.Button1Click(Form2.Button1);
....
...
...
Form2.ShowModal;
end;
und hier der Befehl in der Form2

Delphi-Quellcode:
var ini : TIniFile;
begin
ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+ 'test.ini');
if Edit2.Text = 'hallo' then
begin
ini.WriteString('Text', 'Test', Edit2.Text);
Form2.Free;  // <---- hier kommt der Fehler her, denn lasse ich es weg funktioniert es aber Fenster bleibt bestehen :(
end else
Label1.Caption := 'Fehler';
end;
hoffe jemand kann mir weiterhelfen damit der fehler nicht mehr kommt.

SORRY das WAR ein FEHLER beim Tippen mit der 7 ist im Code schon eine 2 :(

marabu 29. Jan 2006 13:11

Re: Anzeige der Nebenform vor der Hauptform
 
Wenn du Form2 schließen willst, dann mache es mit Form2.ModalResult := mrOK und nicht mit Form7.Release - oder habe ich deinen Code falsch verstanden?

Grüße vom marabu

SirThornberry 29. Jan 2006 13:12

Re: Anzeige der Nebenform vor der Hauptform
 
was ist Form7? Ist Form7 das MainForm? Ansonsten entspricht der Quelltext nicht der Beschreibung, denn das Free wird ja nicht für Form2 ausgeführt sondern für irgend ein anderes was in deiner Beschreibung wohl fehlt.

Avax2k 29. Jan 2006 13:17

Re: Anzeige der Nebenform vor der Hauptform
 
das mit dem ModalResult := mrOK klappt nicht da Schließt sich dann die Anwendung komplett ..aber die Fehlermeldung ist weg..wie gesagt liegt ja auch am Form2.Free :(

vielleicht sollte ich noch erwähnen, dass ich in Die OnClose von Form2
Delphi-Quellcode:
Application.Terminate();
reingeschrieben habe..

das vorhin war ein Schreibfehler..ist korrigiert worden

marabu 29. Jan 2006 13:20

Re: Anzeige der Nebenform vor der Hauptform
 
Wenn du Form2 vor deiner MainForm anzeigen willst, dann erzeuge es mit Owner = NIL. Und schließe es mit einer Zuweisung an ModalResult.

marabu

Avax2k 29. Jan 2006 13:30

Re: Anzeige der Nebenform vor der Hauptform
 
okay wenn iches mit NIL erzeuge und ModalResult nehme dann schließt sich das Programm einfach.. wenn ich aber Form2.Free weiterhin nehme, dann bekomme ich immer noch den gleichen Fehler

marabu 29. Jan 2006 13:46

Re: Anzeige der Nebenform vor der Hauptform
 
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang siehst du eine Möglichkeit eine Form vor der MainForm anzuzeigen - ohne Fehler und ohne vorzeitiges Beenden der Anwendung.

marabu

Avax2k 29. Jan 2006 14:25

Re: Anzeige der Nebenform vor der Hauptform
 
danke für den Anhang funktioniert sehr gut


NUR eben nicht bei mir

ich habe ein Oncreate im Hauptfenster..deines ist da leer... habe alles eingestellt wie bei dir auch..und Active Control beim Form2 auch auf den Knopf gelegt aber jetzt wird mein Form2 gar nciht angezeigt sondern das hauptform erscheint sofort :( ich bin wohl zu blöde um das umzusetzen :(

marabu 29. Jan 2006 14:29

Re: Anzeige der Nebenform vor der Hauptform
 
Nicht aufgeben. Ich hoffe nur du erzeugst die Form2 nicht im OnCreate deiner MainForm.

marabu

Avax2k 29. Jan 2006 14:34

Re: Anzeige der Nebenform vor der Hauptform
 
nein ist alles raus in der Hauptform steht jetzt gar nichts mehr über die Form2 drin so als gäbe es sie nicht... ich komme einfach nicht darauf aus welchen gründen deine SpecialForm VOR der Hauptform startet..denn da ist gar kein Befehl drin und auch keine Einstellung an der ich das ändern könnte habe alles schon durchprobiert aber wahrscheinlich einfach nur übersehen.
Selbst wenn ich den ActiveControl deaktiviere bei Form2 wird diese als erste angezeigt :gruebel:

marabu 29. Jan 2006 14:39

Re: Anzeige der Nebenform vor der Hauptform
 
Hast du schon den Projekt-Quelltext verglichen?

marabu

Avax2k 29. Jan 2006 14:45

Re: Anzeige der Nebenform vor der Hauptform
 
yep aber aufgefallen ist mir nur das Var der Formen sonst nichts.

jetzt habe ich das einfach nachgebaut und siehe da meine Form1 startet immer als erste..kann es sein, dass du einfach die hauptform in Special Form umbenannt hast ?? und die MainForm eigentlich die Form2 ist..denn sonst kann ich mir nicht erklären wieso diese als erste startet.

Avax2k 29. Jan 2006 15:04

Re: Anzeige der Nebenform vor der Hauptform
 
ich bekomme es einfach nicht hin, weiss nicht wieso deine Form2 als erste startet ist mir einfach ein komplettes Rätsel denn als Code hat es nur einen Button bei der ActiveControl und wenn dieser weggelassen wird kommt die trotzdem als erste....

ich habe ein anders beispiel vorher gemacht dass einwandtfrei funktioniert NUR nicht wenn ich es in meine Anwendung einbinden will..ich meine bei einem neuen Projekt klappt das tadellos:

Delphi-Quellcode:
uses Unit2;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form2 := TForm2.Create(Application);
  try
  Form2.ShowModal;
  Application.Initialize;
  Form2.Update;
  if Form2.Edit1.Text = 'hallo' then
  begin
  Form2.Free;
  Application.Run;
  end else
  Application.CreateForm(TForm1, Form1);
  finally
end;
end;

uses Unit1;
procedure TForm2.Button1Click(Sender: TObject);
begin
if Edit1.Text = 'hallo' then
begin
  Form2.Close;
  end else
  ShowMessage('Leider ist die Eingabe falsch');
  end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Edit1.Text = 'hallo' then
begin
Form2.Close;
end else
Application.Terminate();
end;
wie gesagt, nicht dass ich hier als Trottel dastehe der gar nichts auf die Reihe bringt :(

JEDOCH mein Problem besteht immer noch ich bekomme Fehler und den Vorschlag von Marabu kann ich nicht umsetzen weil ich da gar nichts sehe als Unterschied im Quellcode außer eben diesem Button und dem ActiveControl ist da auch gar nichts mehr.

EDIT !!...
jetzt habe ich die dpr geöffnet und da steht was mit showModal usw. versuche das jetzt zu machen..aber finde es komisch dass ich dafür den Editor aufmachen musste denn Delphi hat mir nur die Formen angezeigt nicht aber die dpr :(..naja ich versuchs jetzt mal

Avax2k 29. Jan 2006 15:26

Re: Anzeige der Nebenform vor der Hauptform
 
so jetzt bekomme ich es hin, dass nun die Form2 als erste startet... ABER

meine ganzen Funktionen wie Edit1.Text = 'hallo' usw..
muss ich ausschalten sonst bekomme ich lauter Fehler :(

wie kann ich das lösen ??

marabu 29. Jan 2006 15:49

Re: Anzeige der Nebenform vor der Hauptform
 
Hast du auch den Code in Form2 angepasst?

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
  if Edit1.Text = Password
    then ModalResult := mrOK
    else ShowMessage(Password);
end;

procedure TForm2.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  if Edit1.Text = Password
    then ModalResult := mrOK
    else ModalResult := mrCancel;
end;
Und im Projekt-Quelltext (DPR) steht jetzt:

Delphi-Quellcode:
program Demo;

uses
  Forms,
  Controls,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

var
  mr: TModalResult;

begin
  with TForm2.Create(nil) do
  begin
    mr := ShowModal;
    Free;
  end;
  if mr = mrCancel then
    Exit;
   
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
marabu

Avax2k 29. Jan 2006 16:19

Re: Anzeige der Nebenform vor der Hauptform
 
so nun funktioniert es FAST perfekt...wies nur FAST..weil nun dieser befehl nicht richtig geht:

Delphi-Quellcode:
... on Create der Nebenform
button1click(button1);
...
beime rsten Start wenn keine INI-Datei erzeugt ist wird der Knopf ausgelöst..wenn aber ini-Datei erzeuigt ist und der Eintrag ins Editfeld geholt wird dann wird nicht mehr geklcikt..sprich der text steht drin und man muss manuell klicken dann gehts sofort weiter..frage mich nur wieso der automatische klick beim OnCreate nicht mehr geht wenn aus der ini-Date der text gelesen wird ??


und an Marabu super vielen Dank für deine Geduld und die Mühen die du bisher aufgebracht hast

marabu 29. Jan 2006 16:30

Re: Anzeige der Nebenform vor der Hauptform
 
Das sollte ohne Probleme so funktionieren:

Delphi-Quellcode:
procedure TLoginForm.LoginButtonClick(Sender: TObject);
var
  ini: TMemIniFile;
  fn: TFileName;
begin
  if PswdEdit.Text = PASSWORD then
  begin
    fn := ChangeFileExt(ParamStr(0), '.ini');
    ini := TMemIniFile.Create(fn);
    ini.WriteString('Einstellungen', 'LetzteAnmeldung', DateTimeToStr(Now));
    ini.UpdateFile;
    ini.Free;
    ModalResult := mrOK;
  end else ShowMessage('falsches Kennwort');
end;
marabu

Avax2k 29. Jan 2006 16:34

Re: Anzeige der Nebenform vor der Hauptform
 
Delphi-Quellcode:
procedure TLoginForm.LoginButtonClick(Sender: TObject);
var
  ini: TMemIniFile;
  fn: TFileName;
begin
  if PswdEdit.Text = PASSWORD then
  begin
    fn := ChangeFileExt(ParamStr(0), '.ini');
    ini := TMemIniFile.Create(fn);
    ini.WriteString('Einstellungen', 'LetzteAnmeldung', DateTimeToStr(Now));
    ini.UpdateFile;
    ini.Free;
    ModalResult := mrOK;
  end else ShowMessage('falsches Kennwort');
end;
das geht auch bei mir und im OnCreate habe ich

Delphi-Quellcode:
var ini : TIniFile;
begin
ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'test.ini');
Edit2.Text := Ini.ReadString('Text', 'test','');
Button1Click(Button1);
und nun geht eben der ButtonClick nicht automatisch..aber NUR wenn eben der Ini-String-Eintrag bereits existiert und ins fenster geladen wurde :gruebel:

marabu 29. Jan 2006 16:40

Re: Anzeige der Nebenform vor der Hauptform
 
Du verwendest TIniFile und hältst damit die Datei sehr wahrscheinlich offen. Nimm ini: TMemIniFile einfach zu deinen privaten Form-Variablen und im OnCreate schreibst du dann das:

Delphi-Quellcode:
begin
  ini := TMemIniFile.Create(ExtractFilePath(ParamStr(0)) + 'test.ini');
  Edit2.Text := ini.ReadString('Text', 'test', '');
  Button1Click(Button1);
end;
Im OnDestroy der Form schreibst du dann ini.Free rein und im ButtonClick entfällt das Create für die Ini-Variable dann.

marabu

Avax2k 29. Jan 2006 16:58

Re: Anzeige der Nebenform vor der Hauptform
 
leider ändert das MemIniFiles nichts daran...

und wenn ich das ini.Create weglasse im Button dann bekomme ich Violation Fehler aber eben nur einmal dann geht es weiter..mit ini.Create im Knopf kommt die Violation nicht aber wie gesagt der Button will nicht automatisch drücken..obwohl er ja geht wenn man manuell drückt kommt nichts..somit sollte er gehen :cry:

marabu 29. Jan 2006 17:19

Re: Anzeige der Nebenform vor der Hauptform
 
Der Button wird durch deinen Code nicht gedrückt, nur die Routine ButtonClick() wird ausgeführt. Das sollte kein Problem bereiten. Wahrscheinlich hast du irgendwo deinen Code nicht aufgeräumt - nach den vielen Änderungen. Ich habe dein Problem nochmal nachgestellt, allerdings ohne deine Komponentennamen. Über Sinn und Unsinn deiner Vorgehensweise möchte ich mir besser keine Gedanken machen.

Delphi-Quellcode:
unit SpecialFrm;

interface

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

type
  TSpecialForm = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    ini: TMemIniFile;
  public
  end;

var
  SpecialForm: TSpecialForm;

implementation

{$R *.dfm}

const
  Password = 'hallo';

procedure TSpecialForm.Button1Click(Sender: TObject);
begin
  if Edit1.Text = Password then
  begin
    ini.WriteString('Abschnitt', 'Eintrag', Edit1.Text);
    ini.UpdateFile;
    ModalResult := mrOK;
  end else ShowMessage(Password);
end;

procedure TSpecialForm.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  if Edit1.Text = Password
    then ModalResult := mrOK
    else ModalResult := mrCancel;
end;

procedure TSpecialForm.FormCreate(Sender: TObject);
var
  fn: TFileName;
begin
  fn := ChangeFileExt(ParamStr(0), '.ini');
  ini := TMemIniFile.Create(fn);
  Edit1.Text := ini.ReadString('Abschnitt', 'Eintrag', '');
  Button1Click(nil);
end;

procedure TSpecialForm.FormDestroy(Sender: TObject);
begin
  ini.Free;
end;

end.
marabu

Avax2k 29. Jan 2006 17:31

Re: Anzeige der Nebenform vor der Hauptform
 
habe gerade alles nochmal nachgeprüft und sogar gegen deinen Code ersetzt

Ergebnis

der Knopf wird immer noch nicht gedürckt..ich muss immer selbst drücken :(

wenn ich in Button1Click(Button1) oder Button1Click(nil) mache geht es einfach nicht

marabu 29. Jan 2006 17:52

Re: Anzeige der Nebenform vor der Hauptform
 
Ich habe doch geschrieben - der Knopf wird nicht gedrückt, aber der Code wird ausgeführt. Was erwartest du denn? Dass die Form automatisch geschlossen wird? Bedenke, dass du das ModalResult im OnCreate setzt. Zu diesem Zeitpunkt ist das noch zu früh.

marabu

Avax2k 29. Jan 2006 17:55

Re: Anzeige der Nebenform vor der Hauptform
 
achso das soll bedeuten, dass was ich vorhabe, dass das Fenster sich automatisch schließt wenn alles stimmt ist unmöglich ?? und es muss obe man will oder nicht der Knopf gedrückt werden ??

wenn ja dann ist ja das alles was ich mit deiner Hilfe erstellt habe ja vollkommen nutzlos :(

außerdem verstehe ich das nicht...dass doch die Knopfprocedur ausgelöst wird wenn eben nichts in der ini steht..dann kommt die Meldung mit dem Fenster... wieso geht das dann nicht weiter wenn etwas drin steht ist doch das gleiche Prinzip und onCreat showmodal gesetzt und da geht es :wall:

marabu 29. Jan 2006 18:21

Re: Anzeige der Nebenform vor der Hauptform
 
Warum muss denn dein Fenster noch aufgehen, wenn alles schon stimmt? Da ist die Sache doch schon wurmig. Und dass ShowMessage() funktioniert, wenn du die ButtonClick Routine rufst. Das beweist, dass diese Routine aus dem OnCreate ausgeführt wird. Auch der Zweig, in dem du ModalResult setzt, wird ausgeführt - er bleibt zu diesem Zeitpunkt nur ohne Wirkung, weil der Wert erst später initialisiert und ausgewertet wird. Deine Form ist noch nicht modal zu diesem Zeitpunkt.

Vielleicht kannst du dich ja doch noch mit meinem Vorschlag aus der Demo anfreunden.

marabu

Avax2k 29. Jan 2006 18:35

Re: Anzeige der Nebenform vor der Hauptform
 
hab es nun mit einem Timer hinbekommen NUR dieser löst den Knopf ja in einem bestimmten Intervall aus.. werde versuchen da irgendwas zu ändern sodass er gar nciht aktiviert wird, wenn das Editfeld leer ist.. aber das ist denke ich, wenn dann ein anderer Topic.

Vieln super herzlichen Dank für deine wirklich sehr gute Unterstützung Marabu!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 Uhr.

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