@@ -19,6 +19,7 @@ TfrmExtFileDialog = class(TExtForm)
1919 comboEncoding: TComboBox;
2020 comboFileType: TComboBox;
2121 editFilename: TEdit;
22+ IdleTimerTreeNodeScrolltoview: TIdleTimer;
2223 lblPath: TLabel;
2324 lblLinebreaks: TLabel;
2425 lblEncoding: TLabel;
@@ -34,6 +35,7 @@ TfrmExtFileDialog = class(TExtForm)
3435 procedure FormCreate (Sender: TObject);
3536 procedure FormDestroy (Sender: TObject);
3637 procedure FormShow (Sender: TObject);
38+ procedure IdleTimerTreeNodeScrolltoviewTimer (Sender: TObject);
3739 procedure lblPathClick (Sender: TObject);
3840 procedure lblPathMouseDown (Sender: TObject; Button: TMouseButton;
3941 Shift: TShiftState; X, Y: Integer);
@@ -163,6 +165,17 @@ procedure TfrmExtFileDialog.FormShow(Sender: TObject);
163165 comboLineBreaks.ItemIndex := LineBreakIndexInt;
164166end ;
165167
168+ procedure TfrmExtFileDialog.IdleTimerTreeNodeScrolltoviewTimer (Sender: TObject);
169+ begin
170+ // Work around tree node not being in scroll area in the first place
171+ if not Visible then
172+ Exit;
173+ if Assigned(ShellTreeView.Selected) then
174+ ShellTreeView.Selected.MakeVisible;
175+ IdleTimerTreeNodeScrolltoview.AutoEnabled := False;
176+ IdleTimerTreeNodeScrolltoview.Enabled := False;
177+ end ;
178+
166179procedure TfrmExtFileDialog.lblPathClick (Sender: TObject);
167180begin
168181 if (not FClickedPathPart.IsEmpty) and DirectoryExists(FClickedPathPart) then begin
@@ -200,6 +213,7 @@ function TfrmExtFileDialog.GetPathPartAt(X: Integer): String;
200213 Inc(CurrentWidth, TextWidth);
201214 end ;
202215 if CharIndex > 0 then begin
216+ i := 0 ;
203217 for i:=CharIndex to Length(lblPath.Caption) do begin
204218 if Copy(lblPath.Caption, i, 1 ) = PathDelim then
205219 break;
@@ -330,15 +344,25 @@ procedure TfrmExtFileDialog.SetFileName(const AValue: String);
330344end ;
331345
332346procedure TfrmExtFileDialog.SetInitialDir (const AValue: String);
347+ var
348+ CurPath: String;
349+ i: Integer;
333350begin
351+ // Try to set path on tree
334352 FInitialDir := AValue;
335- try
336- ShellTreeView.Path := FInitialDir;
337- except
338- on E:EInvalidPath do begin
339- ErrorDialog(E.Message);
340- // In case, re-enable changing directory in tree
341- Exclude(FOptions, ofNoChangeDir);
353+ CurPath := AValue;
354+ for i:=0 to 10 do begin
355+ try
356+ ShellTreeView.Path := CurPath;
357+ Break;
358+ except
359+ on E:EInvalidPath do begin
360+ // Go up to parent folder
361+ // Testable on connections > advanced > file logging, due to virtual template strings.
362+ CurPath := ExtractFilePath(ExcludeTrailingPathDelimiter(CurPath));
363+ // In case, re-enable changing directory in tree
364+ Exclude(FOptions, ofNoChangeDir);
365+ end ;
342366 end ;
343367 end ;
344368end ;
0 commit comments