Autor Beitrag
Jetstream
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222



BeitragVerfasst: Mo 19.06.06 08:25 
Moin, ich hab ein total nerviges Problem und komme nicht auf die Lösung.

Ich schreibe grade an einer kleinen Turnierverwaltung rum, man soll sich Turniere
erstellen können, von denen dann ein Spielplan als Image erstellt wird.

Wenn ich jedoch die Form resize, dann verändert sich die Größe des Bildes nicht,
obwohl ich entsprechenden Code ins onResize Event der Form geschrieben habe.

Zum Zeichnen verwende ich ein TImage, das auf einem Panel liegt.
Das Panel ist doublebuffered, da es sonst flackert.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
var
  Form1: TForm1;
  AktivesTurnier:TTurnier; // Es kann immer nur ein Turnier
  AktivesBild:TImage;      // und ein Bild geben.

procedure TForm1.FormCreate(Sender: TObject);
begin
  Panel2.DoubleBuffered:=true;
  AktivesBild:=TImage.Create(Panel2);  // Bild erstellen.
  AktivesBild.Parent:=Panel2;          // Bild ins Panel setzen
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  if AktivesTurnier<>nil then AktivesTurnier.Zeichnen(AktivesBild);  
  // Wenn die Form resized wird und es ein aktives Turnier gibt, dann soll er das zeichnen.
end;

procedure TKoEinzel.Zeichnen(Bild:TImage);  // Ein bestimmtes Turnier, abgeleitet von TTurnier.
begin
  Bild.Top:=0;
  Bild.Left:=0;
  Bild.Height:=Bild.Parent.Height; // Hier passiert nichts! Das Bild sollte eigentlich der Größe des Panels
  Bild.Width:=Bild.Parent.Width;   // angepasst werden. Die Bildgröße verändert sich jedoch nicht.
  Bild.Canvas.Pen.Color:=clBlack;
  Bild.Canvas.Brush.Color:=clWindow;
  Bild.Canvas.Rectangle(Rect(0,0,Bild.Width,Bild.Height));
  Bild.Canvas.MoveTo(0,0);                        // Diese Testlinien zeichnet er wunderbar
  Bild.Canvas.LineTo(Bild.Width,Bild.Height);     // Er erkennt sogar wo die Ecken eigentlich sein sollten.
  Bild.Canvas.MoveTo(0,Bild.Height);
  Bild.Canvas.LineTo(Bild.Width,0);
end;


Resultat:
user defined image

Wie man sehen kann, verändert sich die Größe des Bildes nicht.
Die diagonalen Linien jedoch wissen anscheinend sehr genau, wo die Ecken sein müssten.

Woran kann es liegen ?
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Mo 19.06.06 09:19 
Durch Vergrößern des TImage ändert sich die Größe dessen Zeichenfläche nicht. Leider bietet diese auch keine direkte Möglichkeit die Größe anzupassen. Du mußt also den Canvas freigeben und einen neuen mit geeigneter Größe erzeugen oder am Anfang ein Canvas maximaler Größe anlegen.

_________________
Markus Kinzler.
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Mo 19.06.06 10:04 
ich mag mich da vielleicht vertun... aber hast du dir mal

property Align;
property Stretch;

bei TImage mal angeschaut?
Fighter#1
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 787

Win XP, Ubuntu 8.04
Turbo Delphi 2006, Delphi 2005 Pe, Delphi 5 Pe, Netbeans 6.1, Eclipse, Microsoft VisualC#, Dev C++, PHP, HTML, CSS
BeitragVerfasst: Mo 19.06.06 11:12 
Ist Parent denn auf das Form gestellt?
Wenn nicht kann sich ja nix ändern!

_________________
Wer andere beherrscht ist stark,
wer sich selbst beherrscht ist mächtig. Lao Tse
Jetstream Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222



BeitragVerfasst: Mo 19.06.06 11:25 
@ Fighter#1
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Panel2.DoubleBuffered:=true;
  AktivesBild:=TImage.Create(Panel2);  // Bild erstellen.
  AktivesBild.Parent:=Panel2;          // Bild ins Panel setzen <------- da
end;

@ crowley:
AktivesBild.Align:=alClient ändert gar nichts.
AktivesBild.Stretch:=true vergrößert zwar das Bild auf Fenstergröße, verpixelt aber total.

@ mckinzler:
Hmmm, hört sich gut an, nur wie mach ich das genau?
AktivesBild.Canvas.Free; funktioniert.
Aber bei AktivesBild.Canvas:=TCanvas.create(self); meckert er, canvas sei read only.
Jetstream Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222



BeitragVerfasst: Mo 19.06.06 12:16 
Der Spuk hat ein Ende. Habs nun (fürs erste) raus.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.FormResize(Sender: TObject);
begin
  if AktivesTurnier<>nil then
  begin
    AktivesBild.Free;
    AktivesBild:=TImage.create(Form1.Panel2);
    AktivesBild.Parent:=Form1.Panel2;
    AktivesTurnier.Zeichnen(AktivesBild);
  end;
end;

Ich lösche einfach immer wieder das Image und erstelle es sofort wieder neu.
So entsteht ein neuer Canvas.

Frisst nur leider CPU wie Sau ...
Komme mit meiner bescheidenen Methode, die nur zwei simple Diagonalen zeichnet,
schon auf 60% CPU Auslastung wenn ich resize.

Geht das effizienter ?