|
Antwort |
Registriert seit: 4. Dez 2013 47 Beiträge |
#1
Hallo,
ich habe diesen Quellcode:
Delphi-Quellcode:
in einer größeren Anwendung und erhalte bei Aufruf die im Titel genannte Exception.
dlg := TfrmDirectoryDialog.Create(self);
dlg.ActiveDirectory := 'D:\Programme\Borland\Delphi\Projects\'; dlg.ShowModal; if dlg.ModalResult = mrChooseDir then begin end; dlg.Free; Warum. Welchen WorkAround gibt es? Was will ich machen? Ich möchte einen Setup Installer programmieren, bei dem ich das Verzeichnis auswählen will, wohin die Programmdateien installiert werden sollen. Ich kann mir absolut nicht vorstellen, das hier ein Fehler im Quelltext des Directorydialoges vorliegt. Eher wohl, das keine Diskette im Laufwerk A: ist. Wie aber kann ich diese Exception überspringen. Die Anwendung wird von Festplatte aus gestartet und startet eiwandfrei, bis ich diesen Dialog aufrufe. Habe schon in Google diesen Suchbegriff eingegeben: "Exception Processing Message" Die Links aber helfen alle nicht wirklich weiter. Bin noch immer am Suchen! Weiß jemand eine Lösung? Geändert von FragenderHerbert (19. Nov 2014 um 17:56 Uhr) |
Zitat |
FragenderHerbert |
Öffentliches Profil ansehen |
Mehr Beiträge von FragenderHerbert finden |
Registriert seit: 17. Sep 2006 Ort: Barchfeld 27.624 Beiträge Delphi 12 Athens |
#2
Hast Du es mal mit SetErrorMode versucht?
Delphi-Quellcode:
var
ErrorMode: UINT; begin ErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS); try ... finally SetErrorMode(ErrorMode); 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 |
Zitat |
Registriert seit: 11. Okt 2003 Ort: Elbflorenz 44.071 Beiträge Delphi 12 Athens |
#3
Ich kann mir absolut nicht vorstellen, das hier ein Fehler im Quelltext des Directorydialoges vorliegt.
Schließlich kommt das Ding ja dazu auf A: zuzugreifen. Was ist TfrmDirectoryDialog eigentlich? Und wo ist der Resourcenschutzblock, wo es dort ja so schön knallt? PS: TFileOpenDialog kann man auch auf Verzeichnisauswahl umstellen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat, wird PoSex im Delphi viel seltener praktiziert. |
Zitat |
Registriert seit: 4. Dez 2013 47 Beiträge |
#4
@DeddyH:
Nein, Set Errorcode hilft nicht weiter. Trotzdem Danke! TfrmDirectoryDialog verwendet die folgende Unit: (Wie erreiche ich den zusammengelappten Zustand für Euch?)
Delphi-Quellcode:
Ich habe die entscheidende Stelle noch nicht gefunden.
unit wgdirtree;
// Bugs or Feature Requests - mail to: Erik@Grohnwaldt.de // For newer versions look at lptk.sourceforge.net or www.grohnwaldt.de // $Log: wgdirtree.pas,v $ // Revision 1.11 2004/05/07 08:02:17 aegluke // FileDialog used to Open/Save files // // Revision 1.10 2004/01/29 12:48:10 aegluke // Windows-Changes // // Revision 1.9 2004/01/24 18:35:51 aegluke // wgfiledialog-changes // // Revision 1.8 2004/01/19 18:19:35 aegluke // TwgDirTreePopup added // // Revision 1.7 2004/01/14 08:22:31 aegluke // Fixed wrong use of FindSubNode // // Revision 1.6 2004/01/09 17:29:56 aegluke // Windows-Drive support - Update // // Revision 1.5 2004/01/09 14:29:31 aegluke // Windows-Drive support // // Revision 1.4 2004/01/02 19:35:02 aegluke // SetDirectoryIndex-Update // // Revision 1.3 2004/01/02 19:13:17 aegluke // ImageList-Support // // Revision 1.2 2003/10/30 11:24:41 aegluke // pre-read not opened directories // // Revision 1.1 2003/10/29 12:48:47 aegluke // simple directory tree - first release - not tested on windows // {$IFDEF FPC} {$mode objfpc} {$H+} {$ENDIF} {//$DEFINE DEBUG} interface uses wgtree, classes, schar16, popupwindow, gfxbase, gfxwidget, gfxstyle, messagequeue, gfximagelist; const {$IFDEF win32} cDirSeparator = '\'; {$ELSE} cDirSeparator = '/'; {$ENDIF} type TwgDirTree = class(TwgTree) private FActiveDirectory : string; FDirectoryIndex : word; procedure SetActiveDirectory(aValue : string); protected function GetAbsoluteDir(aNode : TwgTreeNode) : string; procedure DoChange; override; procedure DoExpand(aNode : TwgTreeNode); override; procedure SetDirectoryIndex(AValue : Word); {$IFDEF win32} procedure ReadDriveNames; {$endif} public constructor Create(aOwner : TComponent); override; procedure ReadDirectories(aParentNode : TwgTreeNode); // read's the directory entries of the given dirname in the parent-node.text property ActiveDirectory : string read FActiveDirectory write SetActiveDirectory; property DirectoryIndex : word read FDirectoryIndex write SetDirectoryIndex; end; TwgDirTreePopupTree = class(TwgDirTree) protected procedure HandleDoubleClick(AX, AY : Longint; AButton : Word; AShiftState : Word); override; // Hide the DoubleClick end; TwgDirTreePopupWindow = class(TPopupWindow) private FOldDirectory : String; FPopupDir : String; FDirTree : TwgDirTreePopupTree; protected procedure HandleKeyPress(var AKeyCode : Word; var AShiftState : Word; var AConsumed : Boolean); override; procedure HandleDoubleClick(AX, AY : Longint; AButton : Word; AShiftState : Word); override; public constructor Create(AOwner : TComponent); override; destructor Destroy; override; procedure DoShow; override; property OldDirectory : String read FOldDirectory write FOldDirectory; property DirTree : TwgDirTreePopupTree read FDirTree; property PopupDir : String read FPopupDir write FPopupDir; end; TwgDirTreePopup = class(TWidget) private FPopup : TwgDirTreePopupWindow; FDropDownRows : Word; FDroppedDown : Boolean; FBlockDrop : Boolean; FFont : TgfxFont; FHotTrack : Boolean; protected procedure MsgPopupClose(var AMsg : TMessageRec); message MSG_POPUPCLOSE; procedure SetDropDownRows(AValue : Word); procedure HandleMouseDown(AX, AY : Integer; AButton : Word; AShiftState : Word); override; procedure HandleMouseUp(AX, AY : Integer; AButton : Word; AShiftState : Word); override; procedure DoSetFocus; override; procedure SetActiveDirectory(AValue : String); procedure SelectionChange(ASender : TObject); function GetActiveDirectory : String; procedure SetImageList(AValue : TgfxImageList); function GetImageList : TgfxImageList; procedure SetImageIndex(AValue : Word); function GetImageIndex : Word; procedure SetShowImages(AValue : Boolean); function GetShowImages : Boolean; public procedure DoChange; procedure RePaint; override; procedure DropDown; constructor Create(AOwner : TComponent); override; destructor Destroy; override; property HotTrack : Boolean read FHotTrack write FHotTrack; property ShowImages : Boolean read GetShowImages write SetShowImages; property ImageIndex : Word read GetImageIndex write SetImageIndex; property ImageList : TgfxImageList read GetImageList write SetImageList; property DropDownRows : Word read FDropDownRows write SetDropDownRows; property ActiveDirectory : String read GetActiveDirectory write SetActiveDirectory; property Font : TgfxFont read FFont; public onChange : TNotifyEvent; end; implementation uses sysutils{$IFDEF win32},windows{$ENDIF}; { TwgDirTreePopupTree } procedure TwgDirTreePopupTree.HandleDoubleClick(AX, AY : Longint; AButton : Word; AShiftState : Word); begin MessageQueue.PostMessage(self, Owner, MSG_DOUBLECLICK, AX, AY, AButton); end; { TwgDirTreePopup } procedure TwgDirTreePopup.DoChange; begin if Assigned(onChange) then onChange(Self); end; function TwgDirTreePopup.GetShowImages : Boolean; begin Result := FPopup.DirTree.ShowImages; end; procedure TwgDirTreePopup.SetShowImages(AValue : Boolean); begin FPopup.DirTree.ShowImages := AValue; end; function TwgDirTreePopup.GetImageIndex : Word; begin result := FPopup.DirTree.DirectoryIndex; end; procedure TwgDirTreePopup.SetImageIndex(AValue : Word); begin FPopup.DirTree.DirectoryIndex := AValue; end; function TwgDirTreePopup.GetImageList : TgfxImageList; begin Result := FPopup.DirTree.ImageList; end; procedure TwgDirTreePopup.SetImageList(AValue : TgfxImageList); begin FPopup.DirTree.ImageList := AValue; end; procedure TwgDirTreePopup.SelectionChange(ASender : TObject); begin {$IFDEF DEBUG} writeln('TwgDirTreePopup.SelectionChange'); {$ENDIF} RePaint; if HotTrack then begin DoChange; FPopup.OldDirectory := ActiveDirectory; end; end; procedure TwgDirTreePopup.SetActiveDirectory(AValue : String); begin {$IFDEF DEBUG} writeln('TwgDirTreePopup.SetActiveDirectory'); {$ENDIF} FPopup.DirTree.ActiveDirectory := AValue; RePaint; FPopup.OldDirectory := ActiveDirectory; end; function TwgDirTreePopup.GetActiveDirectory : String; begin {$IFDEF DEBUG} writeln('TwgDirTreePopup.GetActiveDirectory'); {$ENDIF} result := FPopup.DirTree.ActiveDirectory; end; procedure TwgDirTreePopup.DoSetFocus; begin {$IFDEF DEBUG} writeln('TwgDirTreePopup.DoSetFocus'); {$ENDIF} inherited DoSetFocus; FBlockDrop := False; end; procedure TwgDirTreePopup.MsgPopupClose(var AMsg : TMessageRec); begin {$IFDEF DEBUG} writeln('TwgDirTreePopup.MsgPopupClose'); {$ENDIF} FBlockDrop := FDroppedDown; if ActiveDirectory <> FPopup.OldDirectory then begin DoChange; FPopup.OldDirectory := ActiveDirectory; end; end; procedure TwgDirTreePopup.HandleMouseUp(AX, AY : Integer; AButton : Word; AShiftState : Word); begin {$IFDEF DEBUG} writeln('TwgDirTreePopup.HandleMouseUp'); {$ENDIF} inherited HandleMouseUp(AX, AY, AButton, AShiftState); if not FBlockDrop then begin DropDown; end else begin if FPopup.OldDirectory <> ActiveDirectory then begin DoChange; FPopup.OldDirectory := ActiveDirectory; end; end; FBlockDrop := False; FDroppedDown := FPopup.WinHandle > 0; end; procedure TwgDirTreePopup.HandleMouseDown(AX, AY : Integer; AButton : Word; AShiftState : Word); begin {$IFDEF DEBUG} writeln('TwgDirTreePopup.HandleMouseDown'); {$ENDIF} inherited HandleMouseDown(AX, AY, AButton, AShiftState); FDroppedDown := FPopup.WinHandle > 0; end; procedure TwgDirTreePopup.SetDropDownRows(AValue : Word); begin {$IFDEF DEBUG} writeln('TwgDirTreePopup.SetPopupLines'); {$ENDIF} if AValue = 0 then AValue := 1; FDropDownRows := AValue; end; procedure TwgDirTreePopup.DropDown; begin {$IFDEF DEBUG} writeln('TwgDirTreePopup.DropDown'); {$ENDIF} FPopup.Width := Width; FPopup.Height := FPopup.DirTree.GetNodeHeight * FDropDownRows; FDroppedDown := True; FPopup.ShowAt(WinHandle,0,Height); FPopup.PopupDir := ActiveDirectory; end; procedure TwgDirTreePopup.RePaint; begin {$IFDEF DEBUG} writeln('TwgDirTreePopup.RePaint'); {$ENDIF} if not Windowed then exit; Canvas.Clear(FBackgroundColor); if Focused then Canvas.SetColor(clWidgetFrame) else Canvas.SetColor(clInactiveWGFrame); Canvas.DrawRectangle(0,0,Width,Height); Canvas.DrawString16(4,Height div 2 - FFont.Height div 2,Str8To16(ActiveDirectory)); DrawButtonFace(Canvas, width - height + 1, 1, height - 2, height - 2); DrawDirectionArrow(Canvas, Width - Height + 1, 1, Height - 2, Height - 2, 1); end; constructor TwgDirTreePopup.Create(AOwner : TComponent); begin inherited Create(AOwner); FPopup := TwgDirTreePopupWindow.Create(Self); FDropDownRows := 8; OnChange := nil; FHotTrack := False; FDroppedDown := False; FBlockDrop := False; FFocusAble := True; FDroppedDown := True; FBackgroundColor := clChoiceListBox; FFont := GfxGetFont('#list'); FPopup.DirTree.onChange := {$IFDEF fpc}@{$ENDIF}SelectionChange; FPopup.OldDirectory := ActiveDirectory; end; destructor TwgDirTreePopup.Destroy; begin FPopup.Destroy; inherited Destroy; end; { TwgDirTreePopupWindow } procedure TwgDirTreePopupWindow.HandleDoubleClick(AX, AY : Longint; AButton : Word; AShiftState : Word); begin Close; if OldDirectory <> FDirTree.ActiveDirectory then TwgDirTreePopup(Owner).DoChange; end; procedure TwgDirTreePopupWindow.HandleKeyPress(var AKeyCode : Word; var AShiftState : Word; var AConsumed : Boolean); begin inherited HandleKeyPress(AKeyCode, AShiftState, AConsumed); case AKeyCode of KEY_ESC: begin Close; FDirTree.ActiveDirectory := FPopupDir; AConsumed := True; TwgDirTreePopup(Owner).RePaint; end; KEY_ENTER: begin Close; MessageQueue.PostMessage(self, Owner, MSG_KEYPRESS, KEY_TAB, 0, 0); if OldDirectory <> FDirTree.ActiveDirectory then TwgDirTreePopup(Owner).DoChange; OldDirectory := FDirTree.ActiveDirectory; AConsumed := True; end; end; end; destructor TwgDirTreePopupWindow.Destroy; begin DirTree.Free; inherited Destroy; end; procedure TwgDirTreePopupWindow.DoShow; begin DirTree.SetDimensions(0,0,Width,Height); inherited DoShow; ActiveWidget := DirTree; end; constructor TwgDirTreePopupWindow.Create(AOwner : TComponent); begin inherited Create(AOwner); FDirTree := TwgDirTreePopupTree.Create(Self); end; { TwgDirTree } {$IFDEF win32} procedure TwgDirTree.ReadDriveNames; var ADrive : String; ACounter : Integer; ANumber : Integer; begin for ACounter := 0 to 25 do begin ADrive := Chr(Ord('A')+ACounter) + ':\'; ANumber := Windows.GetDriveType(PChar(ADrive)); if ANumber <> 1 then begin RootNode.AppendText8(ADrive[1]+':'); end; end; end; {$ENDIF} procedure TwgDirTree.SetDirectoryIndex(AValue : Word); // Sets the new Directory-Image-Index to all SubNodes var ANode : TwgTreeNode; begin {$IFDEF DEBUG} writeln('TwgDirTree.SetDirectoryIndex'); {$ENDIF} ANode := RootNode; ANode.ImageIndex := AValue; ANode := RootNode.FirstSubNode; FDirectoryIndex := AValue; while ANode <> nil do begin if (ANode.count > 0) then begin ANode := ANode.FirstSubNode; ANode.ImageIndex := AValue; end else begin if ANode.next <> nil then begin ANode := ANode.next; ANode.ImageIndex := AValue; end else begin while ANode.next = nil do begin ANode := ANode.parent; if ANode = nil then begin Exit; end; end; ANode := ANode.next; ANode.ImageIndex := AValue; end; end; end; end; procedure TwgDirTree.DoExpand(aNode : TwgTreeNode); var tmpNode : TwgTreeNode; begin inherited DoExpand(aNode); tmpNode := aNode.FirstSubNode; while tmpNode <> nil do begin if TmpNode.Count = 0 then begin ReadDirectories(tmpNode); tmpNode.Collapse; end; TmpNode := TmpNode.next; end; end; procedure TwgDirTree.DoChange; begin ActiveDirectory := GetAbsoluteDir(Selection); inherited DoChange; end; constructor TwgDirTree.Create(aOwner : TComponent); begin inherited Create(aOwner); ActiveDirectory := GetCurrentDir; end; procedure TwgDirTree.ReadDirectories(aParentNode : TwgTreeNode); var Items : TStringList; r : TSearchRec; i : integer; AItem : TwgTreeNode; begin Items := TStringList.Create; {$IFDEF DEBUG}writeln('ReadDirectories');{$ENDIF} if FindFirst(GetAbsoluteDir(aParentNode)+'*',faAnyFile,r)=0 then begin repeat if (faDirectory and r.attr = faDirectory) and (r.name <> '..') and (r.name <> '.') then Items.Append(Str8To16(r.name)); until FindNext(r) <> 0; end; Items.Sort; Sysutils.FindClose(r); // all directory entries are in the stringlist and sorted aParentNode.Clear; for i := 0 to Items.Count - 1 do begin AItem := aParentNode.AppendText(Items[i]); AItem.ImageIndex := FDirectoryIndex; end; Items.Destroy; end; function TwgDirTree.GetAbsoluteDir(aNode : TwgTreeNode) : string; var DirStr : String; begin DirStr := ''; if aNode = nil then begin DirStr := GetCurrentDir; {$IFDEF win32} Result := copy(DirStr,1,pos('\',DirStr)); // drive-name {$ELSE} Result := cDirSeparator; // root {$ENDIF} exit; end; while aNode.Parent <> nil do begin DirStr := aNode.Text8+cDirSeparator+DirStr; aNode := aNode.Parent; end; result := DirStr; end; procedure TwgDirTree.SetActiveDirectory(aValue : string); var aNode : TwgTreeNode; searchstr : string; tmpNode : TwgTreeNode; begin {$IFDEF DEBUG} writeln('SetactiveDirectory:',aValue); {$ENDIF} if aValue = '' then aValue := GetCurrentDir; //mein CurrentDir ist mein Delphi //Projektverzeichnis auf D: (Festplatte) if (FActiveDirectory = '') then // nothing shown begin if aValue[Length(AValue)] <> cDirSeparator then aValue := aValue + cDirSeparator; FActiveDirectory := aValue; RootNode.Clear; {$IFDEF win32} ReadDriveNames; {$ELSE} RootNode.AppendText8(copy(aValue,1,pos(cDirSeparator,aValue)-1)); {$ENDIF} ReadDirectories(RootNode.FirstSubNode); delete(aValue,1,pos(cDirSeparator,aValue)); aNode := RootNode.FirstSubNode; while aNode <> nil do // on windows - maybe there are more than one drive :) begin ReadDirectories(aNode); aNode.Collapse; aNode := aNode.Next; end; aNode := RootNode.FirstSubNode.FirstSubNode; while aNode <> nil do begin ReadDirectories(aNode); aNode.Collapse; aNode := aNode.Next; end; aNode := RootNode.FirstSubNode; while pos(cDirSeparator,aValue) <> 0 do begin searchstr := copy(aValue,1,pos(cDirSeparator,aValue)-1); aNode := aNode.FindSubNode(Str8To16(searchstr), false); aNode.Expand; delete(aValue,1,pos(cDirSeparator,aValue)); ReadDirectories(aNode); tmpNode := aNode.FirstSubNode; while tmpNode <> nil do begin ReadDirectories(tmpNode); tmpNode.Collapse; tmpNode := tmpNode.Next; end; end; end else begin if aValue[Length(aValue)] <> cDirSeparator then aValue := aValue + cDirSeparator; searchstr := aValue; FActiveDirectory := aValue; // drive into already read pathes aNode := RootNode; while pos(cDirSeparator,aValue) <> 0 do // liest alle verzeichnisse ein begin searchstr := copy(aValue,1,pos(cDirSeparator,aValue)-1); delete(aValue,1,pos(cDirSeparator,aValue)); if aNode.Count > 0 then begin tmpNode := aNode.FindSubNode(Str8To16(searchstr), false); if tmpNode = nil then begin writeln('Verzeichnis nicht gefunden: ',searchstr); // TODO - messagebox with error break; end else begin aNode := tmpNode; if length(aValue) <> 0 then aNode.Expand; end; end else // directory not read yet begin ReadDirectories(aNode); tmpNode := aNode.FirstSubNode; while tmpNode <> nil do begin ReadDirectories(tmpNode); tmpNode.Collapse; tmpNode := tmpNode.Next; end; tmpNode := aNode.FindSubNode(Str8To16(searchstr), false); if tmpNode = nil then begin writeln('Verzeichnis nicht gefunden: ',searchstr); // TODO - Messagebox with error break; end else begin aNode := tmpNode; if length(aValue) <> 0 then aNode.Expand; end; end; end; end; if aNode.count = 0 then begin ReadDirectories(aNode); aNode.Collapse; end; Selection := aNode; RePaint; end; end. |
Zitat |
FragenderHerbert |
Öffentliches Profil ansehen |
Mehr Beiträge von FragenderHerbert finden |
Registriert seit: 10. Jan 2006 Ort: Offenbach 3.798 Beiträge Delphi 12 Athens |
#5
10 Jahre alt...ich behaupte mal, nicht mehr ganz auf der Höhe der Zeit. Was soll das machen? Das ist mir ehrlich gesagt zu viel Code...
Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann |
Zitat |
Registriert seit: 11. Sep 2009 Ort: Neckertal 35 Beiträge Delphi 10.4 Sydney |
#6
das ist wohl der Fehler!
ADrive := Chr(Ord('A')+ACounter) + ':\';
Peter
|
Zitat |
Registriert seit: 11. Okt 2003 Ort: Elbflorenz 44.071 Beiträge Delphi 12 Athens |
#7
Nee, das ist schon OK.
Seine Webseite (www.grohnwaldt.de) ist down, auf und auf lptk.sourceforge.net findet man zumindestens eine nur 9 Jahre alte Version. Aber eine vermutliche Alternative hab ich ja schon genannt.
Zitat:
PS: TFileOpenDialog kann man auch auf Verzeichnisauswahl umstellen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat, wird PoSex im Delphi viel seltener praktiziert. |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |