[Erledigt] Wiederverwendung von Code

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

[Erledigt] Wiederverwendung von Code

Beitrag von charlytango »

Hi

Ich erzeuge auf einem Formular etliche Controls (unterschiedlichen Typs) zu Laufzeit - klappt und passt.
Der Code sei nur exemplarisch.

Code: Alles auswählen

        
        with TEdit.Create(self) do
        begin
          {$INCLUDE controlpos.inc} //hier sind nur Einstellungen drin.
          Text := FoSettings.TSettingsTable.FieldByName('value').AsString;
          OnExit:=@GetData_Edit;  //hier weiss ich nicht weiter.
        end; 
Jetzt möchte ich die gleiche Funktionalität in einem anderen Formular nutzen. Also hab ich den Code in einer Unit verpackt und um die nötigen Parameter ergänzt.

Dort wo ich scheitere ist dass ich in dem einen Formular eine dynamische Zuordnung von Eventprozeduren brauche und im anderen nicht. Denn die Eventprozeduren benötigen auch Variablen aus der entsprechenden Form die ich in der Unit natürlich nicht habe.

Etwas kryptisch, ich weiß.

Sehe ich den Wald vor lauter Bäumen nicht ?
Zuletzt geändert von charlytango am Di 27. Apr 2021, 15:23, insgesamt 1-mal geändert.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Wiederverwendung von Code

Beitrag von Winni »

Hi!

Erzeuge eine dritte Unit ohne Formular.

Und dort progst Du ne procedure ähnlich deser:

Procedure CreateEdit (Ed: TEdit; .....);

Da kannst Du dann noch diverse Parameter zu Initiaslisierung der TEdit-Compo hinzufügen.

Und diese Procedure rufst Du dann von Unit1 oder Unit2 auf.

Winni

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Wiederverwendung von Code

Beitrag von charlytango »

Winni hat geschrieben:
So 25. Apr 2021, 20:42
Erzeuge eine dritte Unit ohne Formular.
Und dort progst Du ne procedure ähnlich deser:

Procedure CreateEdit (Ed: TEdit; .....);

Da kannst Du dann noch diverse Parameter zu Initiaslisierung der TEdit-Compo hinzufügen.
Und diese Procedure rufst Du dann von Unit1 oder Unit2 auf.
genau das hab ich ja versucht...

nur das Zuweisen der Eventprozeduren

Code: Alles auswählen

OnExit:=@GetData_Edit; 
die auf andere Variablen zugreifen hab ich nciht hinbekommen.

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: Wiederverwendung von Code

Beitrag von aro »

Hallo,

Wenn ich das richtig verstanden habe, möchtest Du , das in einem anderen Formular TEdit.Create aufgerufen wird, das {$INCLUDE controlpos.inc}, Text := FoSett usw.
ausgeführt wird.

Wenn das Dein Problem ist, dann musst Du ein neues Object von TEdit ableiten: TMyEdit = class(TEdit ) ;

Dann den Constructor überschreiben :

constructor TMyEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
- dann Deine neuen Zeilen ....
end;

Für die Formulare, die diese Funktion benutzen sollen, musst Du dann TMyEdit statt TEdit verwenden.

Ich hoffe, das ich Dein Problem richtig gedeutet habe. Sonst solltest Du Dich noch mal melden.

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Wiederverwendung von Code

Beitrag von charlytango »

aro hat geschrieben:
Mo 26. Apr 2021, 12:13
Ich hoffe, das ich Dein Problem richtig gedeutet habe. Sonst solltest Du Dich noch mal melden.
In etwa ja -- hab jetztgleich nicht die Möglichkeit f ein Testprojekt, aber vielleicht hilftdas alks Verständnis weiter;

viewtopic.php?f=18&t=13604

Hab da Screenshot im Beitrag.
Derzeit liegt der ganze Code in der Form die die Controls anzeigt (frmSettingsEditor).
Im wesentlichen werden aus Daten einer Tabelle die Controls generiert. Und jedes Control bekommt eine (pro klasse) individuelle Ereignisprozedur zugewiesen welche die Daten der Tabelle zurückschreibt.

Passt und klappt auch gut.

Nun hätte ich gerne in dem PageControl eine Art Layouvorschau damit man sofort sieht welche Einstellungen was bewirken. Eigentlich ist das der gleiche Code der eben nur ein Control statt deren viele zeichnet.
Nur die Ereignisprozedur brauche ich dabei nicht da nix zurück geschrieben werden soll.

