Units zusammenführen

Für Dinge zum Forum, Kritik, Verbesserungsvorschläge, Umfragen und ähnliches.
Antworten
Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Units zusammenführen

Beitrag von Joachim Raap »

Hallo, Ich bin "neu" mit Lazarus unterwegs und mit dem Forum - schlimmer geht es wohl nicht.
Nun habe ich ein paar kleine Units geschrieben und möchte die nun in einem Programm zusammenfassen. Die Units selbst kann ich durch "öffnen" im Programm aufnehmen - nur wird das zur Unit gehörende Formular nicht mitgenommen. Wie geht das denn? Kann jemand helfen?
Gruß und Danke

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Units zusammenführen

Beitrag von Mathias »

Sind deine Units unter uses gelistet ?

Befindet sich ganz zu oberst von deinem Hauptform.

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, EditBtn, FileUtil,   
  deineUnit1, deineUnit2;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Units zusammenführen

Beitrag von MacWomble »

Hallo, da sollte man schon etwas genauer wissen, was du bisher hast, bzw. wie du die Units und Forms erstellt hast.
Units können zu einem Projekt zusammengefasst werden.

Die Unit muss Kenntniss von der 'Form' haben. Dies geschieht normalerweise durch den Eintrag von

{$R *.lfm}

unterhalb von 'Implementation'. Die Form hat den selben Dateinamen wie die Unit, aber mit der Dateiendung '.lfm'.
(also z.B. 'test.pas' für die Unit und für die Form dann 'test.lfm').
In Lazarus kann man mit F12 zwischen Unit und Form wechseln, wenn alles richtig gemacht wurde.

Eventuell hilft dir das schon etwas weiter.

Der Tipp von Mathias ist nur dann richtig, wenn es sich um andere Form-Units handelt (Nicht zu dieser Unit gehörend). Bei der zur Form gehörenden Unit wäre das so nicht richtig.
(Ein 'Sorry' in die Schweiz wegen meiner Klugschei..erei :oops: )
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Units zusammenführen

Beitrag von Joachim Raap »

Vielen Dank erst einmal für die Antworten. Ich bin sehr froh, daß es "Antworten" sind und nicht etwa "schau in der Suchfunktion - hatten wir schon 1000 mal beantwortet" (oder so ähnlich)
Tja, was habe ich gemacht? eigentlich nur eine Unit geschrieben z.B. für ein LogIn. Das Formular "Form1" kam automatisch dazu und ich habe es dann auch entsprechend mit Editfeldern und Labels gestaltet.
In einer weiteren Unit ist z.B. ein Menü enthalten (TMainMenü) und in einer z.B. dritten Unit (mit dazugehörenden Formular) soll dann der erste Menüpunkt behandelt werden.....
Wie gesagt - die Units kann ich zusammenfassen bekomme aber die Formulare nicht dazu (die Uses habe ich aktualisiert)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Units zusammenführen

Beitrag von af0815 »

Man fasst auch units mit verschiedenen visuellen Elementen im normalfall nicht zusammen. Die IDE (Lazarus) verwaltet eine visuell editierbare Komponente pro unit. ZB. kann man mehre Forms nicht zu einer Unit zusammenfassen.
Muss man auch nicht, das Loginformular kann jederzeit vom Hauptformular aufgerufen werden und auch von diesen erzeugt bzw. zerstört werden. Das dritte Formular kann auch vom Hauptformular gesteuert werden, die Lebenszeit dieses Formular kann man je nach den Erfordernissen anpassen. Dazu gibt es unter den Projektoptionen den Bereich Forms. Dort kann man sagen ob die Formulare automatisch beim Programmstart oder selbst erzeugt werden. Das Formular das unter Auto-Create ganz oben steht ist das Hauptformular, dem beim Start die Kontrolle übergeben wird.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Units zusammenführen

Beitrag von kupferstecher »

@TE: Du meinst aber nicht, wie man das zur Unit passende Formular anzeigt? Das wäre mit der F12-Taste während die zugehörige Unit im Editor geöffnet ist.

Schau mal nach dem Projektinspektor (Menü Projekt -> Projektinspektor). Dort sollte die Unit eingetragen werden. Außerdem muss nicht nur die Unit-Datei am richtigen Ort (z.B. Projektordner) sein, sondern auch die passende Formulardatei (.lfm). Wenn die Dateien an einem anderen Ort liegen, kann der Ort über die Projektoptionen unter "Pfade" eingetragen werden.

Also ganz einfach:
Unit und Formulardatei in das Projektverzeichnis kopieren.
Im Projektinspektor die Unit hinzufügen.
Ein Doppelklick im Projektinspektor öffnet die Unit im Editorfenster.
Dann F12 drücken und das Formular wird angezeigt.

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Units zusammenführen

Beitrag von Joachim Raap »

.........habe ich noch nicht wirklich verstanden.
Muß ich erst mal versuchen nachzuvollziehen. Danke erst mal! :shock:

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Units zusammenführen

Beitrag von fliegermichl »

Joachim Raap hat geschrieben:.........habe ich noch nicht wirklich verstanden.
Muß ich erst mal versuchen nachzuvollziehen. Danke erst mal! :shock:


Jedes Formular hat seine eigene Unit.
Das Programm hat ein Hauptformular (Application.MainForm).

Welches das Hauptformular ist, wird festgelegt unter Projekt -> Projekteinstellungen -> Formulare. Das erste Formular, daß in der Liste der automatisch erzeugten Formulare steht ist dieses Hauptformular.

Wenn man ein anderes Formular anzeigen will, so kann man daß z.B. in einem OnClick EventHandler eines Buttons machen, indem man folgenden Code ausführt:

Code: Alles auswählen

 
procedure TMainForm.Button1Click(Sender: TObject);
// Für Fall 2 (siehe unten)
var
 aForm : TForm2;
begin
 // Für den Fall, daß das Formular automatisch erzeugt wurde (was ich eigentlich nicht empfehle)
 Form2.Show();
 
 // Für den 2. Fall, daß das Formular nicht automatisch erzeugt wurde, muss dieses zuerst erzeugt werden.
 // dafür muß die unit des zweiten Formulares hinter dem implementation keyword in der Unit des Hauptformulares eingebunden werden mit "uses unit2;"
 aForm := TForm2.Create(Application); // Formular 2 erzeugen und die Application als Owner übergeben. Dadurch wird es automatisch wieder frei gegeben
 aForm.Show();
 // oder
 aForm.Visible := True;
 // oder wenn das Formular Modal sein soll (also sozusagen als einziges im Vordergrund stehender Dialog sein soll)
 aForm.ShowModal();
end;
 

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Units zusammenführen

Beitrag von Mathias »

Die Idee finde ich nicnt so gut. Bei jedem Buttonclick wird ein neues Form erzeugt.
Ich würde es nach Showmodal wieder zerstörren.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Units zusammenführen

Beitrag von fliegermichl »

Mathias hat geschrieben:Die Idee finde ich nicnt so gut. Bei jedem Buttonclick wird ein neues Form erzeugt.
Ich würde es nach Showmodal wieder zerstörren.


Man kann ja auch die vorgefertigte Variable Form2 verwenden.

Code: Alles auswählen

 
procedure TForm1.Button1Click(Sender : TObject);
begin
 if not Assigned(Form2) then Form2 := TForm2.Create(Application);
 form2.Show();
end;
 


[Edit]
Im Fall von ShowModal gebe ich dir Recht. Da sollte dann nach ShowModal aForm.Free aufgerufen werden.

Antworten