Announcement

Collapse
No announcement yet.

'versteckten' Canvas einer Komponente ermitteln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 'versteckten' Canvas einer Komponente ermitteln

    hallo,

    ich programmiere mir ein tool zum auslesen eines beliebigen Verzeichnisbaums. Ich speichere mir genau den angegebenen Inhalt in eine Textdatei.

    Aber, weils so schoen ist, moechte ich mir den Inhalt graphisch ausgeben lassen. Hierfuer habe ich folgende Funktion geschrieben:

    <PRE>
    Procedure TForm1.BildSpeichern(aTree:TTreeView;Filename:Stri ng);
    var
    Bitmap: TBitmap;
    Source: TRect;
    Dest: TRect;
    begin
    Bitmap := TBitmap.Create;
    try
    Bitmap.Width:=aTree.ClientWidth;
    Bitmap.height:=aTree.ClientHeight;
    BitBlt(Bitmap.Canvas.Handle, 0, 0, aTree.ClientWidth, aTree.ClientHeight, aTree.Canvas.Handle, 0, 0, SRCCOPY);
    Bitmap.SaveToFile(Filename);
    finally
    Bitmap.Free;
    end;
    </PRE>

    Da es sich um einen Treeview handelt, kann der natuerlich auch Bereiche haben, die erstin den sichbaren Bereich gescrollt werden muessen, damit der Anwender sie sehen kann.

    Ich moechte nun also den kompletten, auch den nicht sichtbaren, Trreeview auslesen, das bietet mir die Canvas-Property ja nicht. Geht das irgendwie anders, oder muss ich Stueck fuer Stueck scrollen und mir die Graphiken holen und zusammensetzen?

    Vielen Dank,
    Andre

  • #2
    sollte es nur die Moeglichkeit des Scrollens geben, haette ich gern noch einen oder zwei tips dazu. Die eingebaute Funktion ScollBy macht nuescht, die Api-Funktion SetScrollPos setzt zwar die Scrollbar, aber nicht den TreeView. Hier hilft auch kein Repaint des TreeViews oder der Form. Muss ich hier etwa Windows-Botschaften verschicken?

    Bin fuer jede Art von Kommentaren dankbar.
    Andre Versueme

    Comment


    • #3
      habe jetzt mit zeilenweisem Scrollen gearbeitet. Mein code sieht wie folgt aus, vielleicht findet sich ja noch der/die eine oder andere Kommentator/in oder vielleicht moechte jemand genau dieses Ding machen.
      Leider ist so die ganze Aktion recht langsam, da ja immer gescrollt werden muss. Seitenweises Scrollen wollte ich nicht, da hier am Ende des Scrollens unklar ist, welcher Ausschnitt noch kopiert werden muss. Da ich mich nicht mit Mustererkennung auskenne, sehe ich keine anderen Weg.
      <PRE>
      [...]
      property ScrollBarMax:integer read MaximumBestimmen;
      property ScrollBarPos:integer read PositionBestimmen;
      </PRE>
      [...]
      <PRE>
      function TAVTreeView.PositionBestimmen:integer;
      var scrInfo:TScrollInfo;
      begin
      FillChar(ScrInfo, SizeOf(ScrInfo), 0);
      scrInfo.fMask:=SIF_ALL;
      GetScrollInfo(self.Handle,SB_VERT,ScrInfo);
      result := scrInfo.nPos + scrInfo.nPage - 1;
      end;
      </PRE>
      <PRE>
      function TAVTreeView.MaximumBestimmen:integer;
      var scrInfo:TScrollInfo;
      begin
      FillChar(ScrInfo, SizeOf(ScrInfo), 0);
      scrInfo.fMask:=SIF_ALL;
      GetScrollInfo(self.Handle,SB_VERT,ScrInfo);
      result := scrInfo.nMax;
      end;
      </PRE>
      [...]
      <PRE>
      procedure TAVTreeView.SetzeScrollAufAnfang;
      begin
      SendMessage(self.Handle, WM_VSCROLL, SB_TOP, 0);
      end;
      </PRE>
      <PRE>
      function TAVTreeView.SetzeScrollEineZeileWeiter:boolean;
      begin
      result := true;
      if ScrollBarPos < ScrollbarMax then
      SendMessage(self.Handle, WM_VSCROLL, SB_LINEDOWN, 0)
      else
      result := false;
      end;
      </PRE>
      <PRE>
      procedure TAVTreeView.HoleBild;
      var
      StreifenPos:integer;
      begin
      SetzeScrollAufAnfang;
      fBild.Width:=self.ClientWidth;
      fBild.height:=fZeilenhoehe*(ScrollBarMax+1);
      repeat
      StreifenPos := fZeilenHoehe*((ScrollBarPos + 1) - ScrollbarPage);
      BitBlt(fBild.Canvas.Handle, 0, StreifenPos, self.ClientWidth, fZeilenhoehe, self.Canvas.Handle, 0, 0, SRCCOPY);
      until not SetzeScrollEineZeileWeiter;
      //zum Schluss noch das ganze letzte Bild dranhaengen
      StreifenPos := fZeilenHoehe*((ScrollBarPos + 1) - ScrollbarPage);
      BitBlt(fBild.Canvas.Handle, 0, StreifenPos, self.ClientWidth, self.Clientheight, self.Canvas.Handle, 0, 0, SRCCOPY);
      end;
      </PRE>

      So steht also letztendlich in fBild der gesamte Inhalt des TreeView

      Comment


      • #4
        Hi genau das selbe versuche ich auch
        allerdings ohne grafiscche Ausgabe,....
        Kurze Frage
        wie gibst du den Pfad an ab welchem Verzeichnis der Tree gelesen werden soll und wie speicherst du diesen dann ab.
        wenn möglich deinen Quelltext zum Verständnis,...
        Danke,..

        Comment


        • #5
          Hallo Michael,

          ich nutze den schon in Delphi vorhandenen shellTreeView. Der bietet viele Moeglichkeiten, so z.B. das Auslesen des Inhalts in eine Textdatei. Wenn man den Ursprungspfad angeben moechte, macht man das dort per Eigenschaft root.

          Wenns dich interessiert, schicke ich dir gern die Unit zu, die die vom TShellTreeView abgeleitete Komponente enthaelt.

          Andr

          Comment

          Working...
          X