AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Form aufrufen und anpassen

Ein Thema von Remedy7 · begonnen am 28. Sep 2010 · letzter Beitrag vom 14. Okt 2010
Antwort Antwort
Seite 1 von 2  1 2   
Remedy7

Registriert seit: 9. Sep 2010
7 Beiträge
 
#1

Form aufrufen und anpassen

  Alt 28. Sep 2010, 10:50
Delphi-Version: 2006
Hallo Forum,

hatte vor kurzen die beliebte Frage danach eine Form mehrfach zu öffnen.
Die sah in meinem Programm nach tatkräftiger Unterstützung der User dann so aus:

Delphi-Quellcode:
 MyForm:Array of TForm2
      setlength(MyForm,11)

      for t := 0 to 10 do begin
        MyForm[t] := Form5.Create(Application);
        MyForm[t].show;
      end;
   begin
      for i:=1 to Eingabe do

      begin
        MyFrm := TForm5.Create(Application.MainForm);
        MyFrm.Left := Random(Screen.Width - Form5.Width) +1;
        MyFrm.Top := Random(Screen.Height - Form5.Height) +1;
        MyFrm.Show;
      end;
Leider war das nicht sehr zufriedenstellend da die Formen keine Bezug zur eigentlichen Form hatten.

Dann habe ich es über Buttons realisiert:
Delphi-Quellcode:
procedure TForm2.Button10Click(Sender: TObject);
var
  i: Integer;
begin
with TForm5.Create(Application.MainForm) do; //self

begin
  for i := 1 to 1 do


  Form5.left:= Random(Screen.Width - Form5.Width);
  Form5.Top:= Random(Screen.Height - Form5.Height);
  Form5.caption:= Form2.Label22.caption;
  Form5.Name := Form2.Label22.caption;
  Form5.Show;

end;
end;
Anhand von "Form5.caption:= Form2.Label22.caption" sollte man auch sehen was ich mit Bezug meine.

Auch das funktioniert nur leider ist es so das mir Form 5 zwar neu geöffnet wird aber dafür die vorher geöffnete Form5 geschlossen wird.

Wie kann ich das lösen das die "alte" Form5 geöffnet bleibt obwohl ich mit einem anderen Button die Form nochmal öffne?


BEste Grüße
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.536 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Form aufrufen und anpassen

  Alt 28. Sep 2010, 10:57
Wenn Du die Variable Form5 ansprichst, ist damit auch eine ganz bestimmte Instanz gemeint. Wie ist es so?
Delphi-Quellcode:
procedure TForm2.Button10Click(Sender: TObject);
var
  i: Integer;
begin
with TForm5.Create(Application.MainForm) do //self

begin
  for i := 1 to 1 do


  {Form5.}left:= Random(Screen.Width - Form5.Width);
  {Form5.}Top:= Random(Screen.Height - Form5.Height);
  {Form5.}caption:= Form2.Label22.caption;
  {Form5.}Name := Form2.Label22.caption;
  {Form5.}Show;

end;
end;
Oder besser unter Verzicht auf "With":
Delphi-Quellcode:
procedure TForm2.Button10Click(Sender: TObject);
var
  Frm: TForm5;
begin
  Frm := TForm5.Create(Application.MainForm);
  Frm.left:= Random(Screen.Width - Frm.Width);
  Frm.Top:= Random(Screen.Height - Frm.Height);
  Frm.caption:= Form2.Label22.caption;
  Frm.Name := Form2.Label22.caption;
  Frm.Show;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
GHorn

Registriert seit: 24. Mär 2009
Ort: NRW
124 Beiträge
 
#3

AW: Form aufrufen und anpassen

  Alt 28. Sep 2010, 11:11
Der Frm.Name muss aber eindeutig sein. Und nur so kannst Du die
diversen Forms auch kontrolliert wieder schließen.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Form aufrufen und anpassen

  Alt 28. Sep 2010, 11:14
Ach dieses With, das macht doch alles unübersichtlich. Ich übersetze mal deinen Code in "ohne-with-Code":
Delphi-Quellcode:
var
  x : TForm5; // Variable von with
begin
  x := TForm5.Create(Application.MainForm);
  for i := 1 to 1 do
    Form5.left:= Random(Screen.Width - Form5.Width);
  Form5.Top:= Random(Screen.Height - Form5.Height);
  Form5.caption:= Form2.Label22.caption;
  Form5.Name := Form2.Label22.caption;
  Form5.Show;
Und jetzt solltest du dich fragen, was du genau gemacht hast: Ich weiß es nicht aber das with hat keine Auswirkungen, weil es kein Attribut oder Methode gibt in der Klasse TForm5 die Form5 heißt.

Was du eher machen willst, hat dir DeddyH schon gezeigt. Wobei die For-schleife einerseits begin und end haben sollte und andererseits außerhalb des withs sein sollte. Warum? Naja du erstellst einmal das Formular, aber du setzt die Eigenschaften (aktuell) einmal. Würde die Schleife zweimal laufen würde, alles zweimal gesetzt werden, aber keine neue Form erstellt.

