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 2 von 2     12   
Nikodel

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

AW: Resize: Inhalt von MainForm bleibt unverändert

  Alt 29. Jan 2019, 14:44
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.
Angehängte Dateien
Dateityp: zip BilderfuerForum.zip (10,4 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
hoika

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

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.006 Beiträge
 
Delphi 12 Athens
 
#13

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
 
#14

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
961 Beiträge
 
Delphi 6 Professional
 
#15

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.006 Beiträge
 
Delphi 12 Athens
 
#16

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.540 Beiträge
 
Delphi 11 Alexandria
 
#17

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
672 Beiträge
 
Delphi 11 Alexandria
 
#18

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
Nikodel

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

AW: Resize: Inhalt von MainForm bleibt unverändert

  Alt 30. Jan 2019, 22:14
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ß
Dank aber auch allen anderen, die sich für ihre Tipps die Zeit genommen haben.
Ich habe jedenfalls eine Menge dazugelernt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 17:45 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