Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Methode in Consolenanwendung erstellen (https://www.delphipraxis.net/204395-methode-consolenanwendung-erstellen.html)

Hobbycoder 26. Mai 2020 13:34

Methode in Consolenanwendung erstellen
 
Hi,

ich habe ein Consolenanwendung. In der erzeuge ich ein Object und möchte nun einem Event des Objects eine Methode zuweisen. Geht nicht, weil ich nur prozeduren habe.
Wie erstellt man in einer Cosolenanwendung eine Methode?

Object:
Delphi-Quellcode:
unit uTestObject;

interface

type
  TOnLog=procedure(Sender: TObject; LogText: string) of object;

  TTestObject=class
  private
    FOnLog: TOnLog;
    procedure DoLog(LogText: string);
  public
    procdure MachWas;
  published
    property OnLog: TOnLog read FOnLog write FOnLog;
  end;

Implementation

proceudre TTestObject.DoLog(LogText: string);
begin
  if Assigned(FOnLog) then
    FOnLog(self, LogText);
end;

procedure TTestObject.MachWas;
begin
  DoLog('TestLogText');
end;

end.
Consolenanwendung:
Delphi-Quellcode:
program CMDTest;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  uTestObject in 'uTestObject.pas';

var
  TestObject: TTestObject;

proceudre LogMsg(Sender: TObject; LogText: string);
begin
  MachIrgendwasMitLogText;
end;

begin
  TestObject:=TTestObject.Create;
  try
    TestObject.OnLog:=LogMsg;  //<---Das wird nicht compiliert: [dcc32 Fehler] CMDTest.dpr(104): E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
    TestObject.MachWas;
  finally
    TestObject.free;
  end;
end.

TiGü 26. Mai 2020 13:39

AW: Methode in Consolenanwendung erstellen
 
Delphi-Quellcode:
type
  TOnLog=procedure(Sender: TObject; LogText: string); // of object; -> brauchste hier nicht
Alternative:
Delphi-Quellcode:
type
  TOnLog = reference to procedure(Sender: TObject; LogText: string); // -> geht dann Beides
Zum Weiterlesen: https://www.delphipraxis.net/195042-...procedure.html

Hobbycoder 26. Mai 2020 14:34

AW: Methode in Consolenanwendung erstellen
 
Wenn ich das mache, wie veröffentliche ich dann meine Property bekannt?
Delphi-Quellcode:
[dcc32 Fehler] uTestObject.pas(28): E2188 Published-Eigenschaft 'OnLog' kann nicht vom Typ PROCEDURE sein

freimatz 26. Mai 2020 14:36

AW: Methode in Consolenanwendung erstellen
 
Wozu brauchst du denn published? Das ist doch kein Control - oder?

Hobbycoder 26. Mai 2020 14:49

AW: Methode in Consolenanwendung erstellen
 
Ah...danke für den letzten Hinweis. Jetzt funktioniert's.

Danke TiGü und Freimatz

himitsu 26. Mai 2020 15:00

AW: Methode in Consolenanwendung erstellen
 
Zeiger vom Typ
Delphi-Quellcode:
procedure of object
nehmen nicht nur Methoden, sondern auch Klassenmethoden an.
Delphi-Quellcode:
type
  TMyClass = class abstract // abstract muß nicht,aber wenn wir die Instanz eh nie erstellen wollen...
    class procedure DoLog;
  end;
Niemand verbietet in Konsolenanwendungen Klassen zu benutzen.
Also könntest du dir auch eine Klasse, mit oder ohne Instanz, für deine Hilfsfunktionen (ala DoLog) erstellen.

Delphi-Quellcode:
TestObject.OnLog := TMyClass.LogMsg;

Hier wirklich TMyClass mit T, weil Class-Function und damit keine Instanz nötig,

im Gegensatz zu deinem TTestObject.OnLog/MachWas in Post #1, wo das T falsch ist.

Hobbycoder 26. Mai 2020 16:09

AW: Methode in Consolenanwendung erstellen
 
Zitat:

Zitat von himitsu (Beitrag 1465361)
Im Gegensatz zu deinem TTestObject.OnLog/MachWas in Post #1, wo das T falsch ist.

Das war ein Tippfehler. Ich hatte das ganze in einem Beispiel zusammengetippt, um nicht die ganze Unit zu posten. Hab das der Vollständigkeitshalber oben korrigiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:42 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 by Thomas Breitkreuz