Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Programmteile in extra Unit auslagern (https://www.delphipraxis.net/42117-programmteile-extra-unit-auslagern.html)

padavan 14. Mär 2005 07:45


Programmteile in extra Unit auslagern
 
Hallo Leute, habe eine Frage bzgl. Unit - Einbindung.

Ich bin dabei ein Programm zu schreiben, bei dem vom Hauptformular aus auch noch weitere Formulare zur Laufzeit erzeugt werden können und Parameter zwischen diesen Fenstern übergeben werden. So weit so gut, das geht auch.
ABER:
Ich habe es bisher nicht geschafft, einen Programmteil in eine Unit ohne Formular auszulagern. (Der Sinn und Zweck einen Programmteil auszulagern soll einfach darin liegen, dass ich Quelltext aus dem Hauptunit rausbekomme um Übersicht im Programm zu schaffen.)
Ich scheitere aber immer daran, dass in der ausgelagerten Unit die Komponenten des Hauptformulars und/oder auch die Variablen des Hauptformulars nicht definiert sind.
Also hab ich mir versucht in der OH anzuschauen, wo und wie ich die Variablen deklarieren muss, damit das "gesamte Programm" die Variablen kennt. Da stolpert man über den Interface Abschnitt oder über den Public Abschnitt.

Habe
1. die Unit_extern in der Uses-Klausel in der Unit1 eingebunden
2. die Unit1 in der Unit_extern eingebunden
3. Variablen die Global sein sollen in Unit1 unter Public deklariert

Trotzdem geht´s net. :wall:

jfheins 14. Mär 2005 08:10

Re: Programmteile in extra Unit auslagern
 
Delphi-Quellcode:
Unit.Variablenname
oder
Delphi-Quellcode:
Form.Variablenname
... :zwinker:

kalmi01 14. Mär 2005 08:22

Re: Programmteile in extra Unit auslagern
 
Hi

Delphi-Quellcode:
unit uMain;
{$I myDebug.pas}

  interface
    uses
      Windows, Messages, Dialogs, SysUtils, Forms, StdCtrls, Classes, Controls, ExtCtrls,
      StShlCtl, SRChkBox, ovcbase, ovcmeter, LEDPaint, dynForm;

    type
      TMain = class(TForm)
......
    end;

    var
      Main       : TMain;
      SavCursor  : TCursor;

  implementation
    {$R *.dfm}

    uses
      uUtil;  <=== das brauchst Du !!!
Dann Aufruf z.B.:
Delphi-Quellcode:
uUtil.Demo := true;

uUtil.machwas(SavCursor);
Willst Du in der ausgelagerten Unit auf Variablen von Main zugreifen, musst Du entweder die Main-Unit in der ausgelagerten als "uses" deklarieren, oder mit
Delphi-Quellcode:
procedure test (var value : irgendwas);
arbeiten und die Werte "public" übergeben und zurückholen.

roderich 14. Mär 2005 09:05

Re: Programmteile in extra Unit auslagern
 
Hi padavan,

wenn du Quellcode aus einer Formular-Unit in eine Extra-Unit auslagerst, dort aber wieder auf Formular-Komponenten aus der ersten Unit zugreifen mußt......dann stimmt irgendwas mit deinem Konzept nicht. Übersichtlicher wird dadurch gar nichts und du bekommst auch noch zirkuläre Referenzen (was zwar compilierbar ist, solange nicht in beiden Units im Interface, aber unsauber). Außerdem ist es dann mit sauberer Objektorientierung vorbei, sobald du nämlich mehr als eine Instanz deines Formulars hast, geht das Ganze in die Hose.

Stattdessen würde ich in die Extra-Unit nur allgemeine Routinen auslagern und entsprechend Variablen im Prozedurkopf deklarieren.

also statt
Delphi-Quellcode:
procedure DoIt;
begin
  MyMainForm.ListBox.Add(.....);
end;
lieber

Delphi-Quellcode:
procedure DoIt(aListBox: TListBox);
begin
  aListBox.Add(.....);
end;

Roderich

DymonD 14. Mär 2005 09:34

Re: Programmteile in extra Unit auslagern
 
Wenn du nur Funktionen/Prozeduren hast, dann kanst du die doch einfach in eine Unit auslagern, die bindest du dann hier ein:
Delphi-Quellcode:
interface
    uses
      Windows, Messages, ..., DeineUnit;
Vorteil: Du kannst aber auch häufig verwendete Funktionen da mit einbinden, die du normalerweise selbst immer neu hättest coden müssen ;-)

