AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Zoomen des Inhaltes einer Scrollbox
Thema durchsuchen
Ansicht
Themen-Optionen

Zoomen des Inhaltes einer Scrollbox

Offene Frage von "oki"
Ein Thema von oki · begonnen am 24. Nov 2008 · letzter Beitrag vom 26. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

Zoomen des Inhaltes einer Scrollbox

  Alt 24. Nov 2008, 21:48
Hi Leute,

ich glaub ich bin am Ende meines Lateins. Folgende Aufgabenstellung:

Ich erstelle in einer Anwendung in einer Scrollbox ein Schema mittels eigener Komponenten (Nachfahren von TCustomControl) zur Laufzeit. In einer Scrollbox natürlich deshalb, weil das Schema größer werden kann als der Bildschirmbereich. Jetzt kann man zwar alles super platzieren, weil es durch die Scrollbox keine festen Begrenzungen gibt, aber die Sache wird bei großen Schematas natürlich etwas unübersichtlich. Praktisch ist dann ja eine Zoomfunktion. Immer wohl gemerkt, dass es nicht um ein Image oder Zeichnen auf den Canvas, sondern um Komponenten auf einer Scrollbox geht.

Nun dachte ich, dass kann man mit SetViewportExtEx lösen. Da tut sich aber gar nichts. Hier mal mein Code:
Delphi-Quellcode:
procedure TSeysolMain_Form.ToolButton4Click(Sender: TObject);
var OSize : TSize;
    ActiveSB : TRTGroupScrollBox;
    Res : Boolean;
    SBDC : HDC;
begin
  OSize.cx := 0;
  OSize.cy := 0;
  ActiveSB := GetScrollBox(self, PageControl1.ActivePage); // meine aktive Scrollbox holen (eigene Funktion)
  if Assigned(ActiveSB) then begin
    SBDC := GetDC(ActiveSB.Handle);
    // GetViewportExtEx(SBDC, OSize);
    SetMapMode(SBDC, MM_ISOTROPIC);
    SetWindowExtEx(SBDC, 4, 4, nil); // mal zum testen fest eingestellt
    SetViewportExtEx(SBDC, 100, 100, nil);
    Res := GetWindowExtEx(SBDC, OSize);
    if not Res then // mal schauen, was draus geworden ist
      MessageDlg(Format('Error Size: %d, %d', [OSize.cx, OSize.cy]), mtInformation, [mbOK], 0)
    else
      MessageDlg(Format('Size: %d, %d', [OSize.cx, OSize.cy]), mtInformation, [mbOK], 0);
  end;
end;
Ich hab zwischenzeitlich geprüft, ob die Funktionen ohne Fehler ausgeführt werden. Ist so, liefern True zurück (hab nur etwas aufgeräumt).

Ja, entweder ich bin total auf dem Holzweg und das geht alles überhaupt nicht mit SetViewportExtEx und Konsorten, oder ich mache nur etwas mit der Verwendung der Funktionen falsch. Ich geb aber auch zu, dass ich durch die Thematik SetViewportExtEx, SetWindowExtEx und SetScaleportExtEx noch nicht durchgestiegen bin. Was benutzt man was wofür?

Im Anhang mal ein Screenshot damit man sieht was ich zoomen will. Es jeht um den jeweils sichtbaren Bereich einer ausgewählten Scrollbox.

Tja, entweder ich hab ein Grundsatz- oder ein Teilpproblem. Sicher bin ich mir auf jeden Fall, dass ich ein Problem habe, denn es tut sich nichts.



Schon mal Dank für die Hilfe,

Guß oki
Miniaturansicht angehängter Grafiken
schema_279.png  
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Zoomen des Inhaltes einer Scrollbox

  Alt 25. Nov 2008, 09:05
Ähm Push
42
  Mit Zitat antworten Zitat
tomsson74

Registriert seit: 8. Jan 2008
73 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Zoomen des Inhaltes einer Scrollbox

  Alt 25. Nov 2008, 09:40
