![]() |
Panel.Left > 32,767 ?
Ich zeige in einer Anwendung Vorschaubilder auf TPanels in einer Scrollbox an, die in einem Streifen am oberen Bildschirmand positioniert ist.
Die Panels werden zur Laufzeit erzeugt. Alles funktioniert wunderbar, nur ist die Zahl der anzeigbaren Panels auf ca. 190 beschränkt. Rechts davon bleibt die Scrollbox leer. Endlich hat mir ![]() |
AW: Panel.Left > 32,767 ?
ich würde es (auch aus Ressourcengründen) entkoppeln. Du hast 2 Scrollbars die um deiner Zeichenfläche/Panel liegen. Je nach Position dieser Scrollbar lädt du dann die aktuell benötigten Vorschaubilder an die berechnete Position. Alles was außerhalb des sichtbaren bereich ist ignorierst du vollkommen.
|
AW: Panel.Left > 32,767 ?
Ich weiß nicht ob ich dein Programm richtig verstanden habe, aber ich verstehe es so, dass du eine Art Filmstreifen hast. Jedes neue Bild wird auf einem Panel gezeigt das rechts vom letzten Panel platziert wird. Dabei machst du dir das Leben einfach und positionierst es in einer ScrollBox horizontal immer an einer Position. Den Rest übernimmt dann die ScrollBox. Ist das so?
Wie wäre es wenn du das Ganze virtuell steuerst? Im Prinzip wie ListBox oder ListView eine Liste auch virtuell darstellen können. Die Bilder wäre in einer Liste, jede hätte einen Index und man würde immer nur die Panels mit Bildern zeigen, die man auch sehen kann. Das Ganze müsste man programmieren, dürfte aber nicht so schwer sein. |
AW: Panel.Left > 32,767 ?
Liste der Anhänge anzeigen (Anzahl: 1)
Ähnliche Überlegungen habe ich auch schon gehabt, aber verworfen. Was ich vergaß, meine Lösung ist volle Kanne vom
![]() |
AW: Panel.Left > 32,767 ?
|
AW: Panel.Left > 32,767 ?
Vielen Dank. Die ScrollBar ist nicht das Problem, da ich sie über "Position" setze, was von 0 - 100 geht.
Wenn ich irgendetwas mit Nachladen mache, dann würde man vermutlich nicht so fix durch die Bilder rollen können, wie jetzt, wenn man an der ScrollBar zieht. Am liebsten wäre mir die Lösung mit einer Komponente, die von TControl abgeleitet ist, da sie ja (hoffentlich!) das Problem nicht hätte. Sie muss auch nicht viel können. Sie muss einem TImage als Parent dienen können, Farbe haben und einen abgesetzten 3D-Rand. Etwas tun (Klicks etc.) müsste sie nicht. Visible müsste natürlich auch umschaltbar sein. Gibt es sowas, ist es schwer, eine eigene Klasse zu implementieren? |
AW: Panel.Left > 32,767 ?
Liste der Anhänge anzeigen (Anzahl: 2)
Ich hab auf die Schnelle ein Beispiel erstellt (siehe Anhang). Statt ScrollBox habe ich alles in ObjectList gepackt und virtuell mithilfe einer ScrollLeiste auf einer Image ausgegeben.
Statt Bilder habe ich farbige Ersatz-Bitmaps erstellen. Also nicht wundern. Das sind nicht farbige Rechtecke, sondern richtige Bitmaps. Den Rest kannst du beiarbeiten, evtl. alles in eine Klasse packen oder eine Komponente erstellen. Ich hab jetzt nicht getestet wie weit es geht, aber ich hab testweise 300 Bilder a 200 Pixel erstellt, also 60.000 Pixel breit zusammen. Das Ganze kann man noch optimieren. Ist etwas auf die Schnelle. Edit: Weitere Version mit flüssigen Scroll angefügt. |
AW: Panel.Left > 32,767 ?
Hallo Popov, tolles Beispiel! Vielen Dank für die Mühe!
Ein bisschen stört mich was dran, leider, nämlich, dass die Bilder auf der Stelle verharren und jeweils mit neuem Inhalt gefüllt werden. Wenn sie richtig durch die Leiste wandern, gefällt mir das besser... Ich habe mich mal daran versucht, ein Panel von TControl abzuleiten. Ich habe dazu eine Vorlage genommen, die auf TCustomPanel beruht und habe schlicht alles rausgenommen, was an Möglichkeiten nicht nötig ist. Die Kenntnisse der genauen Zusammenhänge fehlen mir leider. Natürlich funktioniert es deswegen auch nicht. Aber vielleicht kann mir jemand sagen, ob es mit ein paar Verbesserungen funktioniert, oder ob das schlicht Blödsinn ist?
Delphi-Quellcode:
unit CtrlPanel;
interface uses Windows, Classes, Controls, Graphics, Messages, Forms; type TControlPanel = class(TControl) private FColorFace: TColor; FColorLight: TColor; FColorDark: TColor; FCanvas: TCanvas; procedure DrawBevel(Canvas: TCanvas; Rect: TRect; LightColor, DarkColor: TColor); procedure DrawFrame(Canvas: TCanvas; Offset, FrameWidth: Integer; LightColor, DarkColor: TColor); protected public constructor Create(AOwner: TComponent); override; property Canvas: TCanvas read FCanvas; procedure Paint; published property Visible; end; implementation constructor TControlPanel.Create(AOwner: TComponent); begin inherited; FColorDark:= clBlack; FColorLight:= clSilver; FColorFace:= clBtnFace; FCanvas := TControlCanvas.Create; TControlCanvas(FCanvas).Control := Self; end; procedure TControlPanel.Paint; var ScrBmp: TBitmap; begin ScrBmp:= TBitmap.Create; ScrBmp.Width:= ClientWidth; ScrBmp.Height:= ClientHeight; ScrBmp.Canvas.Brush.Color := clBtnFace; ScrBmp.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight)); ScrBmp.Canvas.Font:= Font; ScrBmp.Canvas.Brush.Style:= bsClear; DrawFrame(ScrBmp.Canvas, 0, 1, FColorLight, FColorDark); Self.Canvas.Draw(0, 0, ScrBmp); ScrBmp.Free; end; procedure TControlPanel.DrawBevel(Canvas: TCanvas; Rect: TRect; LightColor, DarkColor: TColor); begin Canvas.Pen.Width:= 1; Canvas.Pen.Color:= LightColor; Canvas.MoveTo(Rect.Left, Rect.Top + Rect.Bottom); Canvas.LineTo(Rect.Left, Rect.Top); Canvas.LineTo(Rect.Left + Rect.Right, Rect.Top); Canvas.Pen.Color:= DarkColor; Canvas.LineTo(Rect.Left + Rect.Right, Rect.Top + Rect.Bottom); Canvas.LineTo(Rect.Left, Rect.Top + Rect.Bottom); end; procedure TControlPanel.DrawFrame(Canvas: TCanvas; Offset, FrameWidth: Integer; LightColor, DarkColor: TColor); var i: integer; begin for i := Offset to Offset + FrameWidth - 1 do DrawBevel(Canvas, Rect(i, i, ClientWidth - 2 * i - 1, ClientHeight - 2 * i - 1), LightColor, DarkColor); end; end. |
AW: Panel.Left > 32,767 ?
Zitat:
Letztendlich war das nur ein Beispiel wie man es machen kann. Kleinwenig programmieren muss man schon selber. Mit drei kleinen Änderungen kann man eine flüssige Bewegung reinbringen. |
AW: Panel.Left > 32,767 ?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Popov, natürlich hast du Recht. Mit ein paar Anpassungen konnte ich jetzt den gewünschten Effekt erzielen. Im Moment bin dabei, die Bitmap größer als das Vorschaubild zu erstellen und um das Bild herum den Rand eines Panels zu zeichnen. Danke also nochmal.
Rein interessehalber würde mich trotzdem interessieren, ob man ein TPanel von TControl ableiten kann. P.S: Habe gerade erst gesehen, dass Popov sich doch die Mühe gemacht hat, eine scrollbare Version einzustellen. Ich habe mir hier eine Version gebastelt, die JPG lädt und einen Rahmen um sie zeichnet. Klappt hervoragend, hätte ich, ehrlich gesagt, so nicht gedacht, dass das mit dem Zeichnen so schnell geht. Verbraucht so vermutlich deutlich weniger Ressourcen. Also nochmal danke. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 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