AGB  ·  Datenschutz  ·  Impressum  







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

Resize: Inhalt von MainForm bleibt unverändert

Ein Thema von Nikodel · begonnen am 28. Jan 2019 · letzter Beitrag vom 30. Jan 2019
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.749 Beiträge
 
Delphi 12 Athens
 
#1

AW: Resize: Inhalt von MainForm bleibt unverändert

  Alt 29. Jan 2019, 10:42
Und was muss man tun, um das von dir beschriebene Verhalten zu reproduzieren?

Übrigens:
Bist du sicher, daß sich wirklich die Breite des TImage-Controls nicht ändert, oder lediglich deine Zeichenoperationen die neue Breite nicht auswerten?
Zeichnest du überhaupt neu, wenn sich die Breite ändert?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Nikodel

Registriert seit: 11. Jan 2019
20 Beiträge
 
Delphi XE4 Professional
 
#2

AW: Resize: Inhalt von MainForm bleibt unverändert

  Alt 29. Jan 2019, 11:51
Hi,

vorab noch eine Info: es handelt sich um ein VCL-Programm, nicht FMX!

Zu hoika:
Die Werte für Align und Anchors gebe ich im Objektinspektor ein. Dabei war wichtig, dass Align=Bottom zuerst für den ScrollBar und dann für Image1 angegeben wurde. In der anderen Reihenfolge hängt der ScrollBar über dem Image1.
Warum in der .dfm Datei nichts für Anchors steht, kann ich nicht sagen. Was soll ich denn sonst noch tun, damit die im Objektinspektor eingegebenen Werte auch alle in der .dfm Datei landen?
Würde es helfen, manuell die Werte einzutragen? - bisher habe ich die .dfm Datei nie angerührt.

Ich hab's auch mit Align=None probiert. Die Größe von Image1 wird auch damit nicht automatisch angepasst.

Zu Uwe Raabe:
Zitat:
Und was muss man tun, um das von dir beschriebene Verhalten zu reproduzieren?
Genau um diese Frage geht es.
Ich könnte natürlich im OnResize von MainForm die Größe von Image anpassen. Nur frage ich mich, wozu die Einstellungen in Align und Anchors dann gut sind, zumal ja der ScrollBar schon automatisch angepasst wird, aber Image1 eben nicht - beide mit den selben Einstellungen für Align und Anchors.

Und die Größe von Image1 wird wirklich nicht angepasst. Der Plot passt sich an die Größe von Image1 an. Nach Vergrößerung des MainForm bleibt der erzeugte Plot - mit neuem Aufruf zum Plotten - unverändert groß.

Zu peterbelow:
Das sind gute Tipps. Leider bin ich noch nicht so fit mit Delphi und vor allem noch nicht mit den vielen Möglichkeiten der Tool-Palette. Ich habe das Zoomen und die entsprechenden Anpassungen des ScrollBars selber programmiert.
Beim nächsten mal weiß ich es dann
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.749 Beiträge
 
Delphi 12 Athens
 
#3

AW: Resize: Inhalt von MainForm bleibt unverändert

  Alt 29. Jan 2019, 14:18
Zitat:
Und was muss man tun, um das von dir beschriebene Verhalten zu reproduzieren?
Genau um diese Frage geht es.
Also, die Schritte des von dir beschriebenen Verhaltens
Zitat:
Wenn das Programm gestartet und der Inhalt von Image1 erzeugt ist, und ich mit der Mouse das Fenster verbreitere, ändert sich die Größe von Image1 nicht
solltest du schon aufzählen können. Insbesondere, wie man den Part "der Inhalt von Image1 erzeugt ist" erschließt sich mir noch nicht.

Wenn ich ein entsprechend großes JPG in das Image lade, wird das allerdings schon richtig dargestellt, was in diesem Fall heißt, beim Vergrößern sehe ich mehr vom Bild. Damit ist eigentlich die Aussage "ändert sich die Größe von Image1 nicht" schon widerlegt, denn das Control Image1 ändert seine Größe schon. Was sich nicht ändert, ist die Größe seines Inhalts.

Ich könnte natürlich im OnResize von MainForm die Größe von Image anpassen. Nur frage ich mich, wozu die Einstellungen in Align und Anchors dann gut sind, zumal ja der ScrollBar schon automatisch angepasst wird, aber Image1 eben nicht - beide mit den selben Einstellungen für Align und Anchors.

