AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit OpenDialog

Ein Thema von xi.xi · begonnen am 20. Jan 2010 · letzter Beitrag vom 17. Mai 2013
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von xZise
xZise

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

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 11:08
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:
[...]var
  f : TForm;

begin
  [...]
  Application.CreateForm(TForm1, f);
  Application.CreateForm(TForm1, form1);
  form1.Free;
  [...]
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.

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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#22

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 11:17
Und wenn man eigene Proceduren im Stile "procedure oeffnen" ist es doch zwingend notwendig "Form1." davor zu setzen, sonst findet die procedure keinerlei Komponenten (heißt ja nun auch nicht TForm1.oeffnen)...
Nicht wenn man sein Konzept etwas durchdenkt. Methoden der Form-Klasse kennen natürlich die Komponenten der Form. Ist deine Prozedur eine Methode der Form-Klasse sind in ihr auch die Komponenten bekannt. Das überflüssige davor schreiben der Instanz kann sogar zu Fehlverhalten führen und sollte deshalb auch unterlassen werden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#23

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 11:22
Ich nutze es immer so, weil nun mal der Opendialog auf Form1 liegt (bei mir war Form1 bisher immer das Mainform), das habe ich bisher bei allen Proceduren und Komponenten so gemacht. Arbeite ich auf einem andere Form und möchte den Opendialog ansprechen, muss ich dem Programm doch mitteilen wo er liegt und dies muss ich doch nunmal so machen oder nicht?!? Und wenn man eigene Proceduren im Stile "procedure oeffnen" ist es doch zwingend notwendig "Form1." davor zu setzen, sonst findet die procedure keinerlei Komponenten (heißt ja nun auch nicht TForm1.oeffnen)...
Es gibt natürlich auch Situationen, in denen es gar kein Problem oder sogar richtig und nötig ist, wenn du auf eine Instanz von TForm1 zugreifst (also auf form1), um dann auf z.B. den Öffnen-Dialog, der auf diesem Form liegt, zugreifen zu können. Ein Beispiel kann das sein, was du selber geschrieben hast, nämlich wenn du aus einem anderen Form auf dieses zugreifen willst (und dir zu dem Zeitpunkt auch sicher sein kannst, dass Form1 existiert).

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
  Mit Zitat antworten Zitat
maddin1502

Registriert seit: 19. Aug 2009
6 Beiträge
 
#24

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 12:40
@ 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:
denn wahrscheinlich wäre es sinnvoll, diese auch als Methode von TForm1 umzusetzen
Also sollte ich eine solche allgemeine "procedure sortieren" (aufgeführt unter Var) dann eher hier einsetzen, aber WIE?
Code:
 
  type
  Speicherort=record
    pfad: string[255];
    end;
  TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   ...
   ...
   ...
   procedure PageControl1Change(Sender: TObject);
   ??????HIER HIN??????????????
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Einfach "procedure sortieren" geht dann ja nicht mehr, da müssten ja noch Werte in Klammern dahinter, weiß halt nur nicht welche


Ist jetzt aber nun wirklich etwas Offtopic...

Geändert von maddin1502 (15. Jun 2010 um 12:42 Uhr)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#25

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 12:50
Zitat:
denn wahrscheinlich wäre es sinnvoll, diese auch als Methode von TForm1 umzusetzen
Also sollte ich eine solche allgemeine "procedure sortieren" (aufgeführt unter Var) dann eher hier einsetzen, aber WIE?
Genau so war es von mir gemeint. Deine deine neue Sortier-Prozedur ist ja auch genau für das TForm1 weil diese dessen Funktionalität erweitert und auf dem Form immer eine Liste sortiert. Du baust sie dann so ein:
Delphi-Quellcode:
  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;
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.

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
  Mit Zitat antworten Zitat
maddin1502

Registriert seit: 19. Aug 2009
6 Beiträge
 
#26

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 13:16
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.
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#27

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 19:09
@maddin1502:
1.
um auf Post #19 zurückzukommen:
Zitat:
Ich nutze es immer so, weil nun mal der Opendialog auf Form1 liegt
...
(heißt ja nun auch nicht TForm1.oeffnen)...
Der Opendialog liegt nicht auf Form1, sondern gehört zum Objekt TForm1. Jedesmal wenn du eine Instanz von TForm1 erzeugst d.h. den Speicher für das Objekt bereitstellst und und und,
Das machst du mit:
Application.CreateForm(TForm1, Form1); dann wird in dieser Instanz auch ein neuer Opendialog erzeugt. Das ist ja gerade der Witz an OOP.

Dein erstens Posting kann nicht funktionieren weil:
form1.OpenDialog1.Execute heist: du willst den OpenDialog1 aus der Variable form1 ausführen. In der Deklaration ist der OpenDialog1 aber privat:
Delphi-Quellcode:
  TForm1 = class(TForm)
    ...
    OpenDialog1: TOpenDialog;
    ...
Daher kein Zugriff. Ist ja auch so gewollt.

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
  Mit Zitat antworten Zitat
maddin1502

Registriert seit: 19. Aug 2009
6 Beiträge
 
#28

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 21:18
@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:
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;
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.

Zitat:
Nein, du kannst kein Objekt zerstören und dann aus dem zerstörten Objekt heraus sichselber wieder aufmachen. Denk' mal drüber nach!!!
Das ist mir schon klar, dass ein zerstörtes Objekt sich nicht selber weiderherstellen kann. Zu dem Punkt wo der Wiederherstellungsbefehl kommen müsste, gibts ja nichts mehr, wo dieser Befehl stehen könnte (Der wäre dann auch mit zerstört).
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.

Geändert von maddin1502 (15. Jun 2010 um 21:22 Uhr)
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#29

AW: Problem mit OpenDialog

  Alt 17. Jun 2010, 15:45
ok, nochmal fürs Verständnis: versuch es mal hiermit http://www.delphi-treff.de/object-pa...torientierung/
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#30

AW: Problem mit OpenDialog

  Alt 17. Jun 2010, 16:01
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.

Dein erstens Posting kann nicht funktionieren weil:
form1.OpenDialog1.Execute heist: du willst den OpenDialog1 aus der Variable form1 ausführen. In der Deklaration ist der OpenDialog1 aber privat:
Delphi-Quellcode:
  TForm1 = class(TForm)
    ...
    OpenDialog1: TOpenDialog;
    ...
Daher kein Zugriff. Ist ja auch so gewollt.
Was du schreibst, stimmt so aus zwei Gründen eigentlich nicht:
  1. Wenn du in Delphi neue Komponenten hinzufügst, dann erscheinen die im Quellcode an einer Stelle in der Klassendefinition, bevor die Sichtbarkeit explizit angegeben wurde. Damit sind sie dann nicht "private", sondern "published" oder "public", also sichtbar und von außen verfügbar.
  2. Selbst wenn der OpenDialog1 nur "private" wäre, dann wäre er innerhalb der gleichen Unit auch von außen durchaus sichtbar, also auch hier keine Probleme für den Code von Maddin.

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 09:56 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