[Edit]Sorry, glaube habe das Thema verfehlt [/edit]
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Zoomen des Inhaltes einer Scrollbox

  Alt 25. Nov 2008, 10:16
Hallo tomsson74.

Erst mal Dank dür diene Antwort. Mein primäres Ziel ist es nicht alle Elemente meiner Scrollbox mit einem Scaling an anderer Stelle auszugeben/zu zeichnen, sondern den Inhalt der Scrollbox selber zu zoomen. Im besten Fall bis alles enthaltene so klein ist, bis die Scrollbalken nicht mehr angezeigt werden. Sollte das nicht funzen, so würde ich mich auch mit einem Übersichtsfenster begnügen, dass den gesamten Inhalt der Scrollbox (auch nicht sichtbaren Bereich) in einem Image anzeigt. Ich würde dann im Image den sichtbaren Ausschnitt umrahmen.

Jestzt zu deinem Code. Erst mal Dank. Einige Sachen sind schon etwas klarer geworden. Ich hab aber noch nicht raus bekommen, was du in deiner ItemList für Komponenten speicherst. Du machst da einen Cast auf TGraphicElement. Was ist das?

Gruß oki

roter Kasten! nicht so schlimm, da ich mich damit noch gar nicht auskenne hilft im Moment fast alles.
42
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Zoomen des Inhaltes einer Scrollbox

  Alt 25. Nov 2008, 12:35
Hi Oki,

schau mal, ob Dich das weiterbringt...

Wenn alle Stricke reißen, ich habe mal so eine Funktion geschrieben, die den kompletten Bereich einer Scrollbox in ein Bitmap schreibt. Der sichbare Bereich wurde "durchgeblättert" und die sichtbaren Ausschnitte zu einem Bild zusammengesetzt. Ich könnte das mal raussuchen (wenn ich es noch finde).


stahli
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Zoomen des Inhaltes einer Scrollbox

  Alt 25. Nov 2008, 14:09
Hallo stahli,

Dank für deinen Tipp. Das ist schon mal der richtige Weg. Ich benute dann zwar die Methode ScaleConrols, damit meine Scrollbox da bleibt wo sie ist, aber das ist Wurscht. Ich meld mich auch jetzt erst, weil ich da erst mal testen wollte.

Mein Problem ist aktuell nur, dass da einiges durcheinander geht. Das liegt sicher zum einen daran, das die Paint-Methoden meiner Controls prüfen, ob alles dargestellt werden kann. Wenn nicht, vergrößern sie automatisch das Control. Da geht ne Menge den Bach runter. Meine Verbinder besitzen zusätzlich eine Point-Liste ihrer Eckpunkte. Die wird durch die Methode leider nicht verändert. Wie sollte sie auch.

Im Grundsatz macht die Procedure aber das was ich wollte. Ich steh mir halt im Moment selber auf den Füßen rum mit meinen Controls. Aktuell weis ich noch nicht so genau, ob ich das hin bekomme, aber ich versuche es zumindest. Sollte es nicht klappen, so meld ich mich noch mal bezüglich deines Codeangebotes.

Dank dafür

Im Anhang mal das Ergebnis des Zoomens, wie es jetzt aussieht. Grusel

Dank und Gruß oki
Miniaturansicht angehängter Grafiken
nachher_333.png   vorher_127.png  
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Zoomen des Inhaltes einer Scrollbox

  Alt 25. Nov 2008, 14:51
Das mit dem ScaleControls ist natürlich Unsinn. Scaleby ist schon richtig. Mit allen Standard-Controls sollte das auch ordentlich aussehen und nicht wie bei mir.

Wenn ich das wirklich hinbekommen will, dann muss ich da aber noch ordentlich Hausaufgaben machen bei meinen Controls.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Zoomen des Inhaltes einer Scrollbox

  Alt 25. Nov 2008, 14:59
Hi,

erst mal Respekt für Dein Projekt, das sieht schon nicht schlecht aus

