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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.361 Beiträge
 
Delphi 12 Athens
 
#1

AW: OpenDirDialog

  Alt 29. Aug 2010, 20:42
Das ältere Delphi hat nur die ANSI-APIs in seiner Message-Loop.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#2

AW: OpenDirDialog

  Alt 29. Aug 2010, 21: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.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof

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

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.361 Beiträge
 
Delphi 12 Athens
 
#3

AW: OpenDirDialog

  Alt 29. Aug 2010, 21: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+
Ein Therapeut entspricht 1024 Gigapeut.

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

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#4

AW: OpenDirDialog

  Alt 29. Aug 2010, 22:37
Ein Teil Unicode muss schon enthalten sein. Zumindest sind einige Konstanten und Funktionen bereits in D7 enthalten bzw. bekannt. Muss morgen mal weitersehen. Ich will es ja am liebsten in nonVCL weitermachen, aber das will nicht so ganz.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.361 Beiträge
 
Delphi 12 Athens
 
#5

AW: OpenDirDialog

  Alt 30. Aug 2010, 07:14
Wenn man selber Messages verschickt und dort der "Text" nur als zusätzlicher/unabhängiger Parameter mit übergeben wird, dann passiert nichts,
aber wenn man TextMessages nutzt, bei welchen explizit Text angegeben wird, dann wird dieses in Delphi 7, durch die Ansi-WinAPI, nach ANSI übersetzt.

Vielleicht hilft es dir ja etwas:
Delphi-Quellcode:
Uses Windows, Messages, ActiveX, ShlObj;

Type TFolderRec = Record
    Title, Caption, Folder: PWideChar;
  End;
  PFolderRec = ^TFolderRec;

Function FolderCallback(Dlg: HWND; Msg: LongWord; LParam: Pointer; Data: PFolderRec): LongWord; StdCall;
  Var Temp: Array[0..MAX_PATH-1] of WideChar;

  Begin
    Case Msg of
      BFFM_INITIALIZED: Begin
        If Data^.Title <> nil Then
          SendMessageW(Dlg, WM_SETTEXT, 0, Integer(Data^.Title));
        If Data^.Folder <> nil Then
          SendMessage(Dlg, BFFM_SETSELECTION, LongInt(True), Integer(Data^.Folder));
      End;
      BFFM_SELCHANGED: Begin
        SHGetPathFromIDListW(PItemIDList(LParam), @Temp);
        If SendMessageW(Dlg, BFFM_SETSTATUSTEXT, 0, LongWord(@Temp)) = 0 Then
          SetWindowTextW(GetDlgItem(Dlg, 14146), PWideChar(WideString(Data^.Caption)
            + sLineBreak + sLineBreak + Temp));
      End;
      BFFM_VALIDATEFAILED: Begin
        Result := 1;
        Exit;
      End;
    End;
    Result := 0;
  End;

Function BrowseForFolder(Wnd: HWND; Const Title, Caption, PreSelectedFolder: WideString; AllowNewFolder: Boolean; Var SelectedDir: WideString): Boolean;
  Var BI: TBrowseInfo;
    FolderRec: TFolderRec;
    pidlResult: PItemIDList;
    Temp: Array[0..MAX_PATH-1] of WideChar;
    Malloc: IMalloc;

  Begin
    Result := False;
    ZeroMemory(@BI, SizeOf(TBrowseInfo));
    BI.hwndOwner := Wnd;
    BI.lpszTitle := PWideChar(Caption);
    BI.ulFlags := BIF_STATUSTEXT {or BIF_NEWDIALOGSTYLE} or BIF_SHAREABLE or BIF_RETURNONLYFSDIRS;
    BI.lpfn := @FolderCallBack;
    BI.lParam := Integer(@FolderRec);
    If not AllowNewFolder Then BI.ulFlags := BI.ulFlags or BIF_NONEWFOLDERBUTTON;
    FolderRec.Title := PWideChar(Title);
    FolderRec.Caption := PWideChar(Caption);
    FolderRec.Folder := PWideChar(PreSelectedFolder);
    pidlResult := SHBrowseForFolderW(BI);
    If pidlResult = nil Then Exit;
    If SHGetPathFromIdListW(pidlResult, @Temp[0]) Then Begin
      Result := True;
      SelectedDir := Temp;
    End;
    If SHGetMalloc(Malloc) = S_OK Then
      Try
        Malloc.Free(pidlResult);
      Finally
        Malloc := nil;
      End;
  End;
Ich nutzte diesen Code allerdings selber nur mit Char/PChar/String und weiß jetzt nicht, ob er auch in Delphi 7 läuft.
In TDE lief er zwar auch als UnicodeVersion, aber das hat ja nicht viel zu sagen.

Wie gesagt, bei sowas wie SendMessage+WM_SETTEXT und SetWindowText mußt du aufpassen, da diese nach Ansi übersetzt werden könnten.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (30. Aug 2010 um 07:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#6

AW: OpenDirDialog

  Alt 30. Aug 2010, 09:19
Unter Turbo Delphi wird der Text so zugewiesen:
Delphi-Quellcode:
    TVN_GETDISPINFOW:
    with PTVDispInfoW(NMHdr)^
    do begin
      Node := GetNodeFromItem(item);
      if Node <> nil
      then begin
        if (item.mask and TVIF_TEXT) <> 0
        then lStrCpyNW(item.pszText, PWideChar(Node.Text), item.cchTextMax - 1);
        if (item.mask and TVIF_IMAGE) <> 0
        then begin
          GetImageIndex(Node);
          item.iImage := Node.ImageIndex;
        end;
        if (item.mask and TVIF_SELECTEDIMAGE) <> 0
        then begin
          GetSelectedIndex(Node);
          item.iSelectedImage := Node.SelectedIndex;
        end;
      end;
    end;
Unter Delphi 7 hat man dann einen leeren Eintrag und muss Node.Text in einen String umwandeln, damit man einen Text bekommt.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#7

AW: OpenDirDialog

  Alt 5. Okt 2010, 13:51
Kleines Update.

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.
Die beiden Formulare werden mit ShowModal angezeigt. Deshalb habe ich für diese ein FormClose mit der Zeile "Action := caFree;" eingefügt. Das Überschreiben von Destroy ist nicht notwendig und wurde entfernt.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz