Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Resize: Inhalt von MainForm bleibt unverändert (https://www.delphipraxis.net/199515-resize-inhalt-von-mainform-bleibt-unveraendert.html)

Nikodel 29. Jan 2019 14:44

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:
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
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.
Wo ist da mein Fehler?

Der rechte Rand des Plots ist in den anliegenden beiden Bildern dargestellt, im Originalzustand und nach Verbreiterung von MainForm.

hoika 29. Jan 2019 15:43

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.

Uwe Raabe 29. Jan 2019 17:59

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.

Nikodel 29. Jan 2019 23:47

AW: Resize: Inhalt von MainForm bleibt unverändert
 
Liste der Anhänge anzeigen (Anzahl: 1)
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 :o

HolgerX 30. Jan 2019 04:42

AW: Resize: Inhalt von MainForm bleibt unverändert
 
Hmm..


Zitat:

Zitat von Nikodel (Beitrag 1424407)
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...)

Uwe Raabe 30. Jan 2019 09:17

AW: Resize: Inhalt von MainForm bleibt unverändert
 
Zitat:

Zitat von Nikodel (Beitrag 1424407)
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.

DeddyH 30. Jan 2019 09:18

AW: Resize: Inhalt von MainForm bleibt unverändert
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1424415)
Es gibt viele Wege ein Programm zu schreiben. Die überwiegende Mehrheit davon ist halt falsch.

Das lasse ich mir auf mein Kopfkissen sticken :mrgreen:

peterbelow 30. Jan 2019 11:23

AW: Resize: Inhalt von MainForm bleibt unverändert
 
[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 :-D.

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.

Nikodel 30. Jan 2019 22:14

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 14:53 Uhr.
Seite 2 von 2     12   

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