AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte OpenDirDialog
Thema durchsuchen
Ansicht
Themen-Optionen

OpenDirDialog

Ein Thema von Garfield · begonnen am 22. Jul 2007 · letzter Beitrag vom 27. Jun 2011
Antwort Antwort
Seite 5 von 6   « Erste     345 6      
Benutzerbild von Garfield
Garfield
Registriert seit: 9. Jul 2004
Beschreibung

Für die Auswahl eines Verzeichnisses findet man viele ähnliche Quelltexte, welche ShBrowseForFolder und BrowseInfo verwenden. Dabei hatte ich unter Win2000 immer das Problem mit dem Einstellen der Größe, der Position und ob der Button "Neuer Ordner" angezeigt wird. Das bedeutet, der Button wurde nur angezeigt, wenn das Flag für die NewGUI gesetzt wurde, dann konnte jedoch die Größe nicht eingestellt werden. Die Positionierung habe ich gar nicht hinbekommen.

Vermutlich werden die meisten die Komponente nicht benötigen. Mir geht es allerdings mehr darum, ein paar Verbesserungsvorschläge zu bekommen.

Die Komponente erstellt ein TForm und setzt dessen Caption. Auf dem Formular befindet sich ein Verzeichnisbaum. Dieser wurde bis Build 9 in einem TShellTreeView dargestellt. Ab Build 10 wird der TPathExplorer (eine Erweiterung des FileExplorer) verwendet. Der TPathExplorer zeigt auch bei nicht unicodefähigen Delphi Widestrings an. Darunter befinden sich Button für OK und Abbruch.

Mit "F5" werden die Unerordner des markierten Ordners neu eingelesen. Bis Build 12 konnte man mit der Taste "Einf" den "Neuer Ordner"-Dialog auch ohne entsprechende Option aufrufen und mit "Entf" Ordner löschen.

Der Dialog bietet weiterhin diese Optionen:
  • Über dem Verzeichnisbaum kann ein Label mit einem Hinweis angezeigt werden.
  • Unter dem Verzeichnisbaum kann ein Edit angezeigt werden. In dieses kann man den Pfad direkt angeben. Sofern dieser existiert, wird er im Verzeichnisbaum aufgeblättert. Existiert er nicht, muss er seit Build 10 selbst angelegt werden.
  • Es kann ein Button "Neuer Ordner" eingefügt werden. Über diesen wird ein Dialog zur Erstellung eines Ordners geöffnet.
  • Es kann zugelassen werden, dass die Größe des Dialoges vom Anwender verändert werden kann.
Siehe Bild ODD.png unten.

Hinweis

Die aktuelle Version läuft unter Turbo Delphi. Da es nicht unicodefähig ist, werden in der Demo für bestimmte Komponenten die TNT Hack Controls von Himitsu verwendet. Ein direktes Einbinden der TNT Controls sollte ebenfalls funktionieren. Ab Delphi 2009 können die Tnt (Hack) Controls auch aus den uses entfernt werden. In der Demo war es notwendig, die Schriftart der Edits auf Tahoma zu ändern, damit Unicode richtig dargestellt wurde. Unter Delphi 7 funktioniert die Komponente derzeit nur bis Build 9 a.

Demo

In der Demo wird die Komponente dynamisch eingebunden. D.h. die Unit gfOpenDirDlg wurde zum Projekt hinzugefügt und in die uses eingetragen. In der Procedure, in welcher der Dialog benötigt wird, wird eine Variable vom Typ TOpenDirDialog deklariert, die Class erstellt und wieder freigegeben. Für Delphi ohne Unicode, wie dem von mir für die Demo verwendeten Turbo Delphi, werden Unicodekomponenten benötigt. Die Demo verwendet, da die TNT Controls nicht in Turbo Delphi Explorer installiert werden können, die oben bereits erwähnten TNT Hacks von Himitsu. Diese sind in der Demo nicht enthalten. Sie müssen noch hinzugefügt und in den Suchpfad des Projektes eingetragen werden (TntHack und TntHack\Sources).

