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 1 von 2  1 2      
maddin1502

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

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 01:36
Hallo, ich weiß dieses Thema ist schon etwas älter, ist aber das Neuste, das ich finden konnte.

Ich habe das gleich Problem mit dem OpenDialog (mit dem SaveDialog ists das Gleiche).
Egal was für Quellcode zwischen den Zeilen steht. Hier ein einfaches nichts machendes Testprogramm:
DAS IST DAS KOMPLETTE PROGRAMM, ALSO BITTE NICHT DIE STANDARTANTWORT, DASS HIER CODE VERHEIMLICHT WIRD!!!
Wer es nicht glaubt sollte es doch erstmal kurz testen (Win7+Delphi2009)
Code:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if form1.OpenDialog1.Execute then
  begin

  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if form1.SaveDialog1.Execute then
  begin

  end;
end;

end.
Und nun zur genauen Fehlerbeschreibung.
1. Ich öffne das Projekt
2. Klicke auf Start (F9, der kleine grüne Pfeil) --> Programm startet
3. klicke auf button1 ODER button2 (ist egal, beides führt zum gleichen Fehler)
4. schließe den entsprechend geöffneten Dialog
5. schließe das ausgeführte Programm per "X"

Nun spuckt mir Delphi die Fehlermeldung aus:
http://s5.directupload.net/images/100615/m9u2c9ig.jpg

Egal ob man nun ja oder nein drückt hängt sich Delphi beim nächsten bedienen auf, z.B.: wenn man Delphi dann schließen möchte oder das Projekt neu Starten (F9) möchte --> Freeze und man bekommts nur noch mit Gewalt geschlossen. Ob ein weiterarbeiten und speichern ohne weiteres möglich ist wieß ich nicht, habs nie probiert und wäre mir auch einfach zu unsicher zwecks Datenverlust.

Ohne Debugger läufts übrigegens und auch außerhalb von Delphi, wenn man dann einfach nur die EXE ausführt.
Es ist ja aber nicht Sinn und Zweck der Sache den Debugger immer auszuschalten...

Mein System ist WIN 7 Professional + Delphi 2009

Grüße
Maddin1502
Angehängte Grafiken
Dateityp: jpg m9u2c9ig.jpg (89,0 KB, 31x aufgerufen)

Geändert von mkinzler (15. Jun 2010 um 05:30 Uhr) Grund: Verlinktes Bild angehängt
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 04:47
Das ist ein Problem von Delphi auf Win 7 X64. Hier gibt es einen Workaround um diesen Fehler zu vermeiden:


Debugger Workaround
Lars
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.309 Beiträge
 
Delphi 12 Athens
 
#3

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 08:53
Hat nicht direkt was mit deinem Fehler zu tun aber

Du schreibst

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if form1.OpenDialog1.Execute then
  begin

  end;
end;

form1 kannst du weglassen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin

  end;
end;
Du greifst direkt auf die instanzierte Variable zu. Was passiert, wenn das TForm1 neu instanziert wird? Dann greift die neue Instanz auf OpenDialog1 von form1 zu und nutzt nicht die eigene instanz. Noch schlimmer, wenn Form1 nicht das Hauptformular ist, kann es ja sein, daß form1 zufällig mal freigegeben wird, die andre Instanz noch auf form1 zugreift. Dann knallt's.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
maddin1502

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

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 09:57
OK, aber was jetzt mit instanziert gemeint ist, versteh ich nicht. Habe zwar schon ein paar Programme geschrieben,
aber mit den Wort Instanz ansich kann ich nichts anfangen. Vielleicht kannst du es nochmal für Anfänger erzählen.
Ich habe es mir im Prinzip aus groben Grundkenntnissen selber beigebracht mit Delphi zu programmieren,
da sind ein paar Fachbegriffe leider auf der Strecke geblieben...

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)...

Naja, ich schaue mir mal den Debuger Workarround an.
Danke erstmal für die Hilfe.

EDIT:
@daywalker9, DANKE ES GEHT. Habe das automatische Programm genutzt zum verändern der Datei und jetzt kommt keine Fehlermeldung mehr und Delphi läuft wunderbar. SUPER. (Und natürlich hab ich ein 64bit System, fehlte in meiner Beschreibung)

Geändert von maddin1502 (15. Jun 2010 um 10:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.665 Beiträge
 
Delphi 12 Athens
 
#5

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 10:07
TForm1 ist die Klasse, Form1 die Instanz der Klasse, also das konkret erzeugte Objekt. Zur Verdeutlichung:
Delphi-Quellcode:
type
  TMyClass = class //Definition der Klasse
  end;

...
var Class1, Class2: TMyClass; //2 Variablen vom Typ der Klasse
begin
  Class1 := TMyClass.Create; //Anlegen einer Instanz und Speicherung in der 1. Variablen
  try
    Class2 := TMyClass.Create; //Anlegen einer weiteren Instanz und Speicherung in der 2. Variablen
    try
      ShowMessage('Wir haben jetzt 2 Instanzen von TMyClass.');
    finally
      Class2.Free;
    end;
  finally
    Class1.Free;
  end;
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
Benutzerbild von xZise
xZise

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

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 10: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
 
#7

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 10: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
670 Beiträge
 
Delphi 12 Athens
 
#8

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 10: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
 
#9

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 11: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 11:42 Uhr)
  Mit Zitat antworten Zitat
Bbommel

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

AW: Problem mit OpenDialog

  Alt 15. Jun 2010, 11: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
Antwort Antwort
Seite 1 von 2  1 2      


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:11 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