Und zu einem anderen Punkt: Wo ist Form5 definiert? Vermutlich in der Unit5 in so einem var Abschnitt:
Delphi-Quellcode:
var
  Form5 : TForm5;
Dann gebe ich dir einen Tipp: Benutze nie nie nie nie nie diese Variable Es gibt Ausnahmen, aber in der Regel wirst du sie nicht brauchen und Probleme schaffen.

Stattdessen nutze entweder die interne Variable von with, oder (mein Vorschlag) verzichte auf das with und lege eine lokale Variable an (siehe DeddyH).

MfG
Fabian

PS: @GHorn: Bedingt: Da er einen Owner angibt, werden sie automatisch geschlossen bzw. freigegeben.
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

AW: Form aufrufen und anpassen

  Alt 28. Sep 2010, 12:15
@xZise: du hast aber selbst oben die Variable "Form5" benützt obwohl wie die Instanz in Variable "x" erzeugt hast.
Sicher nur im Eifer des Gefechts; kannst ja noch korrigieren.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Form aufrufen und anpassen

  Alt 28. Sep 2010, 14:05
Naja ganz 100% muss das nicht stimmen. Und zwar dann, wenn die Klasse TForm5 ein öffentliches Attribut oder Methode hat die auch Form5 heißt. Dann weiß ich nicht, was with da bevorzugt. Ich meine es ist ja quasi x.[...] innerhalb von with. Das ist nur nicht der Fall, wenn x.[...] in den Moment nicht gültig wäre. Zum Beispiel:
Delphi-Quellcode:
with TButton.Create(nil) do
begin
  Caption := 'Foo';
  Text := 'Text';
end;
Die erste Zeile funktioniert und der Button ist vermutlich mit Foo beschriftet, bei der zweiten Zeile funktioniert es allerdings nicht, da TButton keine Eigenschaft Text hat. Das heißt, wenn das z.B. ein TEdit wäre (oder davon abgeleitet), dann würde in diesem Fall da stehen:
Delphi-Quellcode:
x : TButton;

x := TButton.Create(nil);
x.Caption := 'Foo';
Self.Text := 'Text';
Es kann natürlich sein, dass ich tatsächlich was übersehen habe, aber ich bin mir sicher, dass es tatsächlich so "übersetzt" würde. Und mein Code soll natürlich keine Korrektur sein sondern eine Übersetzung.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.536 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Form aufrufen und anpassen

  Alt 28. Sep 2010, 14:20
Zum Sinn und Unsinn von with gibt es hier schon einige Threads. Ich kann nur raten, auf dessen Gebrauch zu verzichten, da dieser u.U. zu unvorhergesehenen Effekten führen kann. Wenn es so implementiert worden wäre wie in (Visual) Basic, dann sähe das vielleicht anders aus (dass ausgerechnet ich mal VB lobe hätte ich mir auch nie träumen lassen ).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Remedy7

Registriert seit: 9. Sep 2010
7 Beiträge
 
#8

AW: Form aufrufen und anpassen

  Alt 29. Sep 2010, 18:22
Hallo,

entschuldigt die verspätete Antwort.

Also Fprm5 ist aus Unit5 ja.

Ich habe dann mal die beiden Beispiele ausprobiert aber leider besteht weiter das Problem das Form5 nicht neu geöffnet wird sondern quasi die alte einfach überschrieben wird.
Sie soll aber immer wieder neu erstellt werden...


Schonmal dank für die aufschlussreichen Beiträge und die Hilfe.
Ich kann leider immer nur Abends mal ein bis 2 Stündchen an Delphi arbeiten und werde deshalb nur langsam schlauer

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#9

AW: Form aufrufen und anpassen

  Alt 29. Sep 2010, 22:29
Du kannst den zweiten Code aus den zweiten Beitrag nehmen (den ohne with). Da sollte sich bei jedem klick auf den Button ein neues Fenster öffnen. Und wenn du mehrere Fenster brauchst, dann kannst du das in einer Schleife ausführen. Ich wollte die nur zeigen, was man immer verhindern sollte: Die Variablen wie Form5 zu nehmen. Dadurch handelst du dir nur Fehler ein. Aktuell kann ich nicht so viel und schnell tippen, aber wenn du willst kann ich es weiter ausführen.

Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Remedy7

Registriert seit: 9. Sep 2010
7 Beiträge
 
#10

AW: Form aufrufen und anpassen

  Alt 5. Okt 2010, 17:45
Guten Abend und Hallo xZise,

danke für die Hilfe, werde mal versuchen das ganze in eine Schleife zu packen.

Natürlich kannst du mir gern etwas erklären ich bin über jede Info dankbar...

MfG Remedy7
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 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