TShellTreeView, Pfad lesen setzen [gelöst]

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

TShellTreeView, Pfad lesen setzen [gelöst]

Beitrag von corpsman »

Ho,

manchmal blick ichs einfach nicht.

Ich will eine TShellTreeView benutzen, mit der man so wunderschön die Ordnerstruckturen "browsen" kann. Nur leider finde ich einfach nicht den Eintrag wo ich den aktuellen Ordner lesen / setzen kann.

Könnt ihr mir den evtl verraten ?
Zuletzt geändert von corpsman am Fr 6. Nov 2009, 07:16, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: TShellTreeView, Pfad lesen setzen

Beitrag von theo »

Meinst du das Basisverzeichnis setzen?
http://bugs.freepascal.org/view.php?id=13735

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TShellTreeView, Pfad lesen setzen

Beitrag von corpsman »

ne ich meine das "aktuelle" verzeichniss

also inklusive der Unterverzeichnisse
--
Just try it

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: TShellTreeView, Pfad lesen setzen

Beitrag von theo »

Ich versteh dich nicht so ganz.

Also den Ausgewählten Node kannst du z.B. so erhalten.

Code: Alles auswählen

Caption:=ShellTreeView1.Selected.Text+' bzw. '+ShellTreeView1.Selected.GetTextPath;


Das Ausgew. Verz. setzen ist glaub ich nicht direkt unterstützt.
Ich fürchte da muss man sich durchhangeln wie z.B. (wählt das erste Unterverz von /home aus und öffnet es, nur ein dummes Bsp.).

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var ANode:TTreenode;
begin
 ANode:=ShellTreeView1.TopItem;
 Repeat
  ANode:=ANode.GetNext;
 Until (ANode=nil) or (ANode.Text='home');
 Anode.Expanded:=True;
 ANode:=ANode.GetFirstChild;
 Anode.Expanded:=True;
 Anode.Selected:=true;
end;

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TShellTreeView, Pfad lesen setzen

Beitrag von corpsman »

genau das meinte ich .

Danke
--
Just try it

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: TShellTreeView, Pfad lesen setzen

Beitrag von theo »

Ich hab mal noch eben eine Procedure für das öffnen von Unterverz. gehackt.

Code: Alles auswählen

Procedure ShellTreeViewSetTextPath(STV:TShelltreeview; Path:String);
Var Str: TStringList;
  ANode: TTreeNode;
  i: integer;
Begin
  If Not DirectoryExistsUTF8(Path) Then Exit;
 
  Str := TStringList.Create;
  Str.Delimiter := PathDelim;       
  Str.DelimitedText := Path;
 
  For i:=Str.Count-1 Downto 0 Do
    If Str[i]='' Then Str.Delete(i);
 
  {$ifdef windows}
    Str[0]:=Str[0]+PathDelim;
  {$endif}
 
  STV.BeginUpdate;
  ANode := STV.TopItem;
 
  For i:=0 To Str.Count-1 Do
    Begin
      While (ANode<>Nil) And (ANode.Text<>Str[i]) Do
        Begin
          ANode := ANode.GetNextSibling;
        End;
      If Anode<>Nil Then
        Begin
          Anode.Expanded := True;
          ANode.Selected := True;       
          Anode := ANode.GetFirstChild;
        End
      Else Exit;
    End;
 
  STV.EndUpdate;
End;


Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShellTreeViewSetTextPath(ShellTreeView1,'/home/theo/Documents');
end;

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TShellTreeView, Pfad lesen setzen [gelöst]

Beitrag von corpsman »

Jungs ihr seid spitze, vielen Dank,

evtl haben wir Glück und ein entwickler von Lazarus liest das und fügt diese wirklich sinnvollen Methoden an die TShellTreeView mit an ;).

ich hab nun nur noch ein Problem :

Wenn ich in TForm.create den Pfad setze geht das nicht, weil die Schelltreeview da die Ordner Informationen noch nicht hat. Wie "stöst man das einlesen der Ordnerinformationen also an ?

Ich hab mir mal erlaubt, die Variablen in der Schleife noch frei zu geben :