Eigenschaften ab Build 10
Delphi-Quellcode:
Caption : String;
Fontname : String;
Title : WideString;
Root : String;
InitialDir : WideString;
Path : WideString;
Height : Integer;
Left : Integer;
Top : Integer;
Width : Integer;
Position : TPosition;
Options : TOpenDirOptions;
Eigenschaften bis Build 9
Delphi-Quellcode:
Caption : String;
Title : String;
Fontname : String;
Root : String;
InitialDir : String;
Path : String;
Height : Integer;
Left : Integer;
Top : Integer;
Width : Integer;
Position : TPosition;
Options : TOpenDirOptions;
InitialDir wird gesetzt und Path ist die Rückgabevariable.

Siehe ebenfalls Bild "odd.png" unten.

Historie

05.10.2010 - Build 15
  • destructor TOpenDirDialog.Destroy entfernt.
  • procedure TOpenDirDialog.FormClose eingefügt.
  • Auswertung von DelphiCompilerVersionen eingefügt.
  • Root war als String anstelle als Widestring deklariert.
15.07.2010 - Build 14
  • Nach dem Löschen eines Ordners wird auch der übergeordnete neu gescannt.
  • Beim Aktualisieren per F5 wird auch der übergeordnete Ordner neu gescannt.
  • Workaround dafür, dass bei sofortiger Erstellung des ersten dieser zweimal angezeigt wird.
  • Button beim Formular für den Namen des neuen Ordners auf normale Größe gesetzt und Formularhöhe angepasst.
04.05.2010 - Build 13
  • Option odPerformCreate entfernt. Funktionierte mit dem PathExplorer nicht mehr, da nicht der Text aus dem Edit sondern der Folder aus dem PathExplorer verwendet wurde.
  • Ist die Option odCaption nicht gesetzt, wird die Caption der MainForm verwendet.
  • Das Einfügen und Löschen über "Einf" und "Entf" ist nur noch möglich, wenn die Option "odNewFolder" gesetzt ist.
  • Beim ReScan wurden die gefundenen Einträge nur hinzugefügt. Jetzt werden erst die besehenden Einträge gelöscht.
  • Mit F5 wird der markierte Ordner aktualisiert.
  • Variable OpenDirDlg_Build für die Versionsabfrage eingefügt.
03.05.2010 - Build 12
  • function ExtractDir eingefügt.
  • function ForceDirectoryW eingefügt.
  • ForceDirectories durch ForceDirectoryW ersetzt.
  • Beim NewFolder Dialog war die Variable für den Pfad noch als String deklariert.
  • Beim Setzen des InitialDir wurde LowerCase anstelle von WideLowerCase verwendet.
17.04.2010 - Build 11
  • Auswertung der Compilerdirektive Unicode zum Laden der Unit TntHackStdCtrls.
  • Wegen der Verwendung der Unit TntHackStdCtrls wird das TWideLabel nicht mehr benötigt und wurde deshalb entfernt.
  • Komponente PathExplorer integriert um zweite Unit einzusparen.
11.04.2010 - Build 10
  • Unit ShellCtrls mit TShellTreeView gegen Unit uPathExplorer mit TPathExplorer ausgetauscht.
  • Die Property FInitialDir und FPath auf WideString geändert.
  • Function DirExists für Namen in Widestring eingefügt und DirectoryExists entfernt.
  • Function DeleteDirectory in DirDelete umbenannt und für Widestring geändert.
  • ExtractFileDrive aus Unit SysUtils als ExtractDrive übernommen, auf Widestrings geändert und abschließenden Pathdelim hinzugefügt.
  • TRootFolder und nFolder aus der Unit ShellCtrls übernommen, damit die Verzeichnisnamen nicht geändert werden müssen.
  • FRoot wird nicht als String sondern CSIDL angegeben.
  • OpenDirDlg: TreeKeyDown um Einfg ergänzt.
  • NewFolder: TLabel in TWideLabel geändert.
  • NewFolder: NewFolderKeyDown eingefügt.
  • Existiert der im Edit eingetragene Ordner, wird er aufgeschlagen.
  • Nicht existierende Ordner werden im Edit rot angezeigt.
29.08.2010 - Build 9a
  • Schutzverletzung beim Schließen des Dialoges beseitigt. Trat nur unter D7 auf.
  • WideLabel entfernt.
  • Variablen vereinheitlicht.
  • Nach dem Setzen des Borderstyles war das InitialDir nicht mehr voreingestellt.
11.09.2008 - Build 9 (Versionen für D7/TD2006 und D2009)
  • ST_OrdnerChange war nicht eingebunden.
  • Property OnCreate entfernt.
  • : aus der Liste der verbotenen Keys herausgenommen, weil sonst immer das Laufwerk angeklickt werden muss.
  • (D2009) TWideLabel entfernt.
  • (D2009) WideString in String geändert.
  • (D2009) In EditChange wird auch die Länge des Pfades überprüft, da DirectoryExists beim Laufwerk kein \ benötigt.
  • (D2009) In EditKeyPress wird CharInSet verwendet.
15.08.2008 - Build 8
  • Beim Resize wurde nicht geprüft, ob odNewFolder in FOptions enthalten ist.
  • Breite des TShellTreeView beim Execute korrigiert.
  • Beim Resize wird eine Mindestgröße beachtet.
19.09.2007 - Build 7
  • Initialvariablen und Sizegrip umbenannt.
  • Erstellung des Labels für den Title geändert. Dadurch funktioniert nun der Zeilenumbruch.
  • TLabel für den Title gegen TWideLabel - ein modifiziertes TCustomLabel - ausgetauscht.
02.09.2007 - Build 6
  • Eigenschaft Fontname für das TLabel Title eingefügt.
  • Vor dem Setzen der Größe des TLabel für den Title wird die Höhe der gewählten Schriftart ermittelt.
29.08.2007 - Build 524.08.2007 - Build 4
  • Zwei von der Klasse unabhängige Variablen eingefügt, welche sich die Größe des OpenDirDialoges "merken".
  • SizeGrip mit TSizeGripPanel eingefügt.
17.08.2007 - Build 3
  • Bei BorderIcon biMinimize und biMaximize entfernt.
  • War der Text in der Editbox kein gültiges Verzeichnis wurde dem TShellTreeView in der Procedure EditChange ein leerer String übergeben.
  • Enthält der Path des TShellTreeView beim Beenden des Dialogs am Ende keinen : oder \\ wird er nicht an FPath übergeben.
  • Die Komponenten, welche im Execute ohne Namen erstellt wurden sind in der Class deklariert.
  • Dadurch konnte OpenDirDlgResize eingefügt werden. Die Größenverstellung wird mit der Option odSizeable erlaubt.
  • Variablen für Höhe und Breite ausserhalb der Klasse angelegt. Diese werden bei der Initialisation gesetzt und beim Resize geändert. Dadurch bleiben sie bis zum Schliessen der Application unabhängig von der Klasse erhalten.
04.08.2007 - Build 2
  • Das in der EditBox bei Crtl + Space eingegebene Leerzeichen wird entfernt.
  • Während der Eingabe des neuen Ordnernamen wird dieser auf ungültige Zeichen '<', '>', '|', '/', '"', ':', '?' geprüft, wobei '/' in '\' geändert wird.
  • dto für die Eingaben in der EditBox.
  • Fehlermeldung, wenn das Verzeichnis nicht erstellt werden konnte.
  • Beenden des Dialogs mit ESC- und Enter-Taste
22.07.2007 - Build 1
  • Scalierung entfernt.
  • Endlosschleife bei Änderung des Root berichtigt.
  • Rootänderung funktioniert, wurde beim Execute aufgehoben.
  • Das fehlende Initialdir wird abgefangen.
22.07.2007 - Initial
Miniaturansicht angehängter Grafiken
odd12_112.png  
Angehängte Dateien
Dateityp: 7z OpenDirDialog_9a.7z (224,0 KB, 106x aufgerufen)
Dateityp: 7z OpenDirDialog_15_exe.7z (247,9 KB, 111x aufgerufen)
Dateityp: 7z OpenDirDialog_15_src.7z (172,2 KB, 165x aufgerufen)
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof

