AGB  ·  Datenschutz  ·  Impressum  







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

Panel.Left > 32,767 ?

Ein Thema von Benmik · begonnen am 9. Mai 2015 · letzter Beitrag vom 10. Mai 2015
Antwort Antwort
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#1

Panel.Left > 32,767 ?

  Alt 9. Mai 2015, 19:38
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 dieser Artikel die (eigentlich simple, aber kaum glaubliche) Antwort geliefert: Für die Angabe "Links" stehen nur 15 Bit zur Verfügung, daher ist bei ~32.000 Schluss. Die einfachste Lösung wäre wohl ein TPanel, das von TControl abgeleitet ist. Hat jemand eine Idee / eine Lösung?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Panel.Left > 32,767 ?

  Alt 9. Mai 2015, 19:56
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Panel.Left > 32,767 ?

  Alt 9. Mai 2015, 20:00
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.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#4

AW: Panel.Left > 32,767 ?

  Alt 9. Mai 2015, 20:02
Ähnliche Überlegungen habe ich auch schon gehabt, aber verworfen. Was ich vergaß, meine Lösung ist volle Kanne vom FastStone Image Viewer abgekupfert. Dort wie beim mir kann man mit der ScrollBar durch alle geladenen Bilder zischen, die sich am Streifen bewegen. Das möchte ich weiter haben.
Miniaturansicht angehängter Grafiken
beispiel.jpg  

Geändert von Benmik ( 9. Mai 2015 um 20:13 Uhr) Grund: Bild hinzugefügt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Panel.Left > 32,767 ?

  Alt 9. Mai 2015, 20:27
  • ein TPanel mit TScrollBar
  • auf dem Panel werden soviele Bilderkomponenten platzert, wie auf den Bildschirm passen (vielleicht +1, für halbe Bilder an den Seiten)
  • anhand der Position der Scrollbar (die übrigens nur von +/- 32.000 zählt > SmallInt) errechnest du welche Bilder sichtbar sind und lädst sie in die Bildkomponenten
  • die Bildkomponenten kann man auch noch bissl verschieben
  • ...
  • alternativ kann man zwat auch soviele Bildkomponenten erstellen, wie es Bilder gibt, aber zeigt dennoch nur die benötigten an und positioniert sie, wenn sie im sichtbaren Bereich liegen
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#6

AW: Panel.Left > 32,767 ?

  Alt 9. Mai 2015, 21:21
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?
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Panel.Left > 32,767 ?

  Alt 9. Mai 2015, 23:20
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.
Angehängte Dateien
Dateityp: zip ImageLeiste.zip (2,5 KB, 5x aufgerufen)
Dateityp: zip ImageLeisteV2.zip (2,5 KB, 4x aufgerufen)

Geändert von Popov (10. Mai 2015 um 17:59 Uhr)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#8

AW: Panel.Left > 32,767 ?

  Alt 10. Mai 2015, 00:24
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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

AW: Panel.Left > 32,767 ?

  Alt 10. Mai 2015, 01:06
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...
Anscheinend hast du dir das Beispiel nicht richtig angeguckt. Da verharrt nichts auf der Stelle und wird nur mit neuen Bildern gefüllt, das wäre zu einfach. Die Bilder werden bei jeder Änderung der ScrollLeiste entsprechend der Leistenposition neu gezeichnet. Es sieht also nur so aus.

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.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#10

AW: Panel.Left > 32,767 ?

  Alt 10. Mai 2015, 17:45
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.
Angehängte Dateien
Dateityp: zip ImageLeiste.zip (3,5 KB, 5x aufgerufen)

Geändert von Benmik (10. Mai 2015 um 20:45 Uhr)
  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 14:51 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