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/)
-   -   Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form (https://www.delphipraxis.net/169142-showmessage-oder-auch-form-showmodal-verschwindet-manchmal-hinter-form.html)

himitsu 2. Jul 2012 16:22

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form
 
Das FreeOnTerminate ist nicht nötig, da es im Constructor des TAnonymousThread schon auf true gesetzt wird.
Delphi-Quellcode:
TThread.CreateAnonymousThread(procedure
  begin
    ...
  end).Start;

// oder

TAnonymousThread.Create(procedure
  begin
    ...
  end).Start;
Man könnte aber auch das FreeOnTerminate auf false setzen und eine Warteschleife (ähnlich dem DelayDelay) anhängen, welche auf den Thread wartet, aber die GUI sich aktualisieren läßt.

Die anonymen Methoden können sogar Variablen hin und her verwalten.
Delphi-Quellcode:
proedure Test;
var
  xyz: string;
begin
  xyz := 'abc';

  TThread.CreateAnonymousThread(procedure
    var
      i: Integer;
    begin
      for i := 0 to 29 do begin
        xyz := xyz + IntToStr(i mod 10);
        Sleep(1000);
      end;
      TThread.Synchronize(nil, procedure
        begin
          ShowMessage(xyz);
        end;
    end).Start;
end;
Und das Schöne, man sieht hier sogar direkt den Programmablauf, was sich aber eher nur für kurze Methoden eignet, also für längeren Code sollte man besser eine getrennte Prozedur/Methode übergeben.

taveuni 2. Jul 2012 16:48

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form
 
Zitat:

Zitat von himitsu (Beitrag 1173185)
Delphi-Quellcode:
// oder

TAnonymousThread.Create(procedure
  begin
    ...
  end).Start;

Wie kriegst Du denn das kompiliert?
Das ist ja in der Klassenfunktion TThread.CreateAnonymousThread drin.

himitsu 2. Jul 2012 18:07

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form
 
Das ist eine anonyme Methode. :zwinker:
Sie wird einfach an Ort und Stelle deklariert, wo man sie verwenden will.

Die gibt es seit Delphi 2009. (genauer, seitdem es die Generics gibt)

- Unicode
- Record-Methoden (schau dir z.B. mal Delphi-Referenz durchsuchenTRect an)
- Record-Operatoren
- Generics
- anonyme Methoden
- ...
Es gab halt in letzer Zeit einige Neuerungen. :angle:



Der Parameter des CreateAnonymousThread/Create wurde als
Delphi-Quellcode:
procedure of
deklariert, womit man dort alles mögliche übergeben kann.
Delphi-Quellcode:
type
  TMyProcedure = procedure; // nimmt nur Prozeduren auf
  TMyMethod = procedure of object; // nimmt nur Methoden auf
  TMyAnonymus = reference to procedure; // nimmt alles auf (dahinter versteckt sich ein geheimes generisches Interface)

messie 2. Jul 2012 18:54

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form
 
Zitat:

Zitat von himitsu (Beitrag 1173199)
Das ist eine anonyme Methode. :zwinker:
Sie wird einfach an Ort und Stelle deklariert, wo man sie verwenden will.

Die gibt es seit Delphi 2009. (genauer, seitdem es die Generics gibt)

- Unicode
- Record-Methoden (schau dir z.B. mal Delphi-Referenz durchsuchenTRect an)
- Record-Operatoren
- Generics
- anonyme Methoden
- ...
Es gab halt in letzer Zeit einige Neuerungen. :angle:



Der Parameter des CreateAnonymousThread/Create wurde als
Delphi-Quellcode:
procedure of
deklariert, womit man dort alles mögliche übergeben kann.
Delphi-Quellcode:
type
  TMyProcedure = procedure; // nimmt nur Prozeduren auf
  TMyMethod = procedure of object; // nimmt nur Methoden auf
  TMyAnonymus = reference to procedure; // nimmt alles auf (dahinter versteckt sich ein geheimes generisches Interface)

:thumb::thumb::thumb: (weil es den DANKE-Button immer noch nicht gibt :wink:)

taveuni 3. Jul 2012 07:38

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form
 
Zitat:

Zitat von himitsu (Beitrag 1173199)
Das ist eine anonyme Methode. :zwinker:
[...]
Der Parameter des CreateAnonymousThread/Create wurde als
Delphi-Quellcode:
procedure of
deklariert, womit man dort alles mögliche übergeben kann.[...]

Danke. Mittlerweile kenne ich all diese Features auch. Ich hatte ja weiter oben den Threadersteller darauf hingewiesen.
Meine Frage bezog sich auch nicht auf die Anonyme Methode welche Du übergibst sondern:

Delphi-Quellcode:
TThread.CreateAnonymousThread()
ist ja eine Klassenfunktion und da ist auch alles o.k.

Du hast aber geschrieben es gehe auch:
Delphi-Quellcode:
TAnonymousThread.Create()
Und dies kann ich meinem Delphi XE2 Upd3 nicht beibringen. Du schon?

himitsu 3. Jul 2012 08:57

AW: Showmessage oder auch Form.showmodal verschwindet manchmal hinter Form
 
Arg, ich hatte mich verguckt.

Delphi-Quellcode:
class function TThread.CreateAnonymousThread(const ThreadProc: TProc): TThread;
begin
  Result := TAnonymousThread.Create(ThreadProc);
end;
Nur daß mal wieder jemand auf die saublöde Idee gekommen ist und diese Klasse versteckt in der Implementation deklariert hat. :wall:
Haben die noch nie was von Vererbung gehört und daß es eventuell jemanden geben könnte, der davon mal ableiten wöllte?
Eine Funktion wie CreateAnonymousThread hatte ich mir ja schon vorher (bevor die mir die Idee geklaut hatten), selbst implementiert. (Hier im Forum suchenRunAsThread)

Nja, ich hätte da eher noch die die edde gehabt, für eine Wartefunktion, aber egal, häng ich die halt via Class-Helper an TThread dran.
(CreateAnonymousThreadAndWait)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 Uhr.
Seite 2 von 2     12   

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