Geändert von Garfield ( 5. Okt 2010 um 14:36 Uhr)
 
ASM

 
Delphi 7 Enterprise
 
#41
  Alt 24. Aug 2010, 18:12
Obwohl die Komponente ja auch zur Verwendung für Delphi 7 angegeben ist, kann ich sie nicht unter D7 zum Laufen bringen. Zwar wird sie bei ihrer Installation in die Komponenten-Palette scheinbar fehlerfrei kompiliert und in die Palette übernommen. Aber bei dem Versuch, aus der Palette eine Instanz dieser Komponente in eine Form aufzunehmen, wird dies mit der Fehlermeldung einer "Access violation" im entsprechenden bpl-Module vereitelt. Die gleiche "Access violation" tritt auf, wenn ich versuche, eine Instanz von TOpenDirDialog zur Laufzeit dynamisch zu generieren.

Allerdings habe ich in der Typdeklaration von TTreeView = class(TCustomTreeView) die published Properties
OnMouseActivate, OnMouseEnter und OnMouseLeave auskommentieren müssen, da sich der D7-Kompiler ansonsten mit einer Errormessage beklagt hatte, dass diese Properties nicht in der Basisklasse existieren. Möglicherweise hängt das o.g. Problem mit dem folglichen Fehlen dieser Properties zusammen ?

Auch TCustomTreeView (das aus der TTreeView abgeleitet ist) wird in der Komponentenunit gfOpenDirDlg deklariert, tatsächlich ohne diese genannten Properties. Diese müssten sich also von der nächst tieferen Basisklasse, das ist TWinControl, vererben, welche in der Unit Controls deklariert ist. Tun sie aber nicht. Dort gibt es Eventhandler für verschiedene OnMouse-Events, aber definitiv keine, die den o.g. (eben nicht vorhandenen) Properties zugewiesen wären,

Heißt das nun, dass die aktuelle Komponente grundsätzlich nicht mehr für D7 eingesetzt werden kann ?
Und wenn ja, wäre es dann möglich, noch einmal Zugriff auf die ursprüngliche, D7-kompatible Version der Komponente zu bekommen ?
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

 
Delphi XE5 Professional
 
#42
  Alt 26. Aug 2010, 01:28
Hallo ASM,

vielen Dank für Deinen Bericht.

Unter Delphi 7 Personal fing es an. Dann kam Turbo Delphi dazu und ab Build 10 entfiel Delphi 7. Leider muss ich zugeben, dass ich die Komponente genauso wie in der Demo nur zur Laufzeit einbinde und nicht installiert habe.

Die Classes TCustomTreeView und TTreeView habe ich aus TurboDelphi kopiert und angepasst. Die Properties OnMouseActivate, OnMouseEnter und OnMouseLeave dürften wohl nach Delphi 7 dazugekommen sein. Das scheint auch für einige ControlStyles zuzutreffen.

Mal sehen, was da machen kann.
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

 
Delphi XE5 Professional
 
#43
  Alt 27. Aug 2010, 01:18
