Entwickler-Ecke

Sonstiges (Delphi) - ONRezize benutzen...


Rag3 - Fr 24.06.05 10:28
Titel: ONRezize benutzen...
Hi,
ich würde gerne mit einer Prozedur mein Bild (TImage) vergrößern und die Darstellung neu berechnen Lassen. Wenn ich aber mit OnResize arbeite, so wie ich es kenne, aktualisiert der jeden Augenblick das Bild, was auf langsameren Rechnern zu erheblichen Problemen führen würde. Daher würde ich die neuberechnung des Bildes gerne erst ausführen, wenn die Größenänderung beendet ist. Wie mache ich sowas?

mfg

Rag3


Narses - Fr 24.06.05 10:46

Moin!

Vorschlag: Du packst noch einen Timer mit auf das Formular. Wenn das OnResize eintritt, dann merkst du dir die neuen Ausdehnungen und startest den Timer (mit, keine Ahnung, 1000ms oder so). Wenn vor Ablauf des Timers noch ein OnResize kommt, stoppst du den Timer, merkst dir wieder die neuen Daten und startest den Timer. Wenn man nicht mehr an der Größe rumspielt, dann läuft der Timer nach dem Ändern irgend wann ab und das OnTimer-Ereigniss tritt ein: hier machst du dann erst die Resize-Aktionen. :wink:

cu
Narses


Lossy eX - Fr 24.06.05 11:16

Du kannst auch dir bescheid sagen lassen, wenn der Benutzer das Fenster nicht mehr in der Größe verändern möchte.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  TForm1 = class(TForm)
  protected
    procedure WMExitsizemove(var Message: TMessage);
      message WM_EXITSIZEMOVE;
  public
    { Public-Deklarationen }
  end;

implementation

procedure TForm1.WMExitsizemove(var Message: TMessage);
begin
  // Mach mich groß.
end;


Narses - Fr 24.06.05 11:28

Moin!

user profile iconLossy eX hat folgendes geschrieben:
Du kannst auch dir bescheid sagen lassen, wenn der Benutzer das Fenster nicht mehr in der Größe verändern möchte.

Klar, dass ist natürlich die elegantere Variante, wenn du konkret auf das Ende des Sizings reagieren willst, mein Vorschlag kann aber (bei geeignetem Timer-Interval) auch zwischendurch schonmal was neu zeichnen; ist also quasi ein Filter für die Häufigkeit der Events. :wink:

cu
Narses

@Lossy eX: Die Idee ist aber gut! :wink:


Rag3 - Fr 24.06.05 14:47

also die lösungen gefallen mir prinzipiell beide gut, ich kann ja per einstellung festlegen lassen, ob erst am ende oder mitten drinnen aktualisiert werden soll. So kann jeder nach seiner Hardware entscheiden.
Nur verstehe ich nicht ganz, wie ich den surcecode oben einbinden kann, bitte erklär mir das nochmal. Ich werde das ganze dann morgen abend mal probiern und mein ergebnis posten!

mfg


Lossy eX - Fr 24.06.05 14:58

Na ja. Den Code musst du halt in dein Formular schreiben. Ein leeres Formular sieht so aus.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


Und du machst dann folgendes raus.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  protected
    procedure WMExitsizemove(var Message: TMessage);
      message WM_EXITSIZEMOVE;

  public
    { Public-Deklarationen }
  end;


Im Implementation teil musst du diese Methode dann natürlich noch implementieren. Dazu schreibst du folgendes.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
implementation

procedure TForm1.WMExitsizemove(var Message: TMessage);
begin
  // Mach mich groß.
end;


Besser kann ich es jetzt echt nicht erklären. Falls immer noch Bedarf besteht solltest du dir auf jeden Fall auch mal ein Tutorial über Objekt orientierte Programmierung anschauen.


Rag3 - Fr 24.06.05 17:54

thx, hab hinbekommen, hätte nur nicht gedacht, dass das so einfach geht. Objetorientierte Programmierung beherrsche ich eigentlich einigermaßen. Hab es immerhin hinbekommen ein Programm zur Darstellung von Mathematischen Funktionen jeder Art inkl. Parser in Delphi zu schreiben. Den werde ich übrigens demnächst mal hier im forum posten, wenn bedarf besteht...

danke für die hilfe!