Ich habe in meinem Projekt meine Turniersoftware etwas Ähnliches in Bezug auf größenänderbare Controls in einer Scrollbox umgesetzt.

Wenn Du nicht Standardcontrols verwendest (Edits etc) - oder diese nur auf eigene Controls drauf setzt - taugt das vielleicht auch als Ansatz.

Grundsätzlich habe ich eínen "Designer" von TScrollBox abgeleitet.
Der erhält ein virtuelles Raster und die Eigenschaften StyleMode und StyleSize.
Die Controls sind spezielle Komponenten, die der Designer kennt und die über eine XPos und YPos verfügen (die die Position im Raster bezeichnen).
Wird StyleSize vom Designer geändert, ändert der seine Rasterabstände und veranlasst die Controls, sich daran neu auszurichten und zu zeichnen. Je nach DesignMode und DesignSize können sich die Controls ggf. anders zeichnen bzw. ihre SubControls anders ausrichten.

Vorteil: Die Inhalte der Controls können an die jeweilige Größe angepasst werden. Bei kleiner Spieledarstellung lasse ich z.B. die Spielernamen weg oder kürze irgendwelche Informationen. Bei größerer Darstellung werden mehr Informationen dargestellt. Es wird also nichts gezoomt sondern die Größe der Controls "automatisch" an die Designereinstellungen angepasst.
Weiterhin kann die Darstellung und Funktion der Controls durch die Eigenschaft DesignMode beeinflußt werden. Z.B. werden im DesignMode "construct" Hilfslinien gezeichnet und Anfasser für Größenänderungen verwaltet.

Nachteil: Ziemliche Bastelei und ggf. jede Menge unterschiedliche Darstellungsvarianten. Spezielle Abstimmungen zwischen Designer und Controls erforderlich.


Stahli
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Zoomen des Inhaltes einer Scrollbox

  Alt 25. Nov 2008, 15:18
Hi stahli,
erst mal Dank für dein Lob. Ist auch ein ganz schöner Brocken geworden für nebenbei gemacht. ich habe genau das Problem:
Zitat von stahli:
Nachteil: Ziemliche Bastelei und ggf. jede Menge unterschiedliche Darstellungsvarianten. Spezielle Abstimmungen zwischen Designer und Controls erforderlich.
Ich habe meine Controls auf GDI+ umgestellt und zeichne fast alles selber. Das natürlich OOP. Sonst hat man ja eh keine Chance. Leider ist es aber so, dass ich meine Gates (in denen die Ein- und Ausgangswerte angezeigt werden) in der Höhe auf Basis der Schriftgröße berechne. Da steckt das erste Problem. Ich ermittel also beim Zeichnen, wie groß ein Gate ist, dann wie viele Gates ich habe und daraus die minimale Höhe des Controls (plus Titel wenn eingeblende etc.). Beim verkleinern werden jetzt die Control aber eben nicht proportional kleiner, sondern immer etwas größer als soll. Da steckt das erste Problem. Beim Vergrößern stört das nicht hab ich gemerkt. Ich brauch aber leider den umgekehrten Weg.
Das Problem bei meinen Connectoren (Verbinder mit Pfeil) ist mir klar, da muss ich die Koordinaten selber umrechnen. mal schauen, ob Scaleby virtual ist.

Dein Projekt schau ich mir nachher mal an. Im Anhang noch ein Beispiel beim Vergrößern. Da siehts gut aus.

Gruß oki
Miniaturansicht angehängter Grafiken
nachher_128.png   vorher_997.png  
42
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Zoomen des Inhaltes einer Scrollbox

  Alt 25. Nov 2008, 15:29
mal so in´s Blaue:
Und wenn Du bei der Verkleinerung auf die Höhenkorrektur einfach verzichtest?
Lesen kann man dann ja eh nichts mehr und dann wird ein kleiner Teil der Informationen eben noch abgeschnitten.
Zum Nachvollziehen der Struktur könnte das ja reichen (außer für mich - aber ich verstehe das auch nicht bei großer Darstellung )

Stahli
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:52 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