Thema: Delphi Gespräch simulieren??

Einzelnen Beitrag anzeigen

Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#22

AW: Gespräch simulieren??

  Alt 6. Jun 2012, 14:27
@Progman:
Ja, ganau: Das wäre eine universelle Lösung, bei der der Rest der Anwendung auch noch bedienbar bleibt und sogar geschlossen werden könnte, ohne Zugriffsverletzungen durch Application.ProcessMessages befürchten zu müssen.

@MrSpock:
Die Methode Update greift nur, wenn das Steuerelement komplett oder zumindest der betreffende Teil in die Updateregion aufgenommen wurde. Beim Label geschieht das automatisch, wenn die Beschriftung geändert wurde. Anders sieht es bei selbstgezeichneten Elementen - wie zum Beispiel einer PaintBox aus. Hier muß der Bereich explizit zur Updateregion hinzugefügt werden. Der Einfachheit halber kann man das über die Methode Invalidate bewerkstelligen:
Delphi-Quellcode:
  PaintBox1.Invalidate;
  PaintBox1.Update;
Beide Anweisungen lassen sich auch mit PaintBox1.Repaint zusammenfassen.
Ein kleines Beispiel dazu (ein Button und eine PaintBox auf dem Formular und die Unit AnonymousMethodsTools.pas aus dem Google Maps Framework einbinden):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  Radius = 5;
var
  x: Integer;
begin
  with PaintBox1 do
  begin
    OnPaint:=MakeEvent(
      procedure(Sender: TObject)
      var
        y: Integer;
      begin
        y:=Round(-4*(Radius-Height)/Sqr(Width)*Sqr(x-Width/2)+Radius);
        Canvas.Brush.Color:=clRed;
        Canvas.Ellipse(x-Radius,y-Radius,x+Radius,y+Radius);
      end);
    for x:=-Radius to Width+Radius do
    begin
      Repaint;
      Sleep(10);
    end;
    ReleaseEvent(OnPaint);
    OnPaint:=nil;
  end;
end;
Hier wird einfach eine rote Kugel (genauer gesagt: ein Kreis) in einer parabelförmigen Bahn durch die Gegend geschossen. Auch hier werden die Veränderungen auf dem Bildschirm sichtbar, obwohl ProcessMessages nicht aufgerufen wird. Allerdings ist die Anwendung in dieser Zeit natürlich nicht bedienbar.

Ersetzt man jetzt die Schleife mit
Delphi-Quellcode:
    [...]
    for x:=-Radius to Width+Radius do
    begin
      Invalidate;
      Application.ProcessMessages;
      Sleep(10);
    end;
    [...]
kommt es zu Zugriffsverletzungen, da jetzt der Anwender die Möglichkeit hat, den Button während der Ausführung der Methode erneut zu betätigen. Damit sind dann zusätzliche Sicherungsmaßnahmen notwendig (zum Beispiel Button während der Ausführung deaktivieren oder ein Flag mit Abbruchbedingung).

@himitsu:
Wo steht das mit dem internen Fenster?
Im Quelltext von TTimer.UpdateTimer in der Unit ExtCtrls steht lediglich ein Aufruf von KillTimer und SetTimer (beides API-Funktionen) mit dem selben Fenster-Handle...
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom ( 6. Jun 2012 um 21:48 Uhr)
  Mit Zitat antworten Zitat