![]() |
Re: Procedure TForm.xyz in Unit
Zitat:
Tuform ist von Tform abgeleitet, und Tform wieder vom Tuform? sehe ich das jetzt richtig oder ist meine Morgenmüdigkeit noch zu massiv zum denken? |
Re: Procedure TForm.xyz in Unit
Ja, du siehst das richtig, hat aber auch nen simplen Grund. Im Hauptformular ist die Form1 von TForm abgeleitet. Das heißt, die Funktionen der anderen Unit, die von dieser Form genutzt werden sollen, müssen in einer Klasse stehen, die ebenfall von TForm abgeleitet ist und dazu noch den Namen TForm haben muss. Da ich aber TForm nicht von TForm ableiten kann, mache ich es eben über TUForm.
|
Re: Procedure TForm.xyz in Unit
Aber du leitest eine Klasse mit der Bezeichnung TForm wieder davon ab.
|
Re: Procedure TForm.xyz in Unit
Wenn ich es so belassen würde:
Delphi-Quellcode:
Dann müsste ich in der MainUnit das Formular von TUForm ableiten. Füge ich aber die 2. Ableitung in der Unit hinzu, kann ich in der MainUnit das Formular ganz normal lassen und muss da nichts ändern.
Type
TUForm = class(TForm) Procedure xyz //[..] |
Re: Procedure TForm.xyz in Unit
Aber so erbt Formx nicht deine Erweiterungen.
|
Re: Procedure TForm.xyz in Unit
Zitat:
|
Re: Procedure TForm.xyz in Unit
Puuuhhh... also ich glaube, hier wird völlig aneinander vorbei geredet... und anscheinend wurde auch das eigentliche Problem gar nicht verstanden :wink:
Also... zunächst mal geht es doch darum, eine allgemein verwendbare Funktion in einer Bibliotheksunit unterzubringen. Derartige Funktionen werden nicht als Methoden (einer Klasse), sondern als ganz normale (öffentliche) Funktionen/Prozeduren implementiert:
Delphi-Quellcode:
Das "TForm." vor dem Prozedurnamen "xyx" war also der Fehler.interface procedure xyz(s: String); implementation procedure xyz(s: String); begin ... end; Wir wissen jetzt natülrlich nicht, was diese Prozedur eigentlich tun soll... aber falls diese Prozedur etwas mit einem Formular tun soll, dann muss natürlich dieses Formular als Argument übergeben werden:
Delphi-Quellcode:
Diese Prozedur kann dann mit jedem beliebigen Formular aufgerufen werden, und zwar egal von welcher Klasse dieses Formular abgeleitet ist und egal, wie dieses Formular heißt.
unit LibFormUtils;
uses Forms; interface procedure LibFormXYZ(a_frm: TForm; a_sText: String); implementation procedure LibFormXYZ(a_frm: TForm; a_sText: String); begin ... end; Der Aufruf kann so aussehen:
Delphi-Quellcode:
Nebenbei bemerkt, muss diese Prozedur auch nicht unbedingt aus einer Methode einer Formularklasse heraus aufgerufen werden, wie in diesem Beispiel. Eine solche Funktion/Prozedur ist universell verwendbar, aus jedem beliebigen Kontext heraus (natürlich darf dann nicht "Self" als Argument übergeben werden, sondern die betreffende Formularvariable). Und darum ging es doch... eine universelle Funktion/Prozedur zu implementieren, die überall verwendbar ist :wink:
unit formMain;
interface type TfrmMain = class(TForm) ... private procedure XXXX; ... end; ... implementation uses LibFormUtils; procedure TfrmMain.XXXX; begin ... LibFormXYZ(Self, 'Ein Text'); ... end; |
Re: Procedure TForm.xyz in Unit
Nein er wollte Methoden der Form extern einbinden.
|
Re: Procedure TForm.xyz in Unit
@mkinzler:
Ich glaube, er meinte genau das, was ich beschrieben habe: Zitat:
Ein Problem kam nur dadurch zustande (und damit die ganze Diskussion), weil er fälschlicherweise (vielleicht auch nur versehentlich) "TForm1." vor den Prozedurnamen geschrieben hat - vielleicht weil er dachte, er könnte diese Prozedur sonst nicht in seinem Formular verwenden... Falls Robby aber eigentlich die Basisklasse seiner Formulare erweitern wollte, dann muss er eine neue Klasse, die von TForm abgeleitet ist mit dieser Prozedur implementieren und seine Formulare dann von dieser neuen eigenen Basisklasse ableiten:
Delphi-Quellcode:
Aber wir sollten hier jetzt vielleicht nicht weiter darüber diskutieren, was Robby jetzt vielleicht tatsächlich gemeint haben könnte... das sollte er selbst am besten wissen und ich denke, er hat jetzt alle nötigen Infos :wink:unit LibForm; uses Forms; type TLibForm = class(TForm) ... procedure XYZ(a_sText: String); ... end; ---------------------------------------- unit formMain; uses LibForm; type TfrmMain = class(TLibForm) ... end; ... implementation TfrmMain.XXXX; begin ... XYZ('Ein Text'); ... end; |
Re: Procedure TForm.xyz in Unit
So ist das Problem vielleicht auch gelöst, aber doch recht umständlich, denn wenn er jede Methode händisch anpassen muss, könnte er auch gleich den Code direkt reinkoppieren.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 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