Jetzt läuft die Komponente unter D7 und TD. Allerdings mit dem Unterschied, dass unter D7 kein Text im TreeView ist. Warum weiß ich allerdings nicht; die Unterschiede in der Komponente sind nicht allerdings nicht dafür ursächlich. Entweder habe ich noch einen Fehler in der Komponente oder es liegt an den TNT Controls.
Angehängte Dateien
Dateityp: 7z OpenDirDialog.7z (397,6 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

 
Delphi XE5 Professional
 
#44
  Alt 28. Aug 2010, 02:25
Sieht so aus, als würde Delphi 7 die Widestrings trotz TNT Controls nicht im TreeView anzeigen können.

Möglicherweis hängt es mit den Events TTVCustomDrawEvent, TTVCustomDrawItemEvent, TTVAdvancedCustomDrawEvent und TTVAdvancedCustomDrawItemEvent zusammen.

Geändert von Garfield (28. Aug 2010 um 03:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

 
Delphi XE5 Professional
 
#45
  Alt 28. Aug 2010, 17:41
Es scheint an der procedure TCustomTreeViewW.CNNotify(var Message: TWMNotify); zu hängen. Bei TurboDelphi wird diese ab dem ShowModal ständig aufgerufen und das Tree neu gezeichnet. Bei Delphi 7 nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

 
Delphi XE5 Professional
 
#46
  Alt 28. Aug 2010, 19:41
Also die Messages kommen doch. Allerdings anstelle der *W die *A, obwohl der Tree auf Unicode eingestellt sein sollte.
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

 
Delphi XE5 Professional
 
#47
  Alt 29. Aug 2010, 21:21
Warum auch immer wird anscheinend aus dem TTreeViewW beim ShowModal ein TTreeViewA. Das habe ich im Moment nicht so hinbekommen wie ich es mir gewünscht habe. Deshalb habe ich die Versionen, welche anstelle des TTreeView noch das TShellTreeView verwenden durchgesehen und bei der letzten ein paar Fehler, welche nicht unter Turbo Delphi aber unter Delphi 7 aufgetreten sind, bereinigt. Die Komponente samt Demo gibt es im ersen Beitrag (OpenDirDialog_9a.7z).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#48
  Alt 29. Aug 2010, 21:42
Das ältere Delphi hat nur die ANSI-APIs in seiner Message-Loop.
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

 
Delphi XE5 Professional
 
#49
  Alt 29. Aug 2010, 22:24
Ich habe die TTreeView teilweise aus TurboDelphi kopiert und modifiziert. Bevor das Treeview angezeigt wird, werden auch WideMessages verschickt. Nur müssen da die Widestrings der Nodes zur Anzeige in Strings konvertiert werden. Wenn das Treeview angezeigt wird, gibt es nur noch Ansimessages. Ich habe den Eindruck, ich habe zu wenig kopiert.

Geändert von Garfield (29. Aug 2010 um 22:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#50
  Alt 29. Aug 2010, 22:41
Messages werden in die Message-Queue eingetragen
und die Message-Loop in Application.Run, bzw. Application.ProcessMessages fragen nur über die Ansi-APIs die Message-Queue ab und leiten dann diese Messages als "ANSI" an die Komponenten weiter.

Delphi 7 hat eine reine Ansi-MessageLoop, wärend in Turbo Delphi für Unicode-Messages auf die Unicode-API umgeschaltet wird.


Delphi-Quellcode:
// Delphi 7-MessageLoop

function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
  Handled: Boolean;
begin
  Result := False;
  if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
  begin
    Result := True;
    if Msg.Message <> WM_QUIT then
    begin
      Handled := False;
      if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
      if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
        not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end
    else
      FTerminate := True;
  end;
end;
Delphi-Quellcode:
// Turbo Delphi-, bzw. Delphi 2006-MessageLoop

function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
  Unicode: Boolean;
  Handled: Boolean;
  MsgExists: Boolean;
begin
  Result := False;
  if PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then
  begin
    Unicode := (Msg.hwnd <> 0) and IsWindowUnicode(Msg.hwnd);
    if Unicode then
      MsgExists := PeekMessageW(Msg, 0, 0, 0, PM_REMOVE)
    else
      MsgExists := PeekMessage(Msg, 0, 0, 0, PM_REMOVE);
    if not MsgExists then Exit;
    Result := True;
    if Msg.Message <> WM_QUIT then
    begin
      Handled := False;
      if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
      if not IsPreProcessMessage(Msg) and not IsHintMsg(Msg) and
        not Handled and not IsMDIMsg(Msg) and
        not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
      begin
        TranslateMessage(Msg);
        if Unicode then
          DispatchMessageW(Msg)
        else
          DispatchMessage(Msg);
      end;
    end
    else
      FTerminate := True;
  end;
end;
Schon erstaunlich wann man bei Codegear anfing sich für's Unicode vorzubereiten, wärend Einige jetzt erst rumheulen, wegen D2009+

Geändert von himitsu (29. Aug 2010 um 22:45 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 6   « Erste     345 6      


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 06:47 Uhr.
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