Und die Größe von Image1 wird wirklich nicht angepasst. Der Plot passt sich an die Größe von Image1 an. Nach Vergrößerung des MainForm bleibt der erzeugte Plot - mit neuem Aufruf zum Plotten - unverändert groß.
Dann liste doch bitte exakt alle Schritte auf, die nötig sind, um dieses Verhalten nachzustellen. Mit den bereitgestellten Sourcen konnte ich nämlich keinen Plot hervorzaubern.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Resize: Inhalt von MainForm bleibt unverändert

  Alt 29. Jan 2019, 15:43
Hallo,
also am besten doch ein vollständiges Minimal-Bsp.
Ich denke, wir reden gerade aneinander vorbei.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.749 Beiträge
 
Delphi 12 Athens
 
#5

AW: Resize: Inhalt von MainForm bleibt unverändert

  Alt 29. Jan 2019, 17:59
Du hast offenbar eine falsche Vorstellung von dem Control TImage. Das ist eben keine Zeichenfläche auf der man so einfach was zeichnen kann, sondern ein Container für ein TGraphic (z.B. ein TBitmap). Die Größe des TImage reagiert auch korrekt auf das Align, aber die Größe des Inhalts (TGraphic) ist davon unbeeinflusst. Kurz gesagt: TImage ist nicht das, was du hier brauchst.

Wenn du selbst was zeichnen willst, dann am besten in einer TPaintBox im OnPaint-Event.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Nikodel

Registriert seit: 11. Jan 2019
20 Beiträge
 
Delphi XE4 Professional
 
#6

AW: Resize: Inhalt von MainForm bleibt unverändert

  Alt 29. Jan 2019, 23:47
Hi,

Zitat:
Du hast offenbar eine falsche Vorstellung von dem Control TImage. Das ist eben keine Zeichenfläche auf der man so einfach was zeichnen kann, sondern ein Container für ein TGraphic (z.B. ein TBitmap). Die Größe des TImage reagiert auch korrekt auf das Align, aber die Größe des Inhalts (TGraphic) ist davon unbeeinflusst.
Wozu hat TImage dann ein Canvas?
In der Dokumentation heißt es, dass man überall, wo ein Canvas enthalten ist, darauf zeichnen kann.

Meine Antwort von gestern, 15:44, habe ich jetzt noch einmal erweitert um ein lauffähiges Unit1.pas.

Der Effekt ist noch etwas anders, als bisher beschrieben.
Nach Start des Programms und Vergrößern der Breite von MainForm werden Image1 und der ScrollBar automatisch mit vergrößert. Aber der Canvas offensichtlich nicht!

Das lässt sich nachvollziehen mit dem Programm in der Anlage, das bis auf das Wesentliche entkernt ist.
Ich habe dazu einen Button 'Achsen malen' ganz oben reingequetscht.

Wer Lust hat, das zu testen, sollte folgende Bediensequenzen durchführen:
1) Programm starten, Klick auf 'Achsen malen', mit der Mouse das Fenster verbreitern und dabei den rechten Rand beobachten: die rechte y-Achse verschwindet!

2) Programm starten, mit der Mouse das Fenster verbreitern, Klick auf 'Achsen malen': jetzt wird das ganze Fenster ausgenutzt?!

Wer keine Lust hat, das Programm zu erzeugen, kann den Effekt in den beiden Bildern beobachten, die ebenfalls in der Anlage enthalten sind.
Original.png zeigt den rechten Rand des Plots ohne Vergrößerung des Fensters.
nachVergroessern.png zeigt das vergrößerte Fenster und den verschwundenen rechten Rand des Plots.

Für mich ist das total rätselhaft
Angehängte Dateien
Dateityp: zip UnitfuerForum.zip (15,7 KB, 3x aufgerufen)

