![]() |
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: |
Re: Programmteile in extra Unit auslagern
Delphi-Quellcode:
oder
Unit.Variablenname
Delphi-Quellcode:
... :zwinker:
Form.Variablenname
|
Re: Programmteile in extra Unit auslagern
Hi
Delphi-Quellcode:
Dann Aufruf z.B.:
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 !!!
Delphi-Quellcode:
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
uUtil.Demo := true;
uUtil.machwas(SavCursor);
Delphi-Quellcode:
arbeiten und die Werte "public" übergeben und zurückholen.
procedure test (var value : irgendwas);
|
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:
lieber
procedure DoIt;
begin MyMainForm.ListBox.Add(.....); end;
Delphi-Quellcode:
procedure DoIt(aListBox: TListBox);
begin aListBox.Add(.....); end; Roderich |
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:
Vorteil: Du kannst aber auch häufig verwendete Funktionen da mit einbinden, die du normalerweise selbst immer neu hättest coden müssen ;-)
interface
uses Windows, Messages, ..., DeineUnit; |
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!!! |
Re: Programmteile in extra Unit auslagern
Hmm, muss noch mal nerven,
habe jetzt die Procedure in eine andere Unit ausgelagert
Delphi-Quellcode:
und diese Unit folgendermaßen deklariert
unit Unit_Sprache;
interface implementation var Variablename: integer; begin // Anweisung...... end; end.
Delphi-Quellcode:
Aber wie spreche ich nun diese procedure in der ausgelagerten Unit an?
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, inifiles, StdCtrls, ExtCtrls, Unit_Sprache; Habe es mit Unit_Sprache.? "und genau das hängts schon" versucht. :gruebel: Bin für jede Hilfe dankbar. Padavan |
Re: Programmteile in extra Unit auslagern
Du musst das wie jede "normale" Prozedur auch deklarieren:
Delphi-Quellcode:
Das Ganze aufrufen dann mit
procedure Addiere(zahl1, zahl2: integer): integer;
begin // Mache was... end;
Delphi-Quellcode:
Eigentlich einfach :mrgreen:
c := Addiere(a, b);
Das ist ja in dem Moment genauso, wie
Delphi-Quellcode:
Diese Prozedur ist ja nicht anders definiert ;-)
StrToInt(Edit2.Text);
|
Re: Programmteile in extra Unit auslagern
Delphi-Quellcode:
Zwischen der Variablenvereinbarung "Variablenname" und dem "Begin End" muß "procedure" stehen,
unit Unit_Sprache;
interface implementation var Variablename: integer; begin // Anweisung...... end; end. so hier:
Delphi-Quellcode:
schöni
var Variablename: integer;
PROCEDURE DeineProzedur; begin // Anweisung...... Variablenname := 1; end; |
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: |
Re: Programmteile in extra Unit auslagern
Der Prozedurkopf muss auch im Interface-Teil der Unit stehen:
Delphi-Quellcode:
Nur was im Interface-Teil drin steht, kann auch von aussen genutzt werden. Alles andere ist nur in der Unit verfügbar.
unit Unit_Sprache;
interface function Addiere(a,b: Integer): Integer; implementation var Variablename: integer; function Addiere(a,b: Integer): Integer; begin result:=a+b; end; end. |
Re: Programmteile in extra Unit auslagern
Hai padavan,
hier mal der Code für ein Formular und eine externe Unit (Unit2). Das sollte die depresion verhindern ;-)
Delphi-Quellcode:
unit Unit2;
interface // Hier werden die Funktionen nach aussen bekannt gemacht function AddZahlen (value1, value2 : Real) : Real; procedure MacheEtwas (var ergebniss : Real ; value1, value2 : String); implementation uses SysUtils; function AddZahlen (value1,value2 : Real) : Real; begin result := value1 + value2; end; procedure MacheEtwas (var ergebniss : Real ; value1, value2 : String); var r1, r2 : Real; begin r1 := StrToFloat(value1); r2 := StrToFloat(value2); ergebniss := r1 + r2; end; end.
Delphi-Quellcode:
[Edit] :cry:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation uses Unit2; // Unit mit den Funktionen einbinden {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var test1 : Real; begin test1 := AddZahlen(45.2,6.6); ShowMessage (FloatToStr (test1)); end; procedure TForm1.Button2Click(Sender: TObject); var test2 : Real; begin MacheEtwas(test2,'45,2','6,6'); ShowMessage (FloatToStr (test2)); end; end. Jetzt habe ich so schön getippelt und jim_raynor war schneller. |
Re: Programmteile in extra Unit auslagern
He Sharky, :hi:
trotzdem war´s nicht umsonst, den ein Delphi-Padavan wie ich ist froh über jede Info....!!! kennt ihr das: man glaubt man hat es und freut sich wie ein Kind und dann......die Ernüchterung. Denn: dank eurer Hilfe kann ich jetzt die Procedure in der "externen" Unit ansprechen, ABER: in dieser Procedure ist es nicht möglich an die Form1 zu gelangen:
Delphi-Quellcode:
bei Form1. gibt´s gemecker von Delphi, da er die Form1 nicht kennt.
procedure test;
var Variable: integer; begin Form1.height := 200; //Beispiel end; Nun hab ich versucht die Unit1 bei Uses der externen Unit einzubinden, hat aber nicht geholfen. Es gab die Meldung, "Unit1.dcu nicht gefunden" :wiejetzt: |
Re: Programmteile in extra Unit auslagern
Hai padavan,
trage die Unit1 mal nach implementation in der Unit2 ein.
Delphi-Quellcode:
Unit Unit2;
. . implementation Uses Unit1; . . |
Re: Programmteile in extra Unit auslagern
Eine ganz "brutale Methode ist {$INCLUDE ...}
Damit kann man einen Teil der Unit direkt in eine andere Datei auslagern. (damit ist es sogar Möglich Teile, die sonst nicht auslagerbar sind, dennoch auszulagern) Ich hab da ein Programm, mit einigen hundert Ereignisprozeduren, welche ja so nicht auslagerungsfähig sind - aber damit ging es dennoch und ich hatte auch etwas mehr übersicht. Und da so der ausgelagerte Teil dennoch Teil der Unit ist, gibt es auch keine Probleme mit Veriablen ...
Delphi-Quellcode:
// Unit1.pas
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} {$INCLUDE UnitX.inc} end.
Delphi-Quellcode:
// UnitX.inc
procedure TForm1.Button1Click(Sender: TObject); begin ... end; procedure TForm1.Button2Click(Sender: TObject); begin ... end; |
Re: Programmteile in extra Unit auslagern
Zitat:
Delphi-Quellcode:
Die Idee von himitsu ist auch interessant werde ich auch mal bei Gelegenheit probieren, allerdings würde ich´s gern erstmal auf "normalem" Wege hinbekommen, da ich die Zusammenhänge noch nicht ganz verinnerlicht habe... :oops:
unit Unit_Sprache;
interface procedure Sprachzuweisung1; implementation uses Unit1; // Fehler Unit1.dcu nicht gefunden procedure...... |
Re: Programmteile in extra Unit auslagern
Klar, der "normale" Weg ist besser, voallem weil man da ja eine "richtige" Unit erhällt, während bei include nur Teile in 'ner Datei rumliegen :)
|
Re: Programmteile in extra Unit auslagern
Ach mann, da hab ich mir am Schluss noch selbst ein Ei gelegt, Sharky hatte natürlich recht: Einfach die Unit1 in den Implementation Abschnitt rein und dann funzt´s.
Also nochmal vielen Dank an alle Padavan :witch: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:57 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 by Thomas Breitkreuz