Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TaskDialog in globaler Unit? (https://www.delphipraxis.net/212173-taskdialog-globaler-unit.html)

HCB 30. Dez 2022 08:26

Delphi-Version: 10.4 Sydney

TaskDialog in globaler Unit?
 
Hallo, ich frage mich ob es möglich ist, eigene Dialoge in einer globalen Unit unterzubringen. Ich versuche TTaskDialog als procedure aufzurufen. Aber schon beim Anlegen von
with TTaskDialog.Create(Self) do ... kommt die Fehlermeldung dass Self ein unbekannter Bezeichner ist.

Frage funktioniert das überhaupt ohne eine Form im Hintergrund zu haben?

Für Tipps wäre ich sehr dankbar.

LG Harry

TurboMagic 30. Dez 2022 09:05

AW: TaskDialog in globaler Unit?
 
Hallo,

1. Hast du eine Ahnung, was Self bedeutet? Dein Post lingt leider nicht danach.
Self ist eine Referenz auf die eigene Objektinstanz. Nur: hast du eine Objektinstanz
wenn du das in eine Prozedur packst?

2. Da Self so nicht geht, was ist denn die Alternative zu einer Objektinstanz?
Nil! Damit hat der Taskdialog halt keinen "Owner" und du musst dich selber um dessen
Freigabe kümmern. Ist ja aber machbar.

Grüße
TurboMagic

HCB 30. Dez 2022 09:38

AW: TaskDialog in globaler Unit?
 
Hallo TurboMagic,

jawoll ich habe keine Ahnung was Self bedeutet (bin Dilletant), aber ich bedanke mich für deinen wertvollen Hinweis mit"NIL".
Ich habe es jetzt so am Laufen:

procedure errorMessage(Message:String);
begin
with TTaskDialog.Create(NIL) do
begin
try
MainIcon := tdiWarning;
Caption := 'WARNUNG';
Title := Message;
CommonButtons := [tcbClose];
Execute;
finally
Free;
end;
end;

LG Harry

himitsu 30. Dez 2022 10:17

AW: TaskDialog in globaler Unit?
 
Ich hole meine Antwort mal von deiner anderen Frage hier her.
https://www.delphipraxis.net/212172-...aler-unit.html

Zitat:

Zitat von himitsu (Beitrag 1516790)
Du weißt was Self ist?
Und du weißt wofür man dort diesen Parameter an Create übergibt?

Lösungen:
* Nimm etwas anderes, anstatt Self,
* oder nimm Nichts (nil).

Self ist, innerhalb von Methoden einer Klasse (oder eines Records) die aktuelle Instanz der Klasse.

zum Owner:
Wenn du selbst etwas freigibsts (Free), dann kümmerst du dich darum und es es muß niemand Anderes angegeben werden, welcher das macht.

PS: es gibt CODE-Tags ala [DELPHI]...[/DELPHI], für deinen Quellcode, damit man ihn besser lesen kann.

Und noch ein Tipp: wenn möglich, dann wollte man besser kein WITH benutzen.
Es macht mehr Probleme, als man denkt sich damit Arbeit zu sparen, und irgendwann wirst du es bestimmt mal schmerzlich bereuen.

TurboMagic 30. Dez 2022 15:30

AW: TaskDialog in globaler Unit?
 
Zitat:

Zitat von HCB (Beitrag 1516789)
Hallo TurboMagic,

jawoll ich habe keine Ahnung was Self bedeutet (bin Dilletant), aber ich bedanke mich für deinen wertvollen Hinweis mit"NIL".
Ich habe es jetzt so am Laufen: (snip)

LG Harry

Noch so'n paar Tips gratis:

1. Ja, Himitsu hat recht, besser kein with benutzen.
2. Wenn du vor dem Eingeben deines Codebeispiels den Delphi Helm über dem Texteditor hier im
Forum anklickst und du deinen Codee dann zwischen die dadurch eingefügten Tags schreibst, wird
der passend formatiert (jedenfalls so, wie du das einrückst etc.), sieht z. B. so aus:

Delphi-Quellcode:
procedure errorMessage(Message:String);
begin
 with TTaskDialog.Create(NIL) do
 begin
   try
     MainIcon := tdiWarning;
     Caption := 'WARNUNG';
     Title := Message;
     CommonButtons := [tcbClose];
     Execute;
   finally
     Free;
   end;
 end;
end;
3. Hier noch eine Variante ohne with:

Delphi-Quellcode:
procedure errorMessage(Message:String);
var
  Dlg: TTaskDialog;
begin
 Dlg := TTaskDialog.Create(NIL);
 try
   Dlg.MainIcon := tdiWarning;
   Dlg.Caption := 'WARNUNG';
   Dlg.Title := Message;
   Dlg.CommonButtons := [tcbClose];
   Dlg.Execute;
 finally
   Dlg.Free;
 end;
end;
Grüße und weiter Erfolg

TurboMagic

KodeZwerg 30. Dez 2022 22:41

AW: TaskDialog in globaler Unit?
 
Ich würde dennoch den Owner übergeben (kann ja "Self" als parameter sein) um bei solchen Dingen auch Modal nutzen zu können. Oder war es Parent... eins von beiden, ich nutz meist beides :)

KodeZwerg 30. Dez 2022 23:01

AW: TaskDialog in globaler Unit?
 
So hier...
Delphi-Quellcode:
unit Unit8;

interface

uses
  Winapi.Windows,
  System.Classes,
  Vcl.Forms, Vcl.Dialogs;

procedure errorMessage(const AOwner: TComponent; const AMessage: string);

implementation

procedure errorMessage(const AOwner: TComponent; const AMessage: string);
var
  Dlg: TTaskDialog;
begin
  Dlg := TTaskDialog.Create(AOwner);
  try
    Dlg.MainIcon := tdiWarning;
    Dlg.Caption := 'WARNUNG';
    Dlg.Title := AMessage;
    Dlg.CommonButtons := [tcbClose];
    Dlg.ModalResult := MB_OK;
    Dlg.Execute;
  finally
    Dlg.Free;
  end;
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz