![]() |
AW: Problem mit OpenDialog
Moin,
ich will jetzt nicht als obermeckerer rüberkommen. Aber einmal mach einen neuen Thread auf ;) Zweitens hänge Bilder bitte als Anhang an. Und mit "instanziert" meinen wir, dass wenn du jetzt diese Form nochmal erstellst, dann passt das hinten und vorne nicht mehr. Es müsste folgendermaßen zu demonstrieren sein (in der Projekt Datei):
Delphi-Quellcode:
Habe gerade kein Delphi hier, aber jetzt dürfte es nicht mehr funktionieren, weil form1 nicht mehr existiert, aber der OpenDialog umbedingt die von form1 haben will.
[...]var
f : TForm; begin [...] Application.CreateForm(TForm1, f); Application.CreateForm(TForm1, form1); form1.Free; [...] Oder anders ausgedrückt: Dein Programm versucht von form1 den OpenDialog zu holen. Aber die Form selber kennt ja bereits den OpenDialog und muss nicht (quasi) erst das Bruder-/Schwesterformular nach den Dialog fragen. MfG Fabian |
AW: Problem mit OpenDialog
Zitat:
|
AW: Problem mit OpenDialog
Zitat:
In vielen anderen Situationen ist es aber überflüssig und schafft potentielle Fehlerquellen, daher sollte man es sich schlicht erst gar nicht an solchen Stellen angewöhnen. Dein Beispiel ist insofern ganz passend: form1.OpenDialog1.Execute funktioniert zwar bei so einem einfachen Programm problemlos, ist aber überflüssig, weil innerhalb der Klasse TForm1 das OpenDialog ja bekannt ist. Wenn du dann irgendwann mit komplexeren Programmen arbeitest, in denen du Forms zur Laufzeit erzeugst und freigibst oder ein und dieselbe Form vielleicht mehrfach verwendest, dann fallen dir genau diese Dinge auf die Füße. Auch dein anderes Beispiel mit der eigenen "procedure oeffne" ist ganz interessant, denn wahrscheinlich wäre es sinnvoll, diese auch als Methode von TForm1 umzusetzen, wodurch auch hier kein "form1" mehr nötig wäre. (Eine Methode ist eine Prozedur oder Funktion einer Klasse, um kurz nicht für neues Begriffswirrwarr bei dir zu sorgen). Bis denn Bommel |
AW: Problem mit OpenDialog
@ xZise
warum einen neuen Thread aufmachen, wenn der hier genau meinen Fehler anspricht??? Und gelöst war der hier auch nicht, da man immer eine zu ungenaue Fehlerbeschreibung reinsetzt. Bei meinen Programmen ist Form1 immer da :), das verschwindet nur wenn ich das Programm schließen will. Aber ist schon gut Jungs, ihr habt halt mehr Ahnung von der Materie... da merke ich erstmal wie Noobig doch mein Wissen ist, aber für meine Bedürfnisse reichts. @Bbommel Tja ich habe mir es so angewöhnt, weil ich meist eine Procedure über eine Komponente schreibe (Bsp: Button1Click...) und dann merke, dass ich die hier angewanden Sachen doch auch noch hier und da gerne automatisch machen würde. Jetzt mal ein kleines aktuelles Beispiel: ein Sortieren Button, der meine Tabelle alphabetisch sortiert. Der Button ist auf Form1 und die Tabelle auch, dann ist mir schon klar, dass ich "form1." einfach weglassen kann. Aber warum nen Button lassen, wenn man es doch immer automatisch (nach einer änderung des Tabelleninhalts) machen kann. Also Button weg und ne übergreifende "procedure sortieren" her. Wenn dort jetzt "form1." fehlt ists auch blöd. Zitat:
Code:
Einfach "procedure sortieren" geht dann ja nicht mehr, da müssten ja noch Werte in Klammern dahinter, weiß halt nur nicht welchetype Speicherort=record pfad: string[255]; end; TForm1 = class(TForm) StringGrid1: TStringGrid; ... ... ... procedure PageControl1Change(Sender: TObject); ??????HIER HIN?????????????? private { Private declarations } public { Public declarations } end; Ist jetzt aber nun wirklich etwas Offtopic... |
AW: Problem mit OpenDialog
Zitat:
Delphi-Quellcode:
Parameter brauchst du für die Prozedur nicht zwingend - nur dann, wenn du mit den Parametern auch etwas machst, genau wie in jeder anderen Prozedur auch.
type
Speicherort=record pfad: string[255]; end; TForm1 = class(TForm) StringGrid1: TStringGrid; ... ... ... procedure PageControl1Change(Sender: TObject); private { Private declarations } public { Public declarations } procedure Sortieren; end; [...] procedure TForm1.Sortieren; begin [...] end; Du könntest die Prozedur auch in den Private-Bereich einbauen. Das hängt dann davon ab, ob du möchtest, dass "fremde" Forms darauf zugreifen dürfen (public) oder nicht (private). Bis denn Bommel |
AW: Problem mit OpenDialog
Ach ja so war das. Habe nicht mehr gewusst, dass es unter public oder privat muss. Hatte ich mal in der Schule, aber leider wieder vergessen.
Wo wir gerade bei CreateForm usw waren (ich weiß nicht ob man das dazu braucht). Gibts eine Möglichkeit das MainForm zu schließen und hinter wieder zu öffnen? Mal ein Beispiel was ich zurzeit gerade brauche. Ich möchte einen "Neu" Button anlegen, der alles wieder so Zurücksetzt, wie es beim Öffnen des Programms war. Gibts da eine einfache und schnelle Methode dafür (Form1 neu laden/kreieren/erstellen oder so)? Ich könnte auch allen Inhalt der Tabellen löschen und manuell alles zurücksetzen, wäre aber keine elegante Lösung. |
AW: Problem mit OpenDialog
@maddin1502:
1. um auf Post #19 zurückzukommen: Zitat:
Das machst du mit:
Delphi-Quellcode:
dann wird in dieser Instanz auch ein neuer Opendialog erzeugt. Das ist ja gerade der Witz an OOP.
Application.CreateForm(TForm1, Form1);
Dein erstens Posting kann nicht funktionieren weil:
Delphi-Quellcode:
heist: du willst den OpenDialog1 aus der Variable form1 ausführen. In der Deklaration ist der OpenDialog1 aber privat:
form1.OpenDialog1.Execute
Delphi-Quellcode:
Daher kein Zugriff. Ist ja auch so gewollt.
TForm1 = class(TForm)
... OpenDialog1: TOpenDialog; ... 2. zu #26: Das ist nun wirklich ein neuer Thread, aber um die Frage zu beantworten. Nein, du kannst kein Objekt zerstören und dann aus dem zerstörten Objekt heraus sichselber wieder aufmachen. Denk' mal drüber nach!!! Das einzig was du machen kannst, was aber noch unsauberer ist, du kannst ein Objekt erzeugen, dann dein MainForm schließen und es dann von dem Objekt wieder öffnen lassen. ABER: Du solltes immer eine Inizialisierungsmethode schreiben die alles wohldefiniert anfangen lässt. Gruß David |
AW: Problem mit OpenDialog
@David Martens
Ich will jetzt nicht klugscheißen, aber bei mir geht das mit dem "form1.opendialog1.execute". Habs gerade nochmal mit einen meiner älteren Programme getestet:
Code:
Vielleicht liegt es daran, dass meine Programme einfacher strukturiert sind. Das mit dem "Objekt orientiert Programmieren" versteh ich immer noch nicht so genau, will einfach nicht in meine Rübe rein, was das nun genau heißt.
if form1.opendialog1.Execute then
begin assignfile(f,form1.opendialog1.FileName); reset(f); if filesize(f)>0 then begin read(f,ergebnisse); form1.StringGrid1.ColCount:=strtoint(ergebnisse.zellen[0]); for i:=1 to (stringgrid1.RowCount) do begin inhalt:=ergebnisse.Zellen[i]; for j:=1 to (stringgrid1.ColCount-1) do begin if pos('/',inhalt)=0 then begin stringgrid1.Cells[j,i-1]:=Inhalt; end; if pos('/',inhalt)>0 then begin stringgrid1.Cells[j,i-1]:=copy(inhalt,1,pos('/',inhalt)-1); delete(inhalt,1,pos('/',inhalt)); end; end; end; end; closefile(f); end; Zitat:
Aber jetzt mal rein theoretisch, könnte sich ein Form selbst nochmal aufrufen? Ist jetzt so gedacht, dass man zuerst einen "Zwilling" öffnet und das alte Form dann schließt. |
AW: Problem mit OpenDialog
ok, nochmal fürs Verständnis: versuch es mal hiermit
![]() |
AW: Problem mit OpenDialog
Hi David,
auch wenn wir jetzt ein bisschen weg vom Thema sind, muss ich deinen vorletzten Post doch noch mal korrigieren, sonst ist der arme Maddin ganz verwirrt und wundert sich, warum seine Programme überhaupt funktionieren. ;) Zitat:
Das macht zwar Maddins bisheriges Vorgehen nicht unbedingt richtiger, aber funktionieren tut es bei kleinen Projekten ja erst mal schon. Ich hoffe, dass das jetzt nicht zu klugsch***erisch rüberkam, ich wollte nur verhindern, dass Maddin noch stärker verwirrt wird, als eh schon. ;) Bis denn Bommel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 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 by Thomas Breitkreuz