Hallo!
Ich will mal die FileView Komponenten verwenden, die , wenn ich eine
CLX Anwendung neu erstelle, auf dem Komponentenregister System zu finden sind. Mit einer DirectoryListView will ich das Verzeichnis auswählen, eine FileListView soll mir meine Dateien in diesem Verzeichnis anzeigen und eine dort ausgewählte Datei in FileEdit.Text übernehmen. Diesen Dateinamen will ich dann mit OK an die zukünftige Anwendung übergeben. Mein Problem:
Exception EAccessViolation: an Adresse 00469741
Hier der Quelltext:
{
FileListView.Location ::= DirectoryTreeView.Directory
FÜR FileHistoryComboBox.Files
type
PFileInfo = ^TFileInfo;
TFileInfo = record
SR: TSearchRec; Dateiinformation
ImageIndex: Integer; Index in Iconliste
Desc: string; Eine Beschreibung der aktuellen Datei (NICHT Name)
end;
Eigenschaft Items: TStrings auch gültig (ItemIndex)
}
unit QCLXDlg;
interface
uses
SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms,
QDialogs, QStdCtrls, QButtons, QComCtrls, QFileCtrls;
type
TQCLXDialog = class(TForm)
FileListView: TFileListView;
FileHistoryComboBox: TFileHistoryComboBox;
//In einer FileHistoryComboBox sollen später die im Verlauf einer Programmsitzung,evtl.
//auch über diese hinaus die ausgewählten Dateien als Liste für spätere schnellere Auswahl
//ohne Verzeichniswechsel gespeichert werden. Leider vermisse ich hier eine Eigenschaft
//Text, wie in der StandardComboBox. Wie kriege ich trotzdem die aktuelle Datei angezeigt?
//Und wie verbinde ich die FileHistoryComboBox mit der FileListView? Es gibt eine
//Eigenschaft Files, deren Handhabung mir aber zu umständlich ist. Funktioniert auch die
//Eigenschaft Items???
FilterComboBox: TFilterComboBox;
btnOk: TBitBtn;
btnCancel: TBitBtn;
btnHelp: TBitBtn;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
DirectoryTreeView: TDirectoryTreeView;
FileEdit: TFileEdit;
procedure FileIconViewDirectoryChange(Sender: TObject;
const NewDir: WideString);
procedure DirectoryTreeViewChange(Sender: TObject; Node: TTreeNode);
procedure FileListViewChange(Sender: TObject; Item: TListItem;
Change: TItemChange);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
FDefaultExt: String; //*.ext
FFileName: String; //Der Dateiname
FFilter: String; //FileListView.FileMask
FFilterIndex: Integer;
FInitialDir: String; //FileListView.Directory.Location
FTitle: String; //Caption des Formulars
//Die folgenden setXXX und getXXX Methoden sollen später Eigenschaften setzen und lesen
//so dass ich diesen Dialog genauso verwenden kann, wie TOpen- und TSaveDialog.
procedure setDefaultExt(value: string);
procedure setFileName(value: string);
procedure setFilter(value: string);
procedure setFilterIndex(value: Integer);
procedure setInitialDir(value: string);
procedure setTitle(value: string);
function getDefaultExt: string;
function getFileName: string;
function getFilter: string;
function getFilterIndex: Integer;
function getInitialDir: string;
function getTitle: string;
public
{ Public-Deklarationen }
//Diese Eigenschften habe ich bewußt so benannt, wie die gleichnamigen in den
//Standarddialogen. Die haben auch diesebe Bedeutung
property DefaultExt: string read getDefaultExt write setDefaultExt;
property FileName: string read getFileName write setFileName;
property Filter: string read getFilter write setFilter;
property FilterIndex: Integer read getFilterIndex write setFilterIndex;
property InitialDir: string read getInitialDir write setInitialDir;
property Name; //Name der Komponente
property Title: string read getTitle write setTitle;
end;
var
QCLXDialog: TQCLXDialog;
implementation
{$R *.xfm}
procedure TQCLXDialog.setDefaultExt(value: string);
begin
//wird später implementiert
end;
procedure TQCLXDialog.setFileName(value: string);
begin
//wird später implementiert
end;
procedure TQCLXDialog.setFilter(value: string);
begin
//wird später implementiert
end;
procedure TQCLXDialog.setFilterIndex(value: Integer);
begin
//wird später implementiert
end;
procedure TQCLXDialog.setInitialDir(value: string);
begin
//wird später implementiert
end;
procedure TQCLXDialog.setTitle(value: string);
begin
//wird später implementiert
end;
function TQCLXDialog.getDefaultExt: string;
begin
//wird später implementiert
end;
function TQCLXDialog.getFileName: string;
begin
//wird später implementiert
end;
function TQCLXDialog.getFilter: string;
begin
//wird später implementiert
end;
function TQCLXDialog.getFilterIndex: Integer;
begin
//wird später implementiert
end;
function TQCLXDialog.getInitialDir: string;
begin
//wird später implementiert
end;
function TQCLXDialog.getTitle: string;
begin
//wird später implementiert
end;
//-------------------- die öffentlichen Methoden und Eigenschaften -------------
procedure TQCLXDialog.FileIconViewDirectoryChange(Sender: TObject;
const NewDir: WideString);
begin
Refresh;
end;
procedure TQCLXDialog.DirectoryTreeViewChange(Sender: TObject;
Node: TTreeNode);
begin
// DirectoryTreeView.Directory wird an
// von FileListView.Directory.Location übergeben
// Dann wird in FilListView.FileType -> ftDirectory
// ausgeschaltet. Directory kann dann nur noch mit
// der Directeóryliste ausgewählt werden. Es werden jetzt nur noch die reinen Dateinamen
// angezeigt. Wenn ich ftDirectory nicht ausschalte und in das übergeordnete Verzeichnis
// von FileListView aus wechseln will, funktioniert der Wechsel nicht. Deshalb habe ich
// ftDirectory auch deaktiviert
FileListView.Directory.Location := DirectoryTreeView.Directory;
end;
procedure TQCLXDialog.FileListViewChange(Sender: TObject; Item: TListItem;
Change: TItemChange);
begin
//Das klappt leider noch nicht
//DirectoryTreeView.Directory := FileListView.Directory.Location;
FileEdit.Text := FileListView.Selections[0].SR.Name; //HIER entsteht die
Exception
//Obige Anweisung löst
Exception aus -> Warum???
//FFileName := FileEdit.Text;
end;
procedure TQCLXDialog.FormCreate(Sender: TObject);
begin
FileListView.Directory.FileMask := FilterComboBox.Mask;
//Dateifilter an Liste übergeben -> funktionirt so
end;
end.
Kann mir jejmand helfen? Wozu hab ich denn schließlich diese Komponenten?
Delphifan2004