padavan 14. Mär 2005 09:52

Re: Programmteile in extra Unit auslagern
 
Hallo Roderich,

naja, es ging mir eigentlich darum Quellcode aus der Hauptform rauszunehmen, nicht aus zusätzlichen Formularen, die sind ja dann schon extra und "sauber", allerdings triffts DymonD recht gut mit seinem Vorschlag. Genauso in der Art hätte ich mir das vorgestellt. Eine Procedure welche sehr Textintensiv ist einfach aus der Unit1 rausnehmen --> aus übersichtlichkeit eben.
Diese Variante werde ich gleich mal versuchen umzusetzten...

Vielen Dank für jede Hilfe!!!

padavan 14. Mär 2005 10:17

Re: Programmteile in extra Unit auslagern
 
Hmm, muss noch mal nerven,

habe jetzt die Procedure in eine andere Unit ausgelagert
Delphi-Quellcode:
unit Unit_Sprache;

interface

implementation


var Variablename: integer;
begin

//  Anweisung......

end;

end.
und diese Unit folgendermaßen deklariert
Delphi-Quellcode:
interface


     
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, inifiles, StdCtrls, ExtCtrls, Unit_Sprache;
Aber wie spreche ich nun diese procedure in der ausgelagerten Unit an?
Habe es mit Unit_Sprache.? "und genau das hängts schon" versucht. :gruebel:

Bin für jede Hilfe dankbar.

Padavan

DymonD 14. Mär 2005 19:58

Re: Programmteile in extra Unit auslagern
 
Du musst das wie jede "normale" Prozedur auch deklarieren:
Delphi-Quellcode:
procedure Addiere(zahl1, zahl2: integer): integer;
begin
  // Mache was...
end;
Das Ganze aufrufen dann mit
Delphi-Quellcode:
c := Addiere(a, b);
Eigentlich einfach :mrgreen:
Das ist ja in dem Moment genauso, wie
Delphi-Quellcode:
StrToInt(Edit2.Text);
Diese Prozedur ist ja nicht anders definiert ;-)

schöni 15. Mär 2005 00:05

Re: Programmteile in extra Unit auslagern
 
Delphi-Quellcode:
unit Unit_Sprache;

interface

implementation


var Variablename: integer;
begin

//  Anweisung......

end;

end.
Zwischen der Variablenvereinbarung "Variablenname" und dem "Begin End" muß "procedure" stehen,
so hier:

Delphi-Quellcode:
var Variablename: integer;
PROCEDURE DeineProzedur;
begin

//  Anweisung......
  Variablenname := 1;

end;
schöni

padavan 15. Mär 2005 05:55

Re: Programmteile in extra Unit auslagern
 
So langsam bin ich depremiert, scheinbar habe ich noch irgendwie ein Verständnisproblem.

Wenn ich die "externe" Unit in die Unit1 einbinde (und das habe ich jeweils im Interface sowohl als auch im Implementation Abschnitt versucht), dann bin ich trotzdem nicht in der Lage, eine Procedure in der "externen" Unit aufzurufen.


Habe die Korrektur von schöni auch schon mit drin.

Dennoch meckert Delphi beim Übersetzen, da es die Procedure von der externen Unit in der Unit1 nicht kennt. Die Variablen aus der Unit1 sind allerdings in der externen Unit bekannt, das klappt wenigstens schonmal.

Was allerdings auch nocht nicht funktioniert ist, wenn ich in der externen Unit auf Komponenten des Hauptformulars zugreifen will, dass er diese dann auch wieder nicht kennt. :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 Uhr.
Seite 1 von 2  1 2      

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