Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Methodenaufruf nur für Klassenmethoden und Konstruktoren (https://www.delphipraxis.net/189099-methodenaufruf-nur-fuer-klassenmethoden-und-konstruktoren.html)

Devil1925 3. Mai 2016 14:27

Methodenaufruf nur für Klassenmethoden und Konstruktoren
 
Folgende Problematik: Ich möchte eine Prozedur aus Mehreren Formularen heraus aufrufen. Aus diesem Grund habe ich die Prozedur in eine Zentrale Unit abgelegt. Um diese nun allgemein verwendbar zu machen muss ich diese Prozedur nun aufrufen und entsprechende Komponenten mit Übergeben.

Meine Prozedur:

Delphi-Quellcode:
procedure TfrmGlobal.RestorePosition(Scroll:TVertScrollBox; Layout:TLayout);
begin
  Scroll.ViewportPosition := PointF(Scroll.ViewportPosition.X, 0);
  Layout.Align := TAlignLayout.Client;
  Scroll.RealignContent;
end;
Diese Steht in der Unit "Global".
Nun möchte ich diese Folgendermaßen aufrufen:

Delphi-Quellcode:

  Global.RestorePosition(VertScrollBox1, Layout1);

Allerdings bekomme ich hier den folgenden Fehler:

Diese Form des Methodenaufrufs ist nur für Klassenmethoden und Konstruktoren zulässig.

Jetzt Meine große Frage: was muss ich ändern, damit das Funktioniert?

Daniel 3. Mai 2016 14:34

AW: Methodenaufruf nur für Klassenmethoden und Konstruktoren
 
Zitat:

Zitat von Devil1925 (Beitrag 1337365)
Jetzt Meine große Frage: was muss ich ändern, damit das Funktioniert?

Da fehlt die Referenz auf das Formular.
Deine Methode ist ja nicht nur Teil der Unit, sondern insbesondere auch Teil Deiner Formular-Klasse "TfrmGlobal". Von dessen Instanz musst Du die Methode aufrufen.

Im einfachsten Fall kneifst Du die Augen zu und hoffst, dass die von Delphi automatisch angelegte Form-Variable "frmGlobal" immer auf eine gültige Instanz zeigt und verwendest diese:
Delphi-Quellcode:
frmGlobal.RestorePosition()

Devil1925 3. Mai 2016 14:43

AW: Methodenaufruf nur für Klassenmethoden und Konstruktoren
 
Haut nicht hin... sagt mir jetzt: Undeklarierter Bezeichner "frmGlobal"

Ich schließe jetzt einfach mal aus deinem Post, dass ich da was Instanztechnisch machen muss. Allerdings bin ich da mit meinem Latein derzeit am Ende...

Sir Rufo 3. Mai 2016 14:46

AW: Methodenaufruf nur für Klassenmethoden und Konstruktoren
 
Delphi-Quellcode:
unit FMX.Tools;

interface

uses
 {selber schauen, was hier alles benötigt wird}

type
  FMXTools = class sealed
  public
    class procedure RestorePosition( aScroll: TScrollBox; aLayout: TLayout );
  end;

implementation

class procedure FMXTools.RestorePosition( aScroll: TScrollBox; aLayout: TLayout );
begin
  aScroll.ViewportPosition := PointF(aScroll.ViewportPosition.X, 0);
  aLayout.Align := TAlignLayout.Client;
  aScroll.RealignContent;
end;

end.
Aufruf über
Delphi-Quellcode:
uses
  FMX.Tools;

procedure TSomeForm.Whatever;
begin
  FMXTools.RestorePosition( ScrollBox1, Layout1 );
end;

Klaus01 3. Mai 2016 14:47

AW: Methodenaufruf nur für Klassenmethoden und Konstruktoren
 
So ist die Methode keine Methode mehr - sondern eine einfache Procedure:
Delphi-Quellcode:
procedure RestorePosition(Scroll:TVertScrollBox; Layout:TLayout);
begin
  Scroll.ViewportPosition := PointF(Scroll.ViewportPosition.X, 0);
  Layout.Align := TAlignLayout.Client;
  Scroll.RealignContent;
end;
Dies sollte sich dann auch (wenn Global als Unit eingebunden wurde) so aufrufen können:
Delphi-Quellcode:
RestorePosition(VertScrollBox1, Layout1);
Grüße
Klaus

Devil1925 3. Mai 2016 14:47

AW: Methodenaufruf nur für Klassenmethoden und Konstruktoren
 
STOP STOP STOP!

Meine güte bin ich Blöd... Denken sollte man können! wenn frmGlobal nirgends Deklariert wird kann es die Selbstverständlich nicht geben!

Sir Rufo 3. Mai 2016 14:51

AW: Methodenaufruf nur für Klassenmethoden und Konstruktoren
 
Zitat:

Zitat von Devil1925 (Beitrag 1337370)
STOP STOP STOP!

Meine güte bin ich Blöd... Denken sollte man können! wenn frmGlobal nirgends Deklariert wird kann es die Selbstverständlich nicht geben!

Wenn die Methode aber überhaupt nicht Instanz-Relevant ist, dann pack die als
Delphi-Quellcode:
class procedure
in eine Klasse (s. mein Beitrag).

Benedikt Magnus 3. Mai 2016 16:02

AW: Methodenaufruf nur für Klassenmethoden und Konstruktoren
 
Zitat:

Zitat von Sir Rufo (Beitrag 1337371)
Wenn die Methode aber überhaupt nicht Instanz-Relevant ist, dann pack die als
Delphi-Quellcode:
class procedure
in eine Klasse (s. mein Beitrag).

Immer dieses OOP. :-D
Wenn die Methode überhaupt nicht instanzrelevant ist, ist die Variante von Klaus01 doch am einfachsten. So mache ich das auch immer mit vielfach verwendeten Prozeduren:
Neue Unit und das ganze (hübsch prozedural :-D) reingepackt.

Also, Devil1925, wenn du Prozeduren und Funktionen, die du häufiger brauchst, in eine neue Unit auslagern möchtest, dann musst du dabei keine Form oder Instanz übernehmen (TfrmGlobal). Es reicht, wenn du deine Prozedur ganz einfach ohne Instanz, so wie Klaus es beschrieben hat, in der Unit deklarierst und diese dann in deinem Programm unter uses aufführst. Dann kannst du sie nämlich genau so verwenden, als wäre sie in derselben Unit.

Sir Rufo 3. Mai 2016 16:59

AW: Methodenaufruf nur für Klassenmethoden und Konstruktoren
 
Ich bin halt faul und merke mir nur den Klassennamen. Der Rest erschließt sich dann über die Code-Vervollständigung :stupid:

Benedikt Magnus 3. Mai 2016 18:28

AW: Methodenaufruf nur für Klassenmethoden und Konstruktoren
 
So habe ich das noch nie betrachtet. :shock:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:34 Uhr.

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