![]() |
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:
und hier der Befehl in der Form2
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;
Delphi-Quellcode:
hoffe jemand kann mir weiterhelfen damit der fehler nicht mehr kommt.
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; SORRY das WAR ein FEHLER beim Tippen mit der 7 ist im Code schon eine 2 :( |
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 |
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.
|
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:
reingeschrieben habe..
Application.Terminate();
das vorhin war ein Schreibfehler..ist korrigiert worden |
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 |
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
|
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 |
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 :( |
Re: Anzeige der Nebenform vor der Hauptform
Nicht aufgeben. Ich hoffe nur du erzeugst die Form2 nicht im OnCreate deiner MainForm.
marabu |
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: |
Re: Anzeige der Nebenform vor der Hauptform
Hast du schon den Projekt-Quelltext verglichen?
marabu |
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. |
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:
wie gesagt, nicht dass ich hier als Trottel dastehe der gar nichts auf die Reihe bringt :(
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; 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 |
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 ?? |
Re: Anzeige der Nebenform vor der Hauptform
Hast du auch den Code in Form2 angepasst?
Delphi-Quellcode:
Und im Projekt-Quelltext (DPR) steht jetzt:
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;
Delphi-Quellcode:
marabu
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. |
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:
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 ??
... on Create der Nebenform
button1click(button1); ... und an Marabu super vielen Dank für deine Geduld und die Mühen die du bisher aufgebracht hast |
Re: Anzeige der Nebenform vor der Hauptform
Das sollte ohne Probleme so funktionieren:
Delphi-Quellcode:
marabu
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; |
Re: Anzeige der Nebenform vor der Hauptform
Delphi-Quellcode:
das geht auch bei mir und im OnCreate habe ich
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;
Delphi-Quellcode:
und nun geht eben der ButtonClick nicht automatisch..aber NUR wenn eben der Ini-String-Eintrag bereits existiert und ins fenster geladen wurde :gruebel:
var ini : TIniFile;
begin ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'test.ini'); Edit2.Text := Ini.ReadString('Text', 'test',''); Button1Click(Button1); |
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:
Im OnDestroy der Form schreibst du dann ini.Free rein und im ButtonClick entfällt das Create für die Ini-Variable dann.
begin
ini := TMemIniFile.Create(ExtractFilePath(ParamStr(0)) + 'test.ini'); Edit2.Text := ini.ReadString('Text', 'test', ''); Button1Click(Button1); end; marabu |
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: |
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:
marabu
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. |
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 |
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 |
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: |
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 |
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 23:31 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