AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

StShellTreeview vs. StShellListview

Ein Thema von Mattze · begonnen am 20. Jan 2005 · letzter Beitrag vom 22. Jan 2005
Antwort Antwort
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#1

StShellTreeview vs. StShellListview

  Alt 20. Jan 2005, 19:55
Hallo,

ich habe ein großes Problem mit dem ich mich nun schonn eine ganze Weile nerve.
Ein StShelltreeview, ein StShellListview. Beide verbunden.
Und nun ein (nachvollziehbares) Beispiel:
Beide liegen auf einem PageControl auf unterschiedlichen Seiten.
Geöffnet wird zuerst die Seite mit der StShellListviewn - und bleibt leer.
Danach wird die Seite mit der StShellTreeview geöffnet und wird ordentlih angezeigt.
Dann wird die Seite mit StShellListview wieder geöffnet - und siehe da, sie wird nun
auch angezeigt.
Im Quelltext (StShlCtl.pas) habe ich inzwischen gefunden, dass es scheinbar die
Controllerzuweisung in TStCustomShellTreeview.loaded ist, die durcheinander kommt.
Ich kriege aber einfach nicht raus, was man da ändern muss, damit (natürlich) beide
ordentlich angezeigt werden.
Wie macht man das?

(Delphi7, XP)

Gruß
Matthias
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#2

Re: StShellTreeview vs. StShellListview

  Alt 21. Jan 2005, 09:04
Hallo,

noch eine Ergänzung:
Wenn beide gleichzeitig sichtbar sind (von Anfang an), funktioniert es richtig.
Ich weiß einfach nicht, wo ich da nachhaken muss!

Gruß
Matthias
  Mit Zitat antworten Zitat
martin-sun

Registriert seit: 11. Aug 2004
Ort: Weinheim
15 Beiträge
 
Delphi 2005 Professional
 
#3

Re: StShellTreeview vs. StShellListview

  Alt 21. Jan 2005, 09:24
hallöchen,

bin gerade auf arbeit und kann es deswegen nicht ausprobieren und es dir genau sagen.
aber wenn mich nicht alles täuscht liegt es daran, das der shelllistview erst aktualisiert wird, wenn ein objekt (z.b. ordner) im shelltreeview den focus bekommt. dies geschieht zum beispiel wenn der shelltreeview direkt auf der form ist. denn das wird das control beim start gezeichnet und ein element (z.B. odner) erhält standardmäßig den fokus. daraufhn wird dann auch der listview aktualisiert.
beim starten deines programmes liegt der shelltreeview auf einer nicht sichtbaren seite des pagecontrols und wird deshalb nicht sofort gezeichnet und kein element aus dem treeview bekommt den focus. folge ist das der listiew nicht aktualisiert wird und leer bleibt.

abhilfe kannst du schaffen, indem du die seite des pagecontrol mit dem treeview beim start deines programmes automatisch sichtbar machst.
oder wenn ich mich nicht irre hat der treeview auch so etwas wie eine selected eigenschaft. wenn du der etwas beim laden der form zuweist, sollte es auch funktionieren.

soweit meine vorschläge.

martin
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: StShellTreeview vs. StShellListview

  Alt 21. Jan 2005, 10:13
also wenn ich komponenten schreibe sorge ich dafür das änderungen erst mit dem nächsten Paint ausgeführt werden. Wenn ich also eine Komponente schreibe die Bilder animiert so macht diese nur etwas wenn sie auch sichtbar ist weil ich bei jeder änderung einfach ein Repaint auslöse und das Paint dann eben erst ausgeführt wird wenn die Komponente im sichtbaren bereich ist. (spaar performance, denn wozu die Oberfläche updaten etc. wenns niemand sieht). Ähnlich könnte es sich auch mit deiner Komponente verhalten.

Eventuell könntest du von der Ursprungsklasse ableiten und diese Methode dann selbst vorzeitig aufrufen, also bevor die andere eigentlich gepainted wird.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#5

Re: StShellTreeview vs. StShellListview

  Alt 21. Jan 2005, 14:18
Hallo,

vielen Dank für Eure Antworten. Ich hatte mir auch schon gedacht, dass das erst klappt, wenn die StShellTreeview gezeichnet wird und wollte das dann irgendwie erzwingen (auch mit dem Select!).
Es funktioniert aber trotzdem nicht. Irgendwo müsste es doch einen Einstiegspunkt geben, durch den die StShellTreeview gezwungen ist, wenigstens ihre nodes anzulegen. Ich nehme an, dass das reichen würde. Aber diesen Punkt finde ich einfach nicht.
Bsp: Selbst wenn ich im Form.create den Specialrootfolder oder irgendetwas anderes im StShellTreeview setze, passiert im StShellListview gar nichts. Auch ein externes StShellTreeview.repaint oder gar StShellTreeview.invalidate (form.create) macht gar nichts - solange die Komponente nicht angezeigt wird.
Und noch etwas komisches: Wenn StShellTreeview nicht angezeigt wird (aber vorher schon mal gezeigt wurde und sich deshalb StShellListview richtig gefüllt hat) und ich nun z. Bsp. StShellTreeview.specialrootfoler ändere, ändert sich in der StShellListview nichts. Erst, wenn die StShellTreeview wieder angezeigt wird.

Ich weiß wirklich nicht mehr, wo ich da noch suchen muss. Theoretisch (und logisch) sollte sich doch jede Änderung der StShellTreeview auch ohne ihre Anzeige gleich auch auf StShellListview auswirken.

Gruß
Matthias
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: StShellTreeview vs. StShellListview

  Alt 22. Jan 2005, 15:37
wie gesagt, du musst eine neue davon ableiten. Mit Repaint erreichst du nur das sobald die komponenten sichtbar ist ein paint ausgelöst wird. Du müsstest also das Paint direkt aufrufen was nicht geht da es im protected-teil ist. Deswegen ableiten und eine Methode hinzufügen die das paint direkt aufruft oder einfach das Paint ins public verschieben.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#7

Re: StShellTreeview vs. StShellListview

  Alt 22. Jan 2005, 19:24
Hallo,

ich glaube, ich habe es raus - oder besser, ich staune und glaube es eigentlich nicht.
Ergänzung in der Procedure TStCustomShellListview.RefreshList:
Delphi-Quellcode:
  if assigned(FTreeview) and not assigned(FFolder) then begin
    if assigned(ftreeview.fselectedfolder) then
      FFolder := TStShellFolder.CreateFromPidl(ftreeview.Fselectedfolder.pidl, nil)
    else
      FFolder := TStShellFolder.CreateFromPidl(ftreeview.FFolders[0].pidl, nil);
  end;
Das ganze VOR:
Delphi-Quellcode:
  if Enumerate then
    Controller.Enumerate(FFolder.Pidl, etList);
Dann noch eine Ergänzung in TStCustomShellListview.WndProc (Ob es da sinnvoll ist?):
nach
Delphi-Quellcode:
    {$ENDIF}
    if (msg=WM_create) then begin
      refreshlist(true);
      if assigned(ftreeview) then ftreeview.StartFolderSet:=true;
    end;
vor
Delphi-Quellcode:
  end;
  inherited WndProc(Message);
Das ich das bei WM_create mache, kommt daher, dass ich es nur einmal machen möchte und ich habe einfach nichts anderes gefunden als beim Erzeugen der Komponente.
Alles andere funktioniert ja dann auf eine andere Art.

Gruß
Matthias
  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 17:55 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