![]() |
Resize: Inhalt von MainForm bleibt unverändert
Hi,
mein MainForm enthält ganz unten einen TScrollBar über die volle Breite und darüber ein 'Image1: TImage' mit Align=alBottom, Anchors=[akLeft,akRight,akBottom], AutoSize=false. Der ScrollBar hat die gleichen Einstellungen für Align und Anchors. 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, was ich mit den Einstellungen für Align und Anchors erwartet hätte. Der ScrollBar wird jedoch automatisch an die neue Breite angepasst. Wenn ich AutoSize=true setze, dann sehe ich keinen Inhalt in Image1, mit AutoSize=false aber schon. Natürlich könnte ich mit OnResize von MainForm das alles extra programmieren, aber geht das nicht direkt? Warum passt sich der ScrollBar an, aber Image1 nicht? Oder hat mein Delphi XE4 da einen Fehler? Tipps sind sehr willkommen :? |
AW: Resize: Inhalt von MainForm bleibt unverändert
Zitat:
|
AW: Resize: Inhalt von MainForm bleibt unverändert
Hallo,
bitte die Pas und die DFM posten als Minimal-Beispiel. Vielleicht liegt ja dein Image nicht direkt auf dem Form, sondern auf einem Panel oder was ähnlichem. PS: Hab gerade mal mit Delphi XE4 ein neues Projekt erzeugt, klappt genauso wie erwartet. |
Dieses Thema wurde am "28. Jan 2019, 20:01 Uhr" von "Luckie" aus dem Forum "Object-Pascal / Delphi-Language" in das Forum "GUI-Design mit VCL / FireMonkey / Common Controls" verschoben.
|
AW: Resize: Inhalt von MainForm bleibt unverändert
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
die gewünschten Dateien, .dfm und .pas, sind in der Anlage zu finden. Die .pas habe ich jedoch um die großen Teile gekürzt. Aber es befinden sich alle deklarierten Funktionen und Prozeduren darin. Hoffentlich reicht das so. Wenn nicht, kann ich auch den kompletten Code senden, aber das wollte ich euch ersparen. Übrigens: Wenn ich mich hier im Forum anmelde und dann eine Anfrage erstelle oder einen Beitrag beantworte, muss ich mich zum Versenden nochmal anmelden - jetzt z.B. wieder, um den Anhang anzufügen. Ist das normal? |
AW: Resize: Inhalt von MainForm bleibt unverändert
Hallo,
object Image1: TImage Left = 0 Top = 68 Width = 933 Height = 458 Align = alBottom end Das seh ich erst mal keine Anchors. object ScrollBarTage: TScrollBar Left = 0 Top = 526 Width = 933 Height = 17 Align = alBottom PageSize = 0 TabOrder = 7 OnScroll = ScrollBarTageScroll end und hier auch nichts. OK, habe dann doch mal Delphi aufgemacht. Du benutzt Align und Anchors in einem Formular, warum?. Das würde ich ändern. Anchors sind ja moderner, also stell das Align auf alNone. |
AW: Resize: Inhalt von MainForm bleibt unverändert
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? |
AW: Resize: Inhalt von MainForm bleibt unverändert
Hab's gerade mal mit Delphi Rio (10.3) ausprobiert und das Form funktioniert wie gewünscht, image1 wird in der Breite geändert wenn das Form resized wird, sein Inhalt (habe mal eine größere Grafik reingeladen) wird nicht geändert, man sieht halt den jeweils in in den sichtbaren Bereich passenden Teil des Bildes.
Align und Anchors sind übrigens nur verschiedene Methoden im Prinzip das Gleiche zu erreichen; Align ist neuer und hat daher Präzedenz. Die Anchors werden nur im DFM-File gespeichert wenn Align auf none gesetzt ist. Übrigens: wenn dein Ziel ist, ein größeres Bild im Form scrollen zu können fängst Du das falsch an. Dazu brauchst Du eine TScrollbox, in die Du das TImage packst. Die TScrollbox ist alBottom (oder alClient) aligned, das TImage innerhalb der Scrollbox auf Position (0,0) gesetzt, mit Autosize = true und Align = alNone. Die Scrollbox bekommt automatisch Scrollbars wenn das TImage zu groß für die client area der Scrollbox ist und Du kannst dann den sichtbaren Bereich des Images mit den Rollbalken verschieben. Wenn Du das Bild zoomen können willst sollte das wie folgt gehen: Nachdem Du ein Bild geladen hast (mit Autosize = TRUE) setzt Du Autosize of False und Stretch sowie Proportional auf true. Merk Dir Größe des TImage in Feldern des Forms, das ist die Basis für Zoomfaktor 1. Um das Bild zu zoomen berechnest Du die neue Größe des TImage durch Multiplikation der Basisdimensionen mit dem Zoomfaktor und setzt TImage width und height entsprechend. |
AW: Resize: Inhalt von MainForm bleibt unverändert
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:
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 :) |
AW: Resize: Inhalt von MainForm bleibt unverändert
Zitat:
Zitat:
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. Zitat:
|
AW: Resize: Inhalt von MainForm bleibt unverändert
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
neue Info: Mein Programm malt auf Image1.Canvas. Beim Vergrößern von MainForm wird die Größe von Image1 tatsächlich angepasst, aber Canvas scheint dies nicht mitzumachen. Laut Delphi-Hilfe gibt es ein Canvas.Width. Im Programm jedoch gibt es einen Compilerfehler 'undeklarierter Bezeichner: Width', wenn ich den Wert ausgeben lassen möchte, z.B. in Edit2: (ohne "+'Canvas.Width='+IntToStr(Image1.Canvas.Width )" klappt die Ausgabe)
Code:
Im Code sind die Teile, die die Achsen des Plots malen, enthalten. Die Achsen werden relativ zur Größe von Image1 gezeichnet. Nach Vergrößerung von MainForm verschwindet die rechte Achse und der rechte Teil des Plots, was mir ein Rätsel ist.
procedure TMainForm.DrawAxes(start_date, ndays: int32);
var nhours: int32; countl, counts, px, py, pxl, rptxt: int32; dstr: string; DateUnit: TDateUnits; // Zeitskale der x-Achse, TS: Tage/Std., MT: Monate/Tage minTcDist: int32; hd_perMinTick: int32; // kleinste Unterteilung der x-Achse in Anzahl Stunden/Tage timespan_stick: int32; // Dauer der kurzen Ticks in Minuten timespan_ltick: int32; // Dauer der langen Ticks in Minuten PlotWidth: uint32; Jahr0, Jahr1, Monat0, Monat1, dayOffs: uint16; act_ts, ts_ltick, nextts_ltick: uint32; // time stamps minVal, maxVal, actVal, rval: int16; begin nhours:=ndays*24; Edit2.Text:='Form: W='+IntToStr(Width)+' Image1: W='+IntToStr(Image1.Width)+ ' ClientWidth='+IntToStr(ClientWidth)+'Canvas.Width='+IntToStr(Image1.Canvas.Width); with Image1 do begin ... // x-Achse malen: py:=Height-border_bottom; Canvas.Moveto(Width-border_right,py); Canvas.LineTo(border_left,py); ... jetzt kommen die Ticks auf der x-Achse // y-Achse links: Canvas.MoveTo(border_left, Height-border_bottom); Canvas.LineTo(border_left, border_top); ... jetzt die Ticks auf der y-Achse // y-Achse rechts: px:=Width-border_right; Canvas.MoveTo(px, border_top); Canvas.LineTo(px, Height-border_bottom); ... und noch die Ticks auf der rechten y-Achse ... end Wo ist da mein Fehler? Der rechte Rand des Plots ist in den anliegenden beiden Bildern dargestellt, im Originalzustand und nach Verbreiterung von MainForm. |
AW: Resize: Inhalt von MainForm bleibt unverändert
Hallo,
also am besten doch ein vollständiges Minimal-Bsp. Ich denke, wir reden gerade aneinander vorbei. |
AW: Resize: Inhalt von MainForm bleibt unverändert
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. |
AW: Resize: Inhalt von MainForm bleibt unverändert
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
Zitat:
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 :o |
AW: Resize: Inhalt von MainForm bleibt unverändert
Hmm..
Zitat:
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...) |
AW: Resize: Inhalt von MainForm bleibt unverändert
Zitat:
Es gibt viele Wege ein Programm zu schreiben. Die überwiegende Mehrheit davon ist halt falsch. |
AW: Resize: Inhalt von MainForm bleibt unverändert
Zitat:
|
AW: Resize: Inhalt von MainForm bleibt unverändert
[QUOTE=Nikodel;1424407]Hi,
Zitat:
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. |
AW: Resize: Inhalt von MainForm bleibt unverändert
Hi peterbelow,
das ist die Lösung, die ich gesucht hatte! Dazu muss man allerdings sehr tief in der Thematik drinstecken. Das findet man in keiner Doku. Vielen, vielen Dank So wird das Verhalten verständlich, und die Lösung ist ganz leicht - wenn man es weiß :-D Dank aber auch allen anderen, die sich für ihre Tipps die Zeit genommen haben. Ich habe jedenfalls eine Menge dazugelernt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:56 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