Wie stelle ich das an dass die gewünschte Funktionalität in einer eigenen Unit landet und ich sie an beiden Orten verwenden kann.

Könnte ein Objekt bauen das die Erstellung macht. Nur werden die Ereignisprozeduren nicht mehr existieren wenn das Objekt nicht (mehr) existiert.

Könnte eine Unit mit unabhängigen Funktionen bauen, aber dann muss ich jeden Mist auch an die Ereignisprozeduren übergeben. Zudem weiß ich nicht ob die Ereignisprozeduren überhaupt die zusätzlichen Parameter akzeptieren. Ich dreh mich etwas im kreis

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Wiederverwendung von Code

Beitrag von kupferstecher »

Es wäre gut, wenn du schon eine grobe Struktur deines Programms nennen könntest, dann wäre es einfacher das Problem zu verstehen und auch einfacher eine mögliche Lösung zu erklären.

Du hast also eine Unit, die auf einer bestehenden Form (z.B. Form1) dynamisch Elemente plazieren kann? Eine Möglichkeit wäre, eine eigene Klasse für die Handler zu definieren, die dann je Form überschrieben wird und beim Create-Aufruf übergeben wird. Diese Handlerklasse beinhaltet dann alle Handler, die potentiell benötigt werden, aber mit noch leeren Handlern.
Bei der Initialisierung des Programms wird dann in Form1 die Handlerklasse instantiiert und darin alle Handler überschrieben, die für die Form1 benötigt werden. Jedes Mal, wenn Elemente erzeugt werden sollen, wird das Objekt der Handlerklasse mit übergeben und die Methode zur Erzeugung der Elemente weist dann die Handler zu, die eben gebraucht werden.

Alternativ könnte man in der Klasse Funktionspointer ("Procedural Type") definieren, die dann bei der Initialisierung den entsprechenden Funktionen im Formular zugewiesen werden.

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: Wiederverwendung von Code

Beitrag von aro »

Hallo,

ich glaube nicht das der Aufwand zum Schluss Sinn macht.

Baue Dir für jede Aufgabe ein neues Formular mit allen Control's und Quelltexten. Da Siehst Du sofort ob Dir die Optik gefällt und kannst einfach testen.

Die Formulare setzt Du auf nicht automatisch erstellen. Je nach Bedarf erzeugst Du das richtige Formular, zeigst es an und gibst es wieder frei.

Für ähnliche Aufgaben Kannst Du ein Formular als Vorlage verwenden.

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Wiederverwendung von Code

Beitrag von charlytango »

Manchmal sieht man den Wald sprichwörtlich vor lauter Bäumen nicht.

Ich habe jetzt einfach ein leeres Form als Vorgänger für beide Verwendungszwecke gebaut. Von diesem Formular hab ich beide Nachfolgeformulare abgeleitet (dank der Lazarus-Programmierer reichte da da das Ersetzen von TForm

Code: Alles auswählen

type
  TfrmSettingsManager = class(TForm)  

durch meinen neu erstellten Vorgänger

Code: Alles auswählen

type
  TfrmSettingsManager = class(TfrmCustomCreateControl_parent) 

und einmal neu durchkompilieren.
Ich kämpfe noch etwas mit der Sichtbarkeit der verwendeten Variablen und Funktionen, denn ich versuche die Klassen halt in sich geschlossen zu halten und nur das nötigste nach außen frei zu geben.

Im Vorgänger befinden sich keine Controls auf dem Formular, da sind "nur" die Funktionen um die gewünschten Controls dynamisch zu erzeugen und einige Hilfsfunktionen auf die im abgeleiteten Formular bequem zugegriffen werden kann. Angenehmer Nebeneffekt ist die Trennung von Code und bessere Übersichtlihkeit.
aro hat geschrieben:
Di 27. Apr 2021, 14:26
ich glaube nicht das der Aufwand zum Schluss Sinn macht.

Baue Dir für jede Aufgabe ein neues Formular mit allen Control's und Quelltexten. Da Siehst Du sofort ob Dir die Optik gefällt und kannst einfach testen.
Hm.. die 20 Minuten um den Vorgänger (aus bestehendem Code) zu bauen und einzuhängen wars allemal wert.

THX - This Case closed - more to come ;)

Antworten