Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi selectdirectory zugriffsverletzung (https://www.delphipraxis.net/153168-selectdirectory-zugriffsverletzung.html)

Danyel 23. Jul 2010 13:01

Delphi-Version: 2005

selectdirectory zugriffsverletzung
 
Hi,
da die Forensuche mich nicht weiter gebracht hat, stelle ich euch hier die Frage. :arrow:

Ich möchte in meinem Programm vom User ein Pfad auswählen lassen und habe keine Lust neue Komponenten etc einzubinden. Bin dann auf SelectDirectory gestoßen.

Delphi-Quellcode:
uses FileCtrl;
procedure xy;
var dir : string;
begin
   SelectDirectory('Select a directory', '', Dir);
   ShowMessage(Dir);
end;
Soweit alles ganz schön und gut, doch funktioniert dies nicht, obwohl es eigentlich funktionieren müsste nachdem was ich hier schon so gefunden habe, doch bekomme ich eine Zugriffsverletzung und nichts passiert, dh der Dialog öffnet sich nicht.
Hier ein Bild der Fehlermeldung:
http://img186.imageshack.us/img186/3508/fehlerrt.jpg

omata 23. Jul 2010 13:04

AW: selectdirectory zugriffsverletzung
 
In welcher Zeile tritt der Fehler konkret auf? Hast du das mal mit dem Debugger nachvollzogen?

Edit: Versuch es mal so...
Delphi-Quellcode:
uses FileCtrl;
procedure xy;
var dir : string;
begin
  if SelectDirectory('Select a directory', '', Dir) then
    ShowMessage(Dir);
end;

hoika 23. Jul 2010 14:06

AW: selectdirectory zugriffsverletzung
 
Hallo,

F5 auf SelectDirectory und mal laufen lassen.
Ich tippe mal auf einen NIL-Zeiger durch nicht initialiserte Klasse in deinem Initialisieren.


Heiko

s.h.a.r.k 23. Jul 2010 14:10

AW: selectdirectory zugriffsverletzung
 
Also an deinem Code weiter oben kann eigentlich kaum was schief laufen, es muss wahrlich wo anders liegen! Dazu würde ich, wie omata schon geschrieben habe, das ganze mit einem if noch erweitern, da der User den Dialog ja auch abbrechen kann, denn dann bekommst du keinerlei Verzeichnis zurück -> schlecht!

Danyel 23. Jul 2010 14:35

AW: selectdirectory zugriffsverletzung
 
Delphi-Quellcode:
uses filectrl;
var bf2modtools:string;

procedure TForm1.FormCreate(Sender: TObject);
begin

      if firstrun=true then        //wenn erster Programmstart
      begin
            if SelectDirectory('Select a directory', 'C:\', bf2modtools) then ShowMessage(bf2modtools);
      end;
end;
Fehler tritt bei
Delphi-Quellcode:
if SelectDirectory('Select a directory', 'C:\', bf2modtools) then ShowMessage(bf2modtools);
auf.
Makiere ich SelectDirectory mit F5 und lasse das Projekt laufen, passiert nichts.
Oben links im "Aufruf-Stack" (was auch immer das sein soll) zeigt er
TForm1.FormCreate(???) an, keine Ahnung ob das normal ist.
Ansonsten kann ich mit Heikos Beitrag nichts weiter konkret anfangen, da ich nicht genau verstehe was gemeint ist.:oops:
Vielen Dank für die schnellen Antworten:thumb:

omata 23. Jul 2010 16:56

AW: selectdirectory zugriffsverletzung
 
Vielleicht darfst du das im FormCreate einfach noch nicht verwenden.

Und warum wird da eine Variable global deklariert, die nur lokal verwendet wird? Und bitte nicht auf True abfragen.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
:
  private
    { Private-Deklarationen }
    FFirstRun:boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses filectrl;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FFirstRun:=true;
end;

procedure TForm1.FormActivate(Sender: TObject);
var bf2modtools:string;
begin
  if FFirstRun then begin
    FFirstRun:=false;
    if SelectDirectory('Select a directory', 'C:\', bf2modtools) then
      ShowMessage(bf2modtools);
  end;
end;

Danyel 23. Jul 2010 23:57

AW: selectdirectory zugriffsverletzung
 
Die Variable ist global deklariert, da sie nicht nur dort benutzt wird.
Ist demnach also doch wohl richtig denke ich :thumb:
Auf true Abfragen werden geändert, danke.

Das mit dem FormCreate kann natürlich sein, werde es schnellstmöglich testen, an anderer Stelle aufzurufen.

MfG Danyel

omata 24. Jul 2010 00:29

AW: selectdirectory zugriffsverletzung
 
Zitat:

Zitat von Danyel (Beitrag 1037201)
Die Variable ist global deklariert, da sie nicht nur dort benutzt wird.
Ist demnach also doch wohl richtig denke ich :thumb:

Nein, wenn sie zum Formular gehört, gehört sie in den Private-Teil.

Hast du dir mein Beispiel überhaupt mal angesehen?

Danyel 24. Jul 2010 00:43

AW: selectdirectory zugriffsverletzung
 
Ja, habe ich.
Habe die beiden Variablen vertauscht, entschuldige. (Sind beide Global)
Das höre ich heute zum ersten mal, das die dann in den Private Bereich kommen. (in der Schule falsch beigebracht)

Werde den Aufruf, die Abfrage und die Variablendeklaration schnellstmöglich anpassen.

Habe ich das richtig verstanden, dass wenn meine Variable nur für die Form, zB Form1, gültig sein soll, diese im private Bereich deklariert wird? Wozu dient oben dann die Anfänglich var Aufführung? Würde meine Variable dort auf allen Forms, falls mehrere vorhanden, deklariert sein? Ist mir noch nie bewusst aufgefallen, bzw mein Lehrer hat auch noch einiges zu lernen. :D
Vielen Dank, du hast meinen Horizont erweitert, dh, wenn ichs richtig verstanden habe. :P
Immer wieder spannend....

MfG Danyel

omata 24. Jul 2010 13:09

AW: selectdirectory zugriffsverletzung
 
Also man kann im interface- und im implementation-Teil über das Schlüsselwort var Variablen deklarieren.
Die, die im Interface-Teil deklariert sind sind projektglobal sichtbar und da man immer so lokal wie möglich Variablen deklariert, ist das die schlecheste Stelle überhaupt. Nur weil Delphi das für seine Formularvariablen tut, muss man dies nicht nachmachen. Mal ganz davon abgesehen, dass man nicht alle Formulare beim Programmstart erzeugen lässt und wenn man genau dies tut, dann löscht man auch diese globalen Formularvariablen und hat nur noch die eine, die das Hauptformular beinhaltet.
Im Implementation-Teil werden Variablen deklariert, die unitglobal sein sollen. Besitzt eine Unit allerdings ein Formular und man möchte in diesem Objekt eine globale Variable einführen, dann deklariert man diese im Private-Teil. Der Unterschied ist folgender: Hat man mehrere Instanzen des selben Objektes (hier Formular) dann hat (wenn man die Variable im Private-Teil deklariert) jedes Objekt seine eigene globale Variable. Deklariert man die Variable degegen im Implementation-Teil, dann haben und benutzen alle Objekte dieselbe globale Variable. Meist hat man ein Formular nur einmal, deshalb fällt diese Problematik nicht weiter auf, trotzdem sollte man gleich "ordentlich" programmieren und wissen was man da eigentlich tut.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 Uhr.
Seite 1 von 2  1 2      

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