Geändert von Nikodel (30. Jan 2019 um 00:10 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
988 Beiträge
 
Delphi 6 Professional
 
#7

AW: Resize: Inhalt von MainForm bleibt unverändert

  Alt 30. Jan 2019, 04:42
Hmm..


Hi,

Wozu hat TImage dann ein Canvas?
In der Dokumentation heißt es, dass man überall, wo ein Canvas enthalten ist, darauf zeichnen kann.

Meine Antwort von gestern, 15:44, habe ich jetzt noch einmal erweitert um ein lauffähiges Unit1.pas.

Der Effekt ist noch etwas anders, als bisher beschrieben.
Nach Start des Programms und Vergrößern der Breite von MainForm werden Image1 und der ScrollBar automatisch mit vergrößert. Aber der Canvas offensichtlich nicht!

Jede von TGraphicControl abgleitete Komponente hat ein Canvas..

Auch ein TLabel...

Mals Du darauf?

Das TImage nutzt seinen Canvas, um entsprechend der Parameter ein 'Image' (z.B. Bitmap...) in seinen Bereich zu malen.
Bei einem Resize wird entsprechend das Image neu gemalt.
Wenn nun kein Image da ist, dann passiert einfach nichts.

Teste mal was passiert, wenn du ein (beliebiges) anderes Fenster nach deinem Malen und anschließendem Resize über dein Fenster hinweg ziehst..
Es sollte dein gemaltes verschwinden, wie bei einer Paintbox ohne OnPaint...

Ein Label würde auch verschwinden, jedoch wird in dessem OnPaint der Text immer wieder neu gemalt.

Hat ein TImage ein 'OnPaint'?
Nicht das ich es unter published gefunden habe..

Wieso wohl?
Weil vom Ersteller der Komponente nicht vorgesehen wurde, dass auf einer TImage-Komponente direkt gemalt werden soll...
TImage ist hat nur zum 'Anzeigen' von Images gedacht.

Wenn Du skaliert malen willst, dann weise dem TImage ein Bitmap zu und male immer nur auf diesem.
Dieses ist zum malen vorgesehen und wird bei einem Resize durch das TImage wieder neu gezeigt..

(Habe den Thread nur überflogen und bin mir eigentlich sicher, dass dies auch schon so geschrieben wurde...)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.749 Beiträge
 
Delphi 12 Athens
 
#8

AW: Resize: Inhalt von MainForm bleibt unverändert

  Alt 30. Jan 2019, 09:17
Wozu hat TImage dann ein Canvas?
In der Dokumentation heißt es, dass man überall, wo ein Canvas enthalten ist, darauf zeichnen kann.
Na ja, du kannst ja auch darauf zeichnen. Das heißt aber nicht, daß diese Vorgehensweise auch das von dir erwartete Ergebnis bringt.

Es gibt viele Wege ein Programm zu schreiben. Die überwiegende Mehrheit davon ist halt falsch.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#9

AW: Resize: Inhalt von MainForm bleibt unverändert

  Alt 30. Jan 2019, 09:18
Es gibt viele Wege ein Programm zu schreiben. Die überwiegende Mehrheit davon ist halt falsch.
Das lasse ich mir auf mein Kopfkissen sticken
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
724 Beiträge
 
Delphi 12 Athens
 
#10

AW: Resize: Inhalt von MainForm bleibt unverändert

  Alt 30. Jan 2019, 11:23
[QUOTE=Nikodel;1424407]Hi,

Zitat:
Wozu hat TImage dann ein Canvas?
In der Dokumentation heißt es, dass man überall, wo ein Canvas enthalten ist, darauf zeichnen kann.
Es beruhigt Dich vermutlich nicht besonders, aber Du bist bei weitem nicht der erste Delphi-Nutzer, der auf dieses Problem gelaufen ist. Das ist mit schöner Regelmäßigkeit passiert seit Delphi 1 seinerzeit auf den Markt kam .

Bei TImage funktioniert der Canvas anders als bei z. B. dem Form selbst. Wenn Du bei einem leeren TImage zum ersten Mal dessen Canvas ansprichst erzeugt das Control eine interne TBitmap mit der Größe, die das TImage-Control zu diesem Zeitpunkt hat. Du zeichnest dann auf dessen Canvas, das TImage hat eigentlich gar keinen eigenen, der "öffentlich" zugängig ist. Wenn das TImage dann nachträglich in der Größe verändert wird hat das keinen Einfluß auf die Bitmap, die behält ihre Orginalgröße bei und wird dann halt eventuell nur noch teilweise angezeigt. Wenn Du die Stretch-Eigenschaft des TImage auf True gesetzt hast wird die Bitmap zwar auf die neue Größe des TImage skaliert angezeigt, aber die Größe der internen Bitmap ändert sich dadurch nicht. TImage macht das mit jedem Typ von Bild so, da man ein Bild (außer Vektorgrafiken oder TMetafiles) nicht in der Größe ändern kann, ohne dabei den Inhalt zu verändern und dabei Informationen über das Orginal zu verlieren.

Wenn Du also weiterhin ein TImage als "Malfläche" verwenden willst mußt Du den OnResize-Event des Forms verwenden (TImage hat leider keinen) und dort image1.picture.bitmap.width selbst an die neue Größe von TImage anpassen und dann dein Bild neu zeichnen, da es durch die Größenänderung verzerrt wird.
Peter Below
  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 11:44 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