Code: Alles auswählen

Procedure ShellTreeViewSetTextPath(STV: TShelltreeview; Path: String);
Var
  Str: TStringList;
  ANode: TTreeNode;
  i: integer;
Begin
  If Not DirectoryExistsUTF8(Path) Then Exit;
 
  Str := TStringList.Create;
  Str.Delimiter := PathDelim;
  Str.DelimitedText := Path;
 
  For i := Str.Count - 1 Downto 0 Do
    If Str[i] = '' Then Str.Delete(i);
 
{$IFDEF windows}
  Str[0] := Str[0] + PathDelim;
{$ENDIF}
 
  STV.BeginUpdate;
  ANode := STV.TopItem;
 
  For i := 0 To Str.Count - 1 Do Begin
    While (ANode <> Nil) And (ANode.Text <> Str[i]) Do Begin
      ANode := ANode.GetNextSibling;
    End;
    If Anode <> Nil Then Begin
      Anode.Expanded := True;
      ANode.Selected := True;
      Anode := ANode.GetFirstChild;
    End
    Else Begin
      STV.EndUpdate;
      str.free;
      Exit;
 
    End;
  End;
  str.free;
  STV.EndUpdate;
End;
--
Just try it

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: TShellTreeView, Pfad lesen setzen [gelöst]

Beitrag von theo »

corpsman hat geschrieben:Jungs ihr seid spitze, vielen Dank,

Also ich bin nur ein Junge.. :oops:
corpsman hat geschrieben:Wenn ich in TForm.create den Pfad setze geht das nicht, weil die Schelltreeview da die Ordner Informationen noch nicht hat. Wie "stöst man das einlesen der Ordnerinformationen also an ?

In OnShow

corpsman hat geschrieben:Ich hab mir mal erlaubt, die Variablen in der Schleife noch frei zu geben :

Stimmt.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TShellTreeView, Pfad lesen setzen [gelöst]

Beitrag von corpsman »

also ich hab das nun mit einer Blocking variable in onPaint gemacht.

Wird das onShow nur ein einziges mal ausgeführt, ? oder auch öfters so wie onPaint ?
--
Just try it

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: TShellTreeView, Pfad lesen setzen [gelöst]

Beitrag von theo »

corpsman hat geschrieben:also ich hab das nun mit einer Blocking variable in onPaint gemacht.

Wird das onShow nur ein einziges mal ausgeführt, ? oder auch öfters so wie onPaint ?


Afaik wird OnShow ausgef., wenn sich die "visible" Eigenschaft des Formulars ändert, also bei einem Hauptformular praktisch nur einmal.
Ein Flag (Blocking variable) kann aber auch da letzte Zweifel beseitigen. ;-)

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: TShellTreeView, Pfad lesen setzen [gelöst]

Beitrag von RSE »

theo hat geschrieben:Afaik wird OnShow ausgef., wenn sich die "visible" Eigenschaft des Formulars ändert


Korrekt. Bei einem Formular kann das also nur passieren, wenn du es zwischendurch versteckst und später wieder anzeigst. Das macht eigentlich nur Sinn, wenn du ein Icon in der Systray (alternative Bezeichnung: DNU - Dings neben der Uhr :mrgreen: ) hast und dorthin "minimieren" willst. Damit wird nämlich im Endeffekt nur das Hauptfenster versteckt und beim späteren "wiederherstellen" wieder angezeigt -> OnShow wird erneut ausgeführt. Daher ist eine Initialisierung im OnShow auch besser. Hast du eine Behandlungsroutine für OnPaint, dann wird die ständig aufgerufen (das heißt Stack schaufeln, deine Bedingung prüfen, Stack zurückschaufeln), und das an einer zeitkritischen Stelle (Wenns zu lange dauert, kann es flackern).
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TShellTreeView, Pfad lesen setzen [gelöst]

Beitrag von corpsman »

Danke für die Erklärung, ich hab das Problem mit den DNU ;) nennt sich glaubig trayicons, also mach ichs in onShow mit Blocking und alles ist 1a *happy*
--